Python - rizeni while cyklu

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod volponi 2. 4. 2022 08:45

Ahoj, chtel bych se zeptat jak nejlepe ridit while cyklus zevnitr fuknce. Mam tedy podminku ktera ridi while cyklus. V tom cyklu spoustim funkci a podle toho co ve funcki nastane bych potreboval podminku zmenit na False. Napr.:
Kód: Vybrat vše
run = True

def fce():
   if neco == neco:
      run = False

while run:
   fce()

Vzhledem k tomu, ze run je mimo funkci, tak se mi cyklus neukonci. Slo by to udelat pres global, ale to tedy zase pry neni uplne nejcistsi reseni. Udelal jsem to tedy pres list takto:
Kód: Vybrat vše
run = [True]

def fce():
   if neco == neco:
      run[0] = False

while run:
   fce()

Coz tedy funguje, ale chtel bych se zeptat jestli to tak je OK, nebo jake by bylo nejlepsi reseni.

Diky.
volponi
Kolemjdoucí

Odeslat příspěvekod JirkaVejrazka 2. 4. 2022 11:03

nastuduj si prikazy "break" a "continue", budou se ti hodit.

A pokud NUTNE potrebujes ukoncovat cyklus zevnitr vnorene funkce,tak asi nejlepe vyjimkami.

EDIT: Ted jsem se na to podival cerstvyma ocima a reseni je jednoduche - tvoje funkce proste vrati navratovou hodnotu a podle ni se rozhodnes, jestli ma cyklus while pokracovat. To reseni s promennou v seznamu je dost prasarna.
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod Acer1968 11. 4. 2022 00:57

Kód: Vybrat vše
import random
run = True
answers = ["YES", "NO"]

def next_run(something):
  pass # udělej tady cokoli
  if something == "YES":
    return True
  else:
    return False

while run:
  print("Jedu kolecko")
  new_something = random.choice(answers)
  run = next_run(new_something) # když se new_something náhodně vybere jako YES, vrátí funkce True a jede další cyklus, jinak se cyklus ukončí
Acer1968
Kolemjdoucí

Odeslat příspěvekod JirkaVejrazka 11. 4. 2022 05:38

Tu funkci muzes zkratit:
Kód: Vybrat vše
return something == 'YES'
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod Acer1968 11. 4. 2022 08:22

Tak samozřejmě, mě spíš šlo o to, aby tazateli došlo, že v té funkci může dělat spoustu dalších užitečných věcí (proto ten pass) a že se v rámci té funkce nějak vypořádá rozhodováním o tom, jestli má smysl rozjet další kolečko či nikoli. Protože, popravdě, pokud v té funkci nebude tuna nějakého dalšího kódu, který něco dělá, nemá smysl to rozhodování o dalším kolečku cpát do funkce, ale může to rozhodnout jedním jediným řádkem přímo na konci cyklu while...
A taky jsem mu chtěl zdůraznit, jak správně píšeš, že použití globální proměnné, natož v tom listu, je opravdu nesmysl, takže parametr do funkce a návratová hodnota jsou v takovém případě to čisté řešení...
Acer1968
Kolemjdoucí


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků