Seminář programování v Pythonu na PORGu - lekce 3


(Opakování z minulé lekce)

Známe základní struktury:

  1. while (podmínka):
  2.     (kód)
  3.  
  4. for x in range([odkud,] kam, [krok]):
  5.     (kód)
  6.  
  7. for x in ["Karel", "Pepa", "Jindřich"]:
  8.     (kód)
  9.  
  10. if (podmínka):
  11.     (kód 1)
  12. elif (druhá podmínka):
  13.     (kód 2)
  14. else:
  15.     (kód pro zbylé případy)
  16.  
  17. def funkce(parametr):
  18.     return(návratová hodnota)

Vyhodnocení výrazů jako True/False

... aneb booleovská logika s různými datovými typy:

Stejně jako False se vyhodnotí: [] 0 "" None

Stejně jako True se vyhodnotí: libovolný neprázdný seznam, nenulové číslo, neprázdný řetězec, libovolný objekt atd.

Základy se slovníky

Slovník je jako seznam, ALE: Jeho prvky nejsou indexovány pořadím v seznamu, nýbrž svým klíčem.

a={"cat":"kočka", "dog":"pes", "badger":"jezevec"}
a["cat"]		# indexování klíčem "cat"

a["hedgehog"]			# CHYBA -- neexistující klíč
a["hedgehog"]="ježek"   # přidání nové dvojice klíč:hodnota
a["hedgehog"]			# klíč už existuje

del(a["hedgehog"])		# vymazání dané hodnoty
a["hedgehog"]			# klíč byl smazán

a.get("dog", "neznámé zvíře")		# bezpečné indexování se zadáním výchozí hodnoty
a.get("wolpertinger", "neznámé zvíře")

a.items()			# výčet dvojic (tuplů) ve formě (klíč, hodnota)
len(a)				# počet dvojic
a.keys()			# výčet klíčů
a.values()			# výčet hodnot

Pozn.: a.items(), a.keys(), a.values() nenavrací seznam, ale iterátor. (Šetří se tím paměť, pokud původně slovník obsahuje třeba milión položek.)

list(a.items())		# teď získáme skutečný seznam, pokud potřebujeme

Úkol: Máte dán řetězec: "Vilém z Rožmberka (německy Wilhelm von Rosenberg; 10. března 1535 zámek Schützendorf v Horních Rakousích – 31. srpna 1592 Praha) byl významný český politik a představitel českých stavů ze šlechtického rodu Rožmberků. V nábožensky citlivém českém předbělohorském prostředí patřil k předním vůdcům umírněných katolíků. O významu tohoto muže nejen v rámci českého království, ale i v širším středoevropském prostoru, svědčí kandidatura na polský trůn, která mu byla nabídnuta polskými stavy v roce 1573, a nejvyšší říšské vyznamenání Řád zlatého rouna, které získal v roce 1585 jako jediný Rožmberk a čtvrtý nositel řádu z českého království (po Jindřichovi IV. z Plavna, Vratislavovi z Pernštejna a Jáchymovi z Hradce)." S pomocí cyklu for, jednoho slovníku a jeho funkce get() napište program, který spočítá, kolikrát se v textu vyskytují která písmena.

Doplněno: Na konci stránky je úkol vzorově vyřešen.

Funkce

Opakování:
def funkce(parametr1, parametr2):
    #kus kódu
    return(parametr1*parametr2)

funkce(32, 123.4)

Lokální proměnné ve funkcích se nezachovávají

def funkce():
    a=32 
    return(parametr1*parametr2)

funkce()
print(a)

Parametry můžou mít jiné jméno, než proměnné, kterým se přiřadí

V Pythonu funkce nekontroluje typ parametrů, viz

def funkce(parametr1, parametr2):
    #kus kódu
    return(parametr1*parametr2)

funkce(32, ["a", "b"])                        # Příklad 1
funkce(32, "A")                               # Příklad 2
funkce(32, False)                             # Příklad 3
funkce("Z", "A")                              # Příklad 4,  ale toto selže

Jak navrátit více proměnných z funkce?

def funkce(x):
    return([x*2, x+2])

[a,b]=funkce(10)        # rozbalení hodnot (unpacking)

Jak udělat funkci (blok kódu) s 0 řádky?

def funkce(x):
	pass
	# TODO

Pojmenované parametry

def zlomek(jmenovatel, citatel=1):
		return citatel/jmenovatel

>>> zlomek(3)
0.3333333333333333
>>> zlomek(3, 5)
1.6666666666666667

Doplněno: Vyřešený úkol na počítání písmenek

Zde jsem doplnil řešení poměrně těžkého úkolu na použití nezměrné moci pythonovských slovníků, který jsem vám dal 26. 9.

Pokud byste něčemu v kódu nerozuměli, nejdříve se koukněte na text kapitolky "Základy se slovníky"; pokud by pořád byly nejasnosti, rychle pište na mail (přes víkend jej asi nebudu moci číst). Pro přehlednost jsem nahradil text o českém šlechtici za jednoduché slovo, Antananarivo.

Ještě se na tento příklad podíváme v pondělí 3. 10. a vylepšíme ho.

  1. ## Ulozime si zpracovavany text do promenne
  2. text = "Antananarivo"
  3.  
  4. ## Vytvorime si zpocatku prazdny slovnik
  5. pocty_pismen = {}
  6.  
  7. ## Prochazime pismenka jedno po druhem
  8. for pismeno in text:
  9.     ## pocet dosavadnich vyskytu daneho pismene navysime o jedna
  10.     pocty_pismen[pismeno] = pocty_pismen.get(pismeno, 0) + 1
  11.     ## (Vsimnete si, ze vyuzijeme druhy parametr metody .get() a pro dosud neexistujici pismeno
  12.     ## tak ziskame dosavadni pocet vyskytu jako nula)
  13.  
  14. ## Prochazime dvojice pismen a poctu jejich vyskytu
  15. for (pismeno, pocet) in pocty_pismen.items():
  16.     print("Pismeno ", pismeno, " se v textu vyskytuje ", pocet, "-krat.")

Při procházení písmenek se vždy zeptáme slovníku, zda písmenko existuje a navýšíme počet jeho příslušných výskytů o jednotku. Takže po prvním průchodu bude ve slovníku {'A':1}, po druhém průchodu bude {'A':1, 'n':1} atd.


Zpět na obsah | Poslední úprava: 2011-09-25