IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – 10. diel - Cyklus while v Pythone

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Jaroslav Jančár:9.12.2023 11:12

Ahoj všem 🖖
měl jsem tvořivou múzu 😃
😉 použil jsem while i for a další ...

print("Vítejte na trhu v rybím stánku")
pokracovat = "ano"

while (pokracovat == "ano"):
    ryba = "<´)),><´ "
    print("Kolik ryb chcete?")
    pocet_ryb = int(input())
    print(f"Tady máte svých {pocet_ryb} čerstvých ryb, děkujeme vám za nákup u nás.")
    for i in range(pocet_ryb):
        print(ryba, end=" ")
    print("\nTěšíme se na další návštěvu."
          "\nDalší zákazník? [ano/ne]")
    pokracovat = input()
    pokracovat.lower()

print("... stánek má tedy pauzu.")
Odpovedať
9.12.2023 11:12
ThinkPad L450 // Windows 11 // IntelliJ IDEA 2024.2.1 (Community Edition)
Avatar
Karel Zaoral
Člen IT Redactor Gang
Avatar
Odpovedá na Jaroslav Jančár
Karel Zaoral:9.12.2023 15:47

Ahoj, dobrá práce. Když budeš chtít, můžeš to ještě vylepšit správným tvarem "svých":
1 ryba - svou čerstvou rybu
2-4 ryby - své x čerstvé ryby
více ryb - svých x čerstvých ryb.
Podívej se do lekce 8 a případně i trochu dopředu do lekce 15.
Najdeš tam všechny potřebné nástroje.
Ať se daří!

Editované 9.12.2023 15:48
 
Odpovedať
9.12.2023 15:47
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Jaroslav Jančár
DarkCoder:9.12.2023 16:19

Řádek:

ryba = "<´)),><´ "

by bylo lepší dát před cyklus. Podoba ryby se nemění, není tedy důvod přepisovat proměnnou v každé iteraci cyklu while a zpomalovat tak běh programu. Zde to tak důležité není, ale v jiných situacích to může být důležité.

Dále si můžeš vyzkoušet variantu, než v cyklu volat několikrát funkci print(), měnit řetězec s rybami a vypsat jej jedním voláním funkce print(). A zodpovědět si otázku, zda-li bude tato varianta efektivní než ta co mám a proč.

Odpovedať
9.12.2023 16:19
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Jaroslav Jančár
DarkCoder:9.12.2023 16:59

Vytvoření řetězce s rybami

ryby_v_retezci = ryba * pocet_ryb  # Vytvoření řetězce s opakovanou rybou
print(ryby_v_retezci)

Ještě dodatek k pokračování. Převod na malá písmena nemáš správně. Při řetezci "ano", které není celé tvořeno malými písmeny, se Ti cyklus while neukončí.

Místo úryvku kódu:

pokracovat = input()
pokracovat.lower()

je třeba psát:

pokracovat = input().lower()
Odpovedať
9.12.2023 16:59
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá na Karel Zaoral
Jaroslav Jančár:10.12.2023 10:40

Děkuji za reakci 😊 podařilo se,
námět vylepšení jsem realizoval.
Děkuji také členovi DarkCoder za rady,
ty jsem také realizoval.
Přidal jsem ještě tabulátor do vzoru ryby, myslím že to vypadá lépe 😉

print("Vítejte na trhu v rybím stánku")
pokracovat = "ano"
while pokracovat == "ano":
    ryba = "\t<´)),><´ "
    print("Kolik ryb chcete?")
    pocet_ryb = int(input())

    pocet_ryb_sklonovani = ""
    if pocet_ryb == 1:
        pocet_ryb_sklonovani = "svou čerstvou rybu"
    elif pocet_ryb >= 2 and pocet_ryb <= 4:
        pocet_ryb_sklonovani = f"své {pocet_ryb} čerstvé ryby"
    else:
        pocet_ryb_sklonovani = f"svých {pocet_ryb} čerstvých ryb"

    print(f"Tady máte {pocet_ryb_sklonovani}, děkujeme vám za nákup u nás."
          "\n", ryba * pocet_ryb,
          "\nTěšíme se na další návštěvu.")

    print("\nDalší zákazník? [ano/ne]")
    pokracovat = input().lower()

print("... stánek má tedy pauzu.")
Odpovedať
10.12.2023 10:40
ThinkPad L450 // Windows 11 // IntelliJ IDEA 2024.2.1 (Community Edition)
Avatar
Karel Zaoral
Člen IT Redactor Gang
Avatar
Odpovedá na Jaroslav Jančár
Karel Zaoral:10.12.2023 19:58

Ahoj, hodně předbíhám, ale když tě to baví, tak proč si trochu nenadběhnout směrem dopředu. Takto by měl tvůj kód vypadat na konci kurzu základů - je tam třeba vyřešit mezní případy zadání (o ryb nebo záporné číslo), oddělit vhodné části kódu do samostatných funkcí a upravit podmínky a vstupy. Zkus si ho prostudovat :-) Jestli máš pocit, že původně jednoduchá hříčka dost nakynula, tak máš naprostou pravdu :-D Jezevčík bývá zakopaný téměř vždy v ošetření mezních stavů. Protože když uživateli beztrestně umožníš nakoupit mínus tři ryby, vždycky se najde aspoň jeden, který to udělá. Tím kód "kyne" :-D

# Funkce pro formátování počtu ryb podle českých skloňovacích pravidel
def formatuj_pocet_ryb(pocet):
    """Vrátí řetězec s počtem ryb, správně skloňovaným v češtině."""
    if pocet == 1:
        return "svou čerstvou rybu"
    elif 2 <= pocet <= 4:
        return f"své {pocet} čerstvé ryby"
    else:
        return f"svých {pocet} čerstvých ryb"


# Funkce pro výtisk symbolů ryb
def vytiskni_ryby(pocet):
    """Vytiskne zadaný počet symbolů ryb, každých šest symbolů na novém řádku."""
    for i in range(pocet):
        if i % 6 == 0 and i != 0:
            print()
        print("\t<´)),><´ ", end="")


# Úvodní pozdrav v rybím stánku
print("Vítejte na trhu v rybím stánku")

# Hlavní smyčka programu pro interakci s uživatelem
while True:
    try:
        # Získání počtu ryb od uživatele
        pocet_ryb = int(input("Kolik ryb chcete? "))

        # Ošetření speciálních případů pro nulu a záporné číslo
        if pocet_ryb == 0:
            print("Zatím tedy nenakupujete, v pořádku, klidně si naše ryby prohlédněte.")

        elif pocet_ryb < 0:
            print("Je mi líto, my ryby prodáváme, nevykupujeme.")

    except ValueError:
        # Ošetření neplatného vstupu (nečíselné hodnoty)
        print("Prosím, zadejte číslo.")
        continue

    # Skloňování počtu ryb a tisk údajů o nákupu
    if pocet_ryb > 0:
        pocet_ryb_sklonovani = formatuj_pocet_ryb(pocet_ryb)
        print(f"Tady máte {pocet_ryb_sklonovani}, děkujeme vám za nákup u nás.")

        # Tisk symbolů ryb
        vytiskni_ryby(pocet_ryb)
        print("\n\nTěšíme se na další návštěvu.")

    # Dotaz na dalšího zákazníka
    odpoved = input("\nDalší zákazník? [ano/ne]: ").lower()
    if odpoved not in ["ano", "a"]:
        break

# Závěrečná zpráva při ukončení programu
print("... stánek má tedy pauzu.")

Kód si vlož do IDE, několikrát vyzkoušej všechny možné varianty vstupu a pak ho analyzuj - co jak funguje a proč. Kdybys nějakou část nechápal, napiš a vysvětlíme si to. Ať se daří!

PS: vysvětlení toho, co je funkce, najdeš v lekci Funkce a výjimky v Pythonu - není to nic složitého.

 
Odpovedať
10.12.2023 19:58
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Karel Zaoral
DarkCoder:11.12.2023 3:38

Není nutné testovat na to zda pocet_ryb > 0. To už eliminovaly předchozí testy. A výpis formátované hlášky obchodníka lze schovat do funkce. Pro nic jiného se nevyužívá. Jinač vše ostatní v pořádku, strukturované, čitelné a dobře okomentováné.

def tiskny_hlasku_o_rybach(pocet):
    if pocet == 1:
        print(f"Tady máte svou čerstvou rybu, děkujeme vám za nákup u nás.")
    elif 2 <= pocet <= 4:
        print(f"Tady máte své {pocet} čerstvé ryby, děkujeme vám za nákup u nás.")
    else:
        print(f"Tady máte svých {pocet} čerstvých ryb, děkujeme vám za nákup u nás.")

def tiskni_ryby(pocet):
    for i in range(pocet):
        if i % 6 == 0 and i != 0:
            print()
        print("\t<´)),><´ ", end="")

print("Vítejte na trhu v rybím stánku")

while True:
    try:
        pocet_ryb = int(input("Kolik ryb chcete? "))

        if pocet_ryb == 0:
            print("Zatím tedy nenakupujete, v pořádku, klidně si naše ryby prohlédněte.")
        elif pocet_ryb < 0:
            print("Je mi líto, my ryby prodáváme, nevykupujeme.")
        else:
            tiskny_hlasku_o_rybach(pocet_ryb)
            tiskni_ryby(pocet_ryb)
            print("\n\nTěšíme se na další návštěvu.")
    except ValueError:
        print("Prosím, zadejte číslo.")
        continue

    odpoved = input("\nDalší zákazník? [ano/ne]: ").lower()
    if odpoved not in ["ano", "a"]:
        break

print("... stánek má tedy pauzu.")
Odpovedať
11.12.2023 3:38
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá na Karel Zaoral
Jaroslav Jančár:11.12.2023 7:51

Ahoj, tvůj kód už zkoumám v IDE 😊 funkcím už snad rozumím, nejvíce mě však zaujalo

def vytiskni_ryby(pocet):
    """Vytiskne zadaný počet symbolů ryb, každých šest symbolů na novém řádku."""
    for i in range(pocet):
        if i % 6 == 0 and i != 0:
            print()
        print("\t<´)),><´ ", end="")

když je zbytek po dělení 6 roven 0 a pak prázdným print() ukončit řádek je zajímavé řešení, to si musím zapamatovat. Délka kódu se skoro ztrojnásobila, ale chápu že se musí kód ošetřit proti uživatelově neposlušnosti 😄
Používání komentářů, opravdu kód zpřehledňuje, je načase abych začal používat.
Výjimky jsou zřejmě velmi důležité jdu zkoumat dále a učit se, děkuji a ahoj

Odpovedať
11.12.2023 7:51
ThinkPad L450 // Windows 11 // IntelliJ IDEA 2024.2.1 (Community Edition)
Avatar
DarkCoder
Člen
Avatar
DarkCoder:11.12.2023 8:38

Čitelnější varianta funkce tiskni_ryby()

def tiskni_ryby(pocet):
    for i in range(1, pocet + 1):
        print("\t<´)),><´ ", end="")
        if i % 6 == 0:
            print()  # Odřádkování po každých šesti rybách
    print()  # Odřádkování na konci výpisu
Odpovedať
11.12.2023 8:38
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Roman Mrózek:9. januára 6:40

Ahoj,
proč je v kódu kalkulačky příkaz:

vysledek = 0.0

Ve smyslu dalšího kódu s proměnnou vysledek mi přijde navíc.

 
Odpovedať
9. januára 6:40
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!