Nauč se Python > Kurzy > Začátečnický kurz PyLadies > Funkce a řetězce > Zpětná vazba k domácím projektům

Zpětná vazba k projektům lekce Funkce a řetězce

Highlights

Kultura kódu:

  • importy na prvním místě
  • výchozí hodnoty proměnných
  • definice funkcí
  • komentáře
  • spuštění hlavní funkce programu

OBROVSKÁ POCHVALA!

Vývojářská slepota, např.: range(1)

In [ ]:
for cary in range(1):
    left(45)
    forward(sqrt(2)*x)
    left(135)
    forward(x)
    left(135)
    forward(sqrt(2)*x)

Provádíme úpravy, úpravy, úpravy, až zbyde něco jako range(1).

V reálném vývoji software tento problém řeší tzv. code reviews (systém 2 párů oči). Pokud provádíme vývoji sami, je vhodné si nechat odstup alespoň 24 hodin a podívat se na vlastní kód znovu, nejdřív blok po bloku, pak řádek po řádku...

Duplikovaný (nebo skoro identický) kód

Další důsledek vývojářské slepoty. Lze odstranit pomocí chytře zkonstruovaných funkcí, přidaných argumentů apod. Ideální je opět systém 2 párů očí pro odhalení duplicit v kódu.

Indexování

Začínámé vždy od nuly. Jsme prostě divní programátoři a divné programátorky. :-)

In [ ]:
range(5)  # 0, 1, 2, 3, 4
In [ ]:
"čokoláda"[0]  # "č"

Nejlepší hra Piškvorky 1D se strategií, by Martina Bradáčová

In [ ]:
from random import randrange


def tah(pole, cislo_policka, symbol):
    "Vrátí herní pole s daným symbolem umístěným na danou pozici"
    return pole[:cislo_policka] + symbol + pole[cislo_policka + 1:]


def tah_hrace(pole, symbol):
    "Vrátí herní pole se zaznamenaným tahem hráče"
    while True:
        cislo_policka = int(input('Zadejte cislo políčka: '))
        if cislo_policka >= len(pole) or cislo_policka < 0:
            print('Vaše volba je mimo rozsah pole. Zkuste to znovu!')
        elif pole[cislo_policka] == '-':
            return tah(pole, cislo_policka, symbol)
        else:
            print('Toto pole je už obsazené. Zkuste to znovu!')


def tah_pocitace(pole, symbol_hrace, symbol_pocitace):
    "Vrátí herní pole se zaznamenaným tahem počítače"
    if pole.find(symbol_pocitace + symbol_pocitace + '-') > -1:
        cislo_policka = pole.find(symbol_pocitace + symbol_pocitace + '-') + 2
    elif pole.find('-' + symbol_pocitace + symbol_pocitace) > -1:
        cislo_policka = pole.find('-' + symbol_pocitace + symbol_pocitace)
    elif pole.find(symbol_pocitace + '-' + symbol_pocitace) > -1:
        cislo_policka = pole.find(symbol_pocitace + '-' + symbol_pocitace) + 1
    elif pole.find(symbol_hrace + '-') > -1:
        cislo_policka = pole.find(symbol_hrace + '-') + 1
    elif pole.find('-' + symbol_hrace + symbol_hrace) > -1:
        cislo_policka = pole.find('-' + symbol_hrace + symbol_hrace)
    elif pole.find(symbol_pocitace + '-' + '-') > -1:
        cislo_policka = pole.find(symbol_pocitace + '-' + '-') + 1
    elif pole.find('-' + '-' + symbol_pocitace) > -1:
        cislo_policka = pole.find('-' + '-' + symbol_pocitace) + 1
    elif pole.find('-' + symbol_hrace) > -1:
        cislo_policka = pole.find('-' + symbol_hrace)
    else:
        cislo_policka = pole.find('-')
    print('tah pocitace:', cislo_policka)
    return tah(pole, cislo_policka, symbol_pocitace)


def vyhodnot(herni_pole):
    "Vrátí výsledek hry"
    if herni_pole.find('xxx') != -1:
        vysledek = 'x'
    elif herni_pole.find('ooo') != -1:
        vysledek = 'o'
    elif herni_pole.find('-') == -1:
        vysledek = '!'
    else:
        vysledek = '-'
    return vysledek


def piskvorky1d(pole, symbol_hrace, symbol_pocitace):
    while True:
        pole = tah_hrace(pole, symbol_hrace)
        print(pole)
        vysledek = vyhodnot(pole)
        if vysledek == symbol_hrace:
            konec_hry = 'Vyhrál jste'
            break
        elif vysledek == '!':
            konec_hry = 'Remíza'
            break

        pole = tah_pocitace(pole, symbol_hrace, symbol_pocitace)
        print(pole)
        vysledek = vyhodnot(pole)
        if vysledek == symbol_pocitace:
            konec_hry = 'Počítač vyhrál'
            break
        elif vysledek == '!':
            konec_hry = 'Remíza'
            break

    return konec_hry


# Zkouška funkce
vychozi_pole = 20*'-'
symbol_hrace = 'x'
symbol_pocitace = 'o'
print(vychozi_pole)
print(piskvorky1d(vychozi_pole, symbol_hrace, symbol_pocitace))

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