1 # Takze co jsme delali dneska, tedy domaci ukoly, trocha rekurze a trocha seznamu:
2
3 # Nejdriv domaci ukoly, zacneme s tim jednoduzsim, tedy mate cislo a vypsat ho
4 # po cifrach. Ukazeme si tri zpusoby - prvni je ten, ke kterymu se nekteri z vas
5 # skoro dostali, druhej je "elegantnejsi" zapsani tehoz a treti je pak rekurzivne
6
7 def digits1(n):
8 """ Vypise cifry cisla od te s nejmensi vahou po tu s nejvetsi vahou. """
9 y=10 # ze jsme v 10tkove soustave, neni nutne
10 while (x>y): # dokud je x vetsi nez y (tedy dokud ma alespon 2 cifry)
11 r=x%y # zjistime si zbytek po deleni zakladem, tedy posledni cifru
12 print r # tu vypiseme
13 x=(x-r)/y # a x vydelime zakladem (je zbytecne odecitat od x r, kdyz si uvedomite, ze x/y je celociselne deleni)
14 print x # a jeste musime vytisknout posledni cifru
15
16 def digits2(n):
17 """ Vypise cifry cisla, trosku upravenejsi verze."""
18 while (n>0): # dokud je v N alespon jedna cifra
19 print n%10 # vypiseme posledni cifru
20 n=n/10 # posuneme se o cifru dal
21
22 def digits_recursive(n):
23 """ Vypise cifry cisla, tentokrat rekurzivne."""
24 print n%10 # zase vypiseme posledni cifru
25 if (n>9): # a jestli to nebyla posledni cifra, tedy jestli ma n aspon 2 cifry
26 digits_recursive(n/10) # zavolame vypsani cifer znova, ale o cislo bez posledni cifry
27
28 # takze to bychom meli vypisovani cifer. Ted na ten domecek. Ukolem je udelat
29 # funkci co nakresli domecek o zadane velikosti z hvezdicek. Tady je kod: Ta
30 # funkce je hodne dlouha, ale jedna se vlastne o nekolik kroku po sobe:
31 # 1) nejdriv nakreslime strechu
32 # 2) pak si udelame pruh z hvezdicek (ten pouzijeme na strop a na zaklad domecku)
33 # 3) a nakonec si udelame pruh z mezer co ma nazacatku a na konci hvezdicku, to je vypln baracku
34 # 4) ted nakreslime s pomoci 2) a 3) ten ctverec
35
36 def domecek(n):
37 """ Nakresli domecek z hvezdicek. """
38 i=n/2 # tohle je pocet mezer u nejvyssi casti strechy
39 while (i>=0):
40 s="" # do s dame prazdny retezec
41 j=0 # s j jdeme od nuly
42 while (j<i):
43 s=s+" "
44 j=j+1 # dokud si do s nenastradame potrebny pocet mezer
45 s=s+"*" # ted do s pridame prvni hvezdicku ve strese
46 if (i==n/2): # kdyz jsme na nejvyssim radku strechy, je to jedina hvezdicka
47 i=i-1
48 if (n%2==0): # kdyz je velikost domecku suda, jsou na horni casti strechy hvezdicky 2
49 s=s+"*"
50 print s # vypiseme radek strechy
51 continue # a pokracujeme dalsim provedenim cyklu
52 # ted jdeme na mezery co jsou mezi pravou a levou hvezdickou strechy
53 s=s+" " # je tam minimalne jedna za horni radek
54 if (n%2==0): # kdyz je velikost domecku suda,
55 s=s+" " # jsou tam mezery 2 (po dvou hvezdickach)
56 j=i # ted jdeme od radku hvezdicky, kterej se snazime nakreslit
57 while (j<n/2-1): # az do posledniho radku kde se jeste pripisuji nove mezery (druhy odshora)
58 s=s+" " # a za kazdy radek pridame 2 hvezdicky
59 j=j+1
60 s=s+"*" # nakonec pridame pravou hvezdicku
61 print s # pripraveny radek vytiskneme
62 i=i-1 # a posuneme se o radek dolu
63 i=0 # vynulujeme citac
64 cara_z_hvezdicek="" # a budeme delat caru z hvezicek
65 while (i<n): # takze nkrat pridame k care jednu hvezdicku
66 cara_z_hvezdicek=cara_z_hvezdicek+"*"
67 i=i+1
68 i=0 # vynulujeme citac
69 prostredek="*" # a dame si do retezce hvezdicku
70 while (i<n-2): # ted pridame n-2 mezer (2 hvezdicky uz mame po stranach)
71 prostredek=prostredek+" "
72 i=i+1
73 prostredek=prostredek+"*" # a pridame ukoncovaci hvezdicku
74 # ted uz mame vsechny komponenty
75 print cara_z_hvezdicek # vytiskneme strop
76 i=0
77 while (i<n-2): # n-2 krat vytiskneme stredni cast domecku
78 print prostredek
79 i=i+1
80 print cara_z_hvezdicek # a cele to zakoncime podlahou
81
82 # Co jsme delali dneska byly seznamy. Pouzivaji se k tomu, kdyz chcete ulozit
83 # do jedne promenne vic hodnot. Inicializuji se pres hranate zavorky, ve kterych
84 # je seznam prvku seznamu:
85
86 seznam=[1,2,3]
87
88 # muzete si zjistit delku seznamu (=pocet prvku)
89
90 print len(s) # vypise 3
91
92 # muzete menit libovolny prvek seznamu pres index prvku (prvni prvek ma index 0!!!!)
93
94 s[1]=55 # seznam ted je [1, 55 3]
95
96 # muzete prvek smazat (zadate zase index prvku ke smazani)
97
98 del s[0] # seznam ted je [55, 3]
99
100 # a muzete prvek pridat
101
102 s.append(66) # seznam ted je [55, 3, 66]
103
104 # takze tohle jsou zakladni operace se seznamem. Ted si ukazeme nektere funkce
105 # ktere muzeme k seznamu udelat. Ta prvni nam vrati True nebo False podle toho,
106 # jestli dany prvek v seznamu je nebo neni:
107
108 def member(seznam,prvek):
109 """Vrati True, pokud je prvek v seznamu, jinak vrati False."""
110 i=0 # pojedeme od prvniho prvku
111 while (i<len(seznam)): # do posledniho
112 if (seznam[i]==prvek): # kdyz prvek s indexem i je rovnej prvku, nasli jsme co jsme hledali
113 return True # takze vratime true
114 i=i+1 # posuneme se na dalsi prvek
115 return False # kdyz jsme se dostali az sem, prosli jsme cely pr
116
117 # takze to bychom meli. Ted zkusime dalsi funkci. Ta si vezme jako parametr
118 # dva seznamy (musi mit stejnou delku) a vytvori novej seznam podle nasledujiciho
119 # pravidla:
120 # vysledek[i]=max(seznam1[i],seznam2[i])
121
122 def maxList(seznam1,seznam2):
123 """ Vrati seznam maximalnich prvku ze seznamu v parametrech."""
124 if (len(seznam1)!=len(seznam2)): # kdyz neni delka stejna
125 print "Seznamy musi mit stejnou delku" # zarveme
126 return [] # a vratime prazdny seznam
127 result=[] # vysledek je zatim prazdny seznam, naplnime ho
128 i=0 # a zacneme prvnimi prvky
129 while (i<len(seznam1)): # az do poslednich
130 result.append(max(seznam1[i],seznam2[i])) # ucte se pouzivat uz existujici funkce;-)
131 i=i+1 # posun na dalsi prvek
132 return result # vratime co jsme vyrobili
133
134 # a do tretice si ukazeme funkci, ktera vrati prunik dvou seznamu. Tedy vrati jen ty prvky,
135 # co jsou v obou seznamech: Pouzijeme v ni funkci member, co uz jsme si naprogramovali driv:
136
137 def intersection(seznam1,seznam2):
138 """ Vrati prunik dvou seznamu. """
139 result=[] # vysledek je zase prazdny seznam co pozdeji naplnime
140 i=0 # a zaciname od prvniho prvku prvniho seznamu
141 while (i<len(seznam1)): # a projedeme cely prvni seznam
142 if (member(seznam2,seznam1[i])): # jestli je dany prvek prvniho seznamu i v druhem seznamu
143 result.append(seznam1[i]) # pridame ho k vysledku
144 i=i+1 # posuneme se na dalsi prvek
145 return result # vraime, co jsme vypocitali
146
147
148
149
150
151
152
153
154
155
156