Nauč se Python > Kurzy > Začátečnický kurz PyLadies > První program > Zpětná vazba k domácím projektům

Zpětná vazba k domácím projektům

Úkol 5

Ne všechno se dá použít jako jméno proměnné. Fungují pro proměnné následující jména? Pokud ne, proč asi?

ANO: x, tlacitko4, krůta, kratsiStrana, POCET_BODU, _ (podtržítko), π (pí), _cache, __name__

NE: 34, 3e4, $i, druha-odmocnina, readme.txt, True, while

In [12]:
34 = 'ahoj' # proměnná nemůže být číslo, proměnná nemůže začínat číslem
  File "<ipython-input-12-de78edeff3fd>", line 1
    34 = 'ahoj'
    ^
SyntaxError: cannot assign to literal
In [20]:
3e4
Out[20]:
30000.0
In [13]:
$i = 'ahoj' # proměnná nemůže začínat speciálním znakem
  File "<ipython-input-13-560f4df9fcd9>", line 1
    $i = 'ahoj'
    ^
SyntaxError: invalid syntax
In [14]:
druha-odmocnina = 'ahoj' # proměnná nemůže obsahovat pomlčku (pro Python má speciální význam)
  File "<ipython-input-14-316e4a9bb54a>", line 1
    druha-odmocnina = 'ahoj'
    ^
SyntaxError: cannot assign to operator
In [15]:
readme.txt = 'ahoj' # proměnná nemůžem obsahovat tečku (pro Python má speciální význam)
-------------------------------------------------------------------------
NameError                               Traceback (most recent call last)
<ipython-input-15-74d7c5974d4f> in <module>
----> 1 readme.txt = 'ahoj'

NameError: name 'readme' is not defined
In [17]:
True = 'ahoj' # nelze jako proměnnou použít tzv. vyhrazené slovo (reserved word, keyword)
  File "<ipython-input-17-cb79acab3008>", line 1
    True = 'ahoj' # nelze jako proměnné použít vyhrazená slova (https://docs.python.org/3/reference/lexical_analysis.html?highlight=reserved#keywords)
    ^
SyntaxError: cannot assign to True

Základní pravidla pro názvy proměnných

  • Libovolná délka
  • Lze použít písmena, číslice a podtržítko
  • vždy musí začínat písmenem
  • proměnné jsou tzv. case sensitive
  • nesmí obsahovat mezeru
  • lze použít tzv. velbloucí notaci
  • podtržítko na začátku názvu lze použít, ale má speciální význam, takže zatím nepoužívejte
  • jako název nelze použít vyhrazené slovo
  • další doporučení: nepoužívat jednopísmenné názvy, používat smysluplné názvy, nepoužívat názvy, které znáte z Pythonu (např. print)

ASCII tabulka

In [1]:
'abc' > 'Abc'
Out[1]:
True
In [2]:
'abc' < 'ábč'
Out[2]:
True

PROČ?

Existuje něco jménem ASCII tabulka, která každému znaku přiřazuje číselnou hodnotu. V Pythonu tohle číslo lze získat pomocí funkce ord, např. ord("a"). Protože velké A má číselnou hodnotu 65 a malé "a" má 97, platí, že "A" < "a".

In [11]:
print('a:', ord('a'), '  A:', ord('A'), '  á:', ord('á'))
a: 97   A: 65   á: 225

KÁMEN - NŮŽKY - PAPÍR

Je možné toto zjednodušit?

In [ ]:
tah_cloveka = 'kámen'
tah_pocitace = 'papír'

if tah_cloveka == 'kámen' and tah_pocitace == 'kámen'or tah_cloveka == 'nůžky' and tah_pocitace == 'nůžky' or tah_cloveka == 'papír' and tah_pocitace == 'papír':
    print('Plichta.')
elif tah_cloveka == 'kámen' and tah_pocitace == 'nůžky' or tah_cloveka == 'nůžky'and tah_pocitace == 'papí'r' or tah_cloveka == 'papír' and tah_pocitace == 'kámen':
    print('Vyhrála jsi!')
elif tah_cloveka == 'kámen' and tah_pocitace == 'papír'or tah_cloveka == 'papír' and tah_pocitace == 'nůžky' or tah_cloveka == 'nůžky' and tah_pocitace == 'kámen':
    print('Počítač vyhrál.')

Ano je !

In [ ]:
tah_cloveka = 'kámen'
tah_pocitace = 'papír'

if tah_cloveka == tah_pocitace:
    print('Plichta.')
elif tah_cloveka == 'kámen' and tah_pocitace == 'nůžky' or tah_cloveka == 'nůžky'and tah_pocitace == 'papír' or tah_cloveka == 'papír' and tah_pocitace == 'kámen':
    print('Vyhrála jsi!')
else:
    print('Počítač vyhrál.')

Najdi chyby 1

Tento kousek kódu, který se stará o výběr tahu počítače na základě náhodně vygenerovaného čísla, může vypada na první pohled správně, ale ve skutečnosti jej stačí párkrát spustit a chybička se projeví.

In [ ]:
from random import randrange
cislo = randrange(2)

if cislo == 0:
    tah_pocitace = "kámen"
    print("Počítač vybral kámen.")
if cislo == 1:
    print("Počítač vybral nůžky.")
    tah_pocitace = "nůžky"
else:
    tah_pocitace = "papír"
    print("Počítač vybral papír.")

LEPŠÍ ŘEŠENÍ

Chybička byla v záměně elif za další if což způsobilo rozdělení jedné podmínky se třemi větvemi na dvě samostatné podmínky, z nichž ta první měla jen jednu větev (jen jeden if) a ta druhá dvě (jeden if a jeden else).

Další chyba pak byla v generování náhodných čísel, protože randrange(2) vrátí vždy jen 0 nebo 1.

In [ ]:
from random import randrange
cislo = randrange(3)

if cislo == 0:
    tah_pocitace = "kámen"
    print("Počítač vybral kámen.")
elif cislo == 1:
    print("Počítač vybral nůžky.")
    tah_pocitace = "nůžky"
else:
    tah_pocitace = "papír"
    print("Počítač vybral papír.")

JDE TO JEŠTĚ VYLEPŠIT??

In [ ]:
from random import randrange
cislo = randrange(3)

if cislo == 0:
    tah_pocitace = "kámen"
elif cislo == 1:
    tah_pocitace = "nůžky"
else:
    tah_pocitace = "papír"

print('Počítač vybral', tah_pocitace)

Bohatá a šťastná

Několik možných řešení programu šťastná-bohatá. Všechny dělají totéž, ale některé jsou zkrátka lépe čitelné a kompaktnější. ŘEŠENÍ 1

In [ ]:
print('Odpovídej "ano" nebo "ne".')
stastna = input('Jsi šťastná? ')
bohata = input('jsi bohatá? ')

if stastna == 'ano':
    if bohata == 'ano':
        print('Gratuluji')
    elif bohata == 'ne':
        print('zkus míň utrácet')

elif stastna == 'ne':
    if bohata == 'ne':
        print('to je mi líto')
    elif bohata == 'ano':
        print('zkus se víc usmívat')

else:
    print('nerozumím')

ŘEŠENÍ 2

In [ ]:
print('Odpovídej "ano" nebo "ne".')
stastna_retezec = input('Jsi šťastná? ')
if stastna_retezec == 'ano':
    stastna = True
elif stastna_retezec == 'Ano':
    stastna = True
elif stastna_retezec == 'ne':
    stastna = False
elif stastna_retezec == 'Ne':
    stastna = False
else:
    print('Nerozumím!')

bohata_retezec = input('Jsi bohatá? ')
if bohata_retezec == 'ano':
    bohata = True
elif bohata_retezec == 'Ano':
    bohata = True
elif bohata_retezec == 'ne':
    bohata = False
elif bohata_retezec == 'Ne':
    bohata = False
else:
    print('Nerozumím!')

if bohata:
    if stastna:
    # Je bohatá a zároveň štǎstná, ta se má.
        print('Gratuluji!')
elif bohata:
    # Je bohatá, ale není „bohatá a zároveň šťastná“,
    # takže musí být jen bohatá.
    print('Zkus se víc usmívat.')
elif stastna:
    # Tady musí být jen šťastná.
    print('Zkus míň utrácet.')
else:
    # A tady víme, že není ani šťastná, ani bohatá.
    print('To je mi líto.')

ŘEŠENÍ 3

In [ ]:
print('Odpovídej "ano" nebo "ne".')
stastna_retezec = input('Jsi šťastná? ')
bohata_retezec = input('Jsi bohatá? ')

if stastna_retezec == "ano":
    if bohata_retezec == "ano":
        print("Gratuluji.")
    else:
        print("Zkus míň utrácet.")
        
elif bohata_retezec == "ano":
    print("Zkus se více usmívat.")
    
else:
    print("To je mi líto.")

Obecné rady, prosby a doporučení

  • Používání nových (neprobraných) funkcionalit => ANO/NE?
  • Čeština / Angličtina
  • Pište komentáře. Když narazíme na špatné řešení, snáze se nám radí, když víme, jak jste se k němu dostaly a na co jste při tom myslely. Komentáře ke standardním věcem psát netřeba.
  • Odevzdávejte nejpozději v neděli večer, konzultujte na Slacku
  • Spouštějte svůj program opakovaně, snažte se simulovat všechny možnosti, které mohou nastat

Toto je stránka lekce z kurzu, který probíhá nebo proběhl naživo s instruktorem.