While cyklus – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

While cyklus – Python – Fórum – Programujte.comWhile cyklus – Python – Fórum – Programujte.com

 

Ludek
~ Anonymní uživatel
5 příspěvků
2. 4. 2022   #1
-
0
-

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.:

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 njecistsi reseni. Udelal jsem to tedy pres list takto:

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.

Nahlásit jako SPAM
IP: 37.188.255.–
JerryM0
Věrný člen
2. 4. 2022   #2
-
0
-

já teda Python vubec neumim ale .. koukám že ty taky ne :)

https://naucse.python.cz/lessons/beginners/while/

nemělo by to bejt náhodou takhle ?

def fce_01():
    if neco == neco:
    run = False
    return 0


def fce_02():
    while run:
       fce()
    return 0

protože chápeš jo ? ... nemužeš volat fce() z cyklu fce() tomu se řiká rekurze a to ti asi opravdu fungovat nebude

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:b05c:35b1:5281:3206...–
JerryM0
Věrný člen
2. 4. 2022   #3
-
0
-

#2 JerryM
pardon správně to má bejt

def fce_01():
    if neco == neco:
    run = False
    return 0


def fce_02():
    while run:
       fce_01()
    return 0
Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:b05c:35b1:5281:3206...–
gna
~ Anonymní uživatel
1891 příspěvků
2. 4. 2022   #4
-
0
-

Ve výsledku v obou případech používáš globální proměnnou, což je to čemu je dobré se vyhnout.

Pravděpodobně to půjde přesat třeba tímhle stylem:

while item := get_data():
    doX(item)
    doY(item)


for item in get_data():
    doX(item)
    doY(item)

Popiš víc, co konkrétně chceš dělat, pak se dá konkrétněji poradit.

Nahlásit jako SPAM
IP: 213.211.51.–
Ludek
~ Anonymní uživatel
5 příspěvků
2. 4. 2022   #5
-
0
-

Jen jeste uvedu, ze nejsem student, ani se programopvanim nezivim (coz je ale asi z dotazu patrne :) ). 

Jedna se cas kodu ze hry piskvory (hraci plocha ma ale jen 3x3 pole):

run = [True]

def kontrola_radku():
    for i in range(3):
        if hraci_plocha[i].count("X") == 3:
            print("""vyhral hrac "X" """)
            run[0] = False
        if hraci_plocha[i].count("O") == 3:
            print("""vyhral hrac "O" """)
            run[0] = False

while run[0]:
    hrac1 = int(input("""Hrac "O", zadej cislo tahu: """))
    zapis(hrac1, "O")
    hrac2 = int(input("""Hrac "X", zadej cislo tahu: """))
    zapis(hrac2, "X")
    for i in hraci_plocha:
        print(" ".join(i))
    kontrola_radku()
    kontrola_sloupce()
    kontrola_diagonaly()

Jde mi to o to, ze pokud je ve funkci kontrola_radku() splnena podminka, ze hrac ma 3 znaky v  radku tak, aby se while cyklus ukoncil.

Tak jak to je napsane to bez problemu funguje. Jen by me zajimalo, jak by se to spravne melo delat, ci jinak receno co je best practice.

Nahlásit jako SPAM
IP: 37.188.255.–
gna
~ Anonymní uživatel
1891 příspěvků
2. 4. 2022   #6
-
0
-

Tak teď máš globální úplně všechno tak na jedné proměnné asi nesejde. Každopádně nemá smysl, aby ta funkce svůj výsledek někam ukládala misto, aby ho prostě vrátla returnem.

def kontrola_radku(hraci_plocha):
    for i in range(3):
        if hraci_plocha[i].count("X") == 3:
            return "X"
        if hraci_plocha[i].count("O") == 3:
            return "O"


def kontrola(hraci_plocha):
    return (
        kontrola_radku(hraci_plocha)
        or kontrola_sloupce(hraci_plocha)
        or kontrola_diagonaly(hraci_plocha)
    )


def main():
    hraci_plocha = ...

    while not (vitez := kontrola(hraci_plocha)):
        # takhle je trochu blbé, že to udělá první kontrolu, i když ještě není co kontrolovat, ale na tom nesejde
        # ...

    print("vyhrál", vitez)


if __name__ == "__main__":
    main()
Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
4014 příspěvků
4. 4. 2022   #7
-
0
-

u toho radku by to slo spojit do strigu 

str = hraci_plocha[i].join()
if str='xxx' return 'x'
if str='ooo' return 'o'

// a stejnou metodu by pak slo pouzit i na ostatni
str = hraci_plocha[0][0] + hraci_plocha[1][1] + hraci_plocha[2][2]
if str='xxx' return 'x'
if str='ooo' return 'o'
Nahlásit jako SPAM
IP: 2001:718:2601:258:80ea:761d:ae39:8ab0...–
peter
~ Anonymní uživatel
4014 příspěvků
4. 4. 2022   #8
-
0
-

   

str=='xxx' // dve rovnitka, samozrejme
Nahlásit jako SPAM
IP: 2001:718:2601:258:80ea:761d:ae39:8ab0...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 17 hostů

Podobná vlákna

Cyklus — založil Jan Burant

Cyklus for — založil shockwave

Cyklus — založil JerryM

Cyklus Do While — založil Filips

Cyklus while v C — založil Marek

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý