Skip to content

Commit 619fba0

Browse files
committed
Prepare lesson on lists and tuples. Split out text on nested lists.
1 parent 0b1db6e commit 619fba0

5 files changed

Lines changed: 145 additions & 113 deletions

File tree

courses/pyladies/info.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ plan:
100100
materials:
101101
- lesson: beginners/list
102102
- lesson: beginners/tuple
103+
- lesson: beginners/nested-list
103104
- title: Tahák na seznamy
104105
url: https://pyvec.github.io/cheatsheets/lists/lists-cs.pdf
105106
type: cheatsheet

lessons/beginners/list/index.md

Lines changed: 47 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ který si můžeš vytisknout.
55
# Seznamy
66

77
Dnes si ukážeme, jak pracovat se *seznamy* (angl. *lists*).
8-
Zapisují se hranatými závorkami:
8+
9+
Začneme prakticky.
10+
Vytvoř si seznam pomocí následujícího kódu:
911

1012
```python
1113
zviratka = ['pes', 'kočka', 'králík']
@@ -18,30 +20,32 @@ print(zviratka)
1820
1921
Seznam je hodnota, která může obsahovat spoustu dalších hodnot.
2022
Tak jako řetězec obsahuje sekvenci znaků,
21-
seznam obsahuje sekvenci... čehokoliv. Třeba slov (řetězců).
22-
A tak jako můžeme pomocí cyklu `for`
23-
procházet řetězec po znacích,
24-
seznam můžeme procházet po jednotlivých prvcích:
23+
seznam obsahuje sekvenci jakýchkoli hodnot.
24+
V našem případě obsahuje sekvenci řetězců.
25+
26+
A tak jako můžeš pomocí cyklu `for` procházet řetězec po znacích,
27+
seznam můžeš procházet po jednotlivých prvcích:
2528

2629
```python
2730
for zviratko in zviratka:
2831
print(zviratko)
2932
```
3033

31-
Seznamy se v programech vyskytují velice často:
32-
soubor se dá načíst jako seznam řetězců
33-
s jednotlivými řádky,
34-
seznam řetězců jako `'7♥'`
35-
a `'K♣'` může posloužit jako balíček karet,
36-
matematika je plná číselných řad,
37-
každá online služba má seznam uživatelů.
34+
Seznamy se v programech vyskytují často:
35+
soubor se dá načíst jako seznam řetězců s jednotlivými řádky,
36+
seznam řetězců jako `'7♥'` a `'K♣'` může posloužit jako balíček karet,
37+
matematika je plná číselných řad, každá online služba má seznam uživatelů.
38+
39+
Hodnoty v seznamu můžou být jakéhokoli typu:
3840

41+
```python
42+
prvni_prvocisla = [2, 3, 5, 7, 11]
43+
```
3944

40-
Hodnoty v seznamu můžou být jakéhokoli typu.
41-
Dokonce můžeš různé typy míchat v jednom seznamu
42-
(i když s takovými namixovanými seznamy se
43-
příliš často nesetkáš – více se různé typy hodnot
44-
používají v <var>n</var>-ticích, o kterých si povíme později):
45+
Dokonce můžeš různé typy míchat v jednom seznamu.
46+
(S takovými namixovanými seznamy se ovšem příliš často nesetkáš.
47+
Různé typy hodnot se používají spíš v <var>n</var>-ticích, o kterých si povíme
48+
později):
4549

4650
```python
4751
seznam = [1, 'abc', True, None, range(10), len]
@@ -109,13 +113,14 @@ seznam, se kterým pracuje. Vyzkoušej si to:
109113
```
110114

111115
Všimni si, že proměnná `zviratka` se nastavuje jen na začátku.
112-
V celém programu výše je jen jeden seznam – na začátku má tři prvky, pak
113-
mu jeden přibude, ale stále je to jeden a ten samý seznam.
116+
V rámci celého běhu programu výše existuje je jen jeden seznam.
117+
Na začátku má tři prvky, pak mu jeden přibude, ale stále je to jeden a ten
118+
samý seznam.
114119

115120
Takové měnění může být občas překvapující,
116121
protože stejná hodnota může být přiřazená ve více proměnných.
117122
Protože se mění hodnota samotná, může to vypadat,
118-
že se „mění proměnná, aniž na ni sáhneme”:
123+
že se „mění proměnná, aniž na ni sáhneš”:
119124

120125
```python
121126
a = [1, 2, 3] # Vytvoření seznamu
@@ -129,6 +134,7 @@ a.append(4)
129134
print(b)
130135
```
131136

137+
132138
## Další způsoby, jak měnit seznamy
133139

134140
Kromě metody `append`, která přidává jediný prvek na konec, existuje
@@ -139,7 +145,7 @@ Všechny udělají změny přímo v daném seznamu a (kromě `pop`) vrací `Non
139145
* `insert()` přidá prvek na danou pozici,
140146
* `pop()` odebere *a vrátí* poslední prvek,
141147
* `remove()` odstraní první výskyt daného prvku,
142-
* `sort()` seznam seřadí (řetězce podle abecedy”, čísla vzestupně),
148+
* `sort()` seznam seřadí (řetězce podle abecedy”, čísla vzestupně),
143149
* `reverse()` obrátí pořadí prvků,
144150
* `clear()` odstraní všechny prvky.
145151

@@ -340,11 +346,10 @@ A dokonce i čísla – ta jako podmínka platí, pokud jsou nenulová.
340346

341347
Tak jako funkce `int` převádí na
342348
celá čísla a `str` na řetězce,
343-
funkce `list` (angl. *seznam*) převádí na seznam.
349+
funkce `list` převádí na seznam.
344350
Jako argument jí můžeš předat jakoukoli hodnotu,
345351
kterou umí zpracovat příkaz `for`.
346-
Z řetězců udělá seznam znaků, z otevřeného souboru
347-
udělá seznam řádků, z `range` udělá seznam čísel.
352+
Z řetězců udělá seznam znaků, z `range` udělá seznam čísel.
348353

349354
```python
350355
abeceda = list('abcdefghijklmnopqrstuvwxyz')
@@ -384,22 +389,32 @@ for cislo in range(10):
384389
print(mocniny_dvou)
385390
```
386391

392+
Podobným způsobem získáš seznam seznam `matka`, `babička`, `prababička`,
393+
`praprababička`, atd.:
394+
395+
```python
396+
predkove = ['matka']
397+
for pocet_pra in range(10):
398+
predkove.append('pra' * pocet_pra + 'babička')
399+
print(predkove)
400+
```
401+
387402
Chceš-li seznam, který reprezentuje balíček karet,
388-
zavolej `append` pro všechny kombinace barev a hodnot.
403+
zavolej `append` pro všechny kombinace barev a hodnot:
389404

390405
```python
391406
balicek = []
392-
for barva in '', '', '', '': # (Na Windows použij textová jména)
407+
for barva in '', '', '', '':
393408
for hodnota in list(range(2, 11)) + ['J', 'Q', 'K', 'A']:
394409
balicek.append(str(hodnota) + barva)
395410
print(balicek)
396411
```
397412

398413
## Seznamy a řetězce
399414

400-
Seznamy a řetězce jsou druhy sekvencí”,
401-
takže snad nepřekvapí, že se dá různě převádět
402-
z jednoho typu na druhý.
415+
Seznamy a řetězce jsou druhy *sekvencí*.
416+
Můžeš různě převádět z jednoho typu na druhý.
417+
403418
Funkce `list` vytvoří z řetězce seznam znaků.
404419
Když chceš dostat seznam slov, použij
405420
na řetězci metodu `split` (angl. *rozdělit*):
@@ -438,7 +453,7 @@ třeba nám už známou `random.randrange`.
438453
Podívejme se na dvě další, které se hodí k seznamům.
439454

440455
Funkce `shuffle` seznam „zamíchá” – všechny prvky náhodně popřehází.
441-
Seznam změní „na místě“ a nic nevrací podobně jako metoda `sort`.
456+
Seznam změní „na místě“ a nic nevrací (podobně jako metoda `sort`).
442457

443458
```python
444459
import random
@@ -454,84 +469,12 @@ print(balicek)
454469
```
455470

456471
A funkce `choice` ze seznamu vybere jeden náhodný prvek.
457-
S použitím seznamu tak můžeš třeba jednoduše vybrat tah pro hru
472+
S použitím seznamu tak můžeš třeba jednoduše vybrat tah pro hru
458473
kámen/nůžky/papír:
459474

460475
```python
461476
import random
462477
mozne_tahy = ['kámen', 'nůžky', 'papír']
463478
tah_pocitace = random.choice(mozne_tahy)
479+
print(tah_pocitace)
464480
```
465-
466-
## Vnořené seznamy
467-
468-
A perlička na konec!
469-
Na začátku tohoto textu je napsáno, že seznam
470-
může obsahovat jakýkoli typ hodnot.
471-
Může třeba obsahovat i další seznamy:
472-
473-
```python
474-
seznam_seznamu = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
475-
```
476-
477-
Takový seznam se chová docela normálně – můžeš z něj třeba brát jednotlivé
478-
prvky (které jsou ovšem taky seznamy):
479-
480-
```python
481-
prvni_seznam = seznam_seznamu[0]
482-
print(prvni_seznam)
483-
```
484-
485-
A protože jsou prvky samy seznamy,
486-
dá se mluvit o věcech jako „první prvek druhého seznamu”:
487-
488-
```python
489-
druhy_seznam = seznam_seznamu[1]
490-
prvni_prvek_druheho_seznamu = druhy_seznam[0]
491-
print(prvni_prvek_druheho_seznamu)
492-
```
493-
494-
A protože výraz `seznam_seznamu[1]`
495-
označuje seznam, můžeš brát prvky přímo z něj:
496-
497-
```python
498-
prvni_prvek_druheho_seznamu = (seznam_seznamu[1])[0]
499-
```
500-
501-
Neboli:
502-
503-
```python
504-
prvni_prvek_druheho_seznamu = seznam_seznamu[1][0]
505-
```
506-
507-
A má tahle věc nějaké použití?
508-
Stejně jako vnořené cykly `for` ti umožnily vypsat tabulku, vnořené seznamy
509-
ti umožní si tabulku „zapamatovat”.
510-
511-
```python
512-
def vytvor_tabulku(velikost=11):
513-
seznam_radku = []
514-
for a in range(velikost):
515-
radek = []
516-
for b in range(velikost):
517-
radek.append(a * b)
518-
seznam_radku.append(radek)
519-
return seznam_radku
520-
521-
nasobilka = vytvor_tabulku()
522-
523-
print(nasobilka[2][3]) # dva krát tři
524-
print(nasobilka[5][2]) # pět krát dva
525-
print(nasobilka[8][7]) # osm krát sedm
526-
527-
# Vypsání celé tabulky
528-
for radek in nasobilka:
529-
for cislo in radek:
530-
print(cislo, end=' ')
531-
print()
532-
```
533-
534-
Co s takovou „zapamatovanou” tabulkou?
535-
Můžeš si do ní uložit třeba pozice
536-
figurek na šachovnici nebo křížků a koleček
537-
ve *2D* piškvorkách.
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# Vnořené seznamy
2+
3+
Seznam může obsahovat jakýkoli typ hodnot: čísla, řetězce, a tak dále:
4+
5+
```python
6+
prvocisla = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]
7+
zviratka = ['pes', 'kočka', 'králík']
8+
odpovedi = [False, False, False, True, False, True, True]
9+
```
10+
11+
Stejně tak může seznam obsahovat i další seznamy.
12+
Podobně jako seznam čísel nebo seznam řetězců tak lze vytvořit seznam seznamů:
13+
14+
```python
15+
seznam_seznamu = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
16+
```
17+
18+
Takový seznam se chová docela normálně – můžeš z něj třeba brát jednotlivé
19+
prvky (které jsou ovšem taky seznamy):
20+
21+
```python
22+
prvni_seznam = seznam_seznamu[0]
23+
print(prvni_seznam)
24+
```
25+
26+
A protože jsou prvky samy seznamy,
27+
dá se mluvit o věcech jako „první prvek druhého seznamu”:
28+
29+
```python
30+
druhy_seznam = seznam_seznamu[1]
31+
prvni_prvek_druheho_seznamu = druhy_seznam[0]
32+
print(prvni_prvek_druheho_seznamu)
33+
```
34+
35+
A protože výraz `seznam_seznamu[1]`
36+
označuje seznam, můžeš brát prvky přímo z něj:
37+
38+
```python
39+
prvni_prvek_druheho_seznamu = (seznam_seznamu[1])[0]
40+
```
41+
42+
Neboli:
43+
44+
```python
45+
prvni_prvek_druheho_seznamu = seznam_seznamu[1][0]
46+
```
47+
48+
A má tahle věc nějaké použití?
49+
Stejně jako vnořené cykly `for` ti umožnily vypsat tabulku, vnořené seznamy
50+
ti umožní si tabulku „zapamatovat”.
51+
52+
```python
53+
def vytvor_tabulku(velikost=11):
54+
seznam_radku = []
55+
for a in range(velikost):
56+
radek = []
57+
for b in range(velikost):
58+
radek.append(a * b)
59+
seznam_radku.append(radek)
60+
return seznam_radku
61+
62+
nasobilka = vytvor_tabulku()
63+
64+
print(nasobilka[2][3]) # dva krát tři
65+
print(nasobilka[5][2]) # pět krát dva
66+
print(nasobilka[8][7]) # osm krát sedm
67+
68+
# Vypsání celé tabulky
69+
for radek in nasobilka:
70+
for cislo in radek:
71+
print(cislo, end=' ')
72+
print()
73+
```
74+
75+
Co s takovou „zapamatovanou” tabulkou?
76+
Můžeš si do ní uložit třeba pozice
77+
figurek na šachovnici nebo křížků a koleček
78+
ve *2D* piškvorkách.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
title: Vnořené seznamy
2+
style: md
3+
attribution: Pro PyLadies Brno napsal Petr Viktorin, 2014-2020.
4+
license: cc-by-sa-40

lessons/beginners/tuple/index.md

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ print(dvojice)
2323
```
2424

2525
Chovají se skoro stejně jako seznamy, jen nejdou měnit.
26-
Nemají tedy metody jako `append` a `pop` a nedá se jim přiřazovat do prvků.
27-
Dají se ale použít v cyklu `for` a dají se z nich číst jednotlivé prvky.
26+
Nemají tedy metody jako `append` a `pop` a nedá se jim přiřazovat do prvků
27+
(např. `ntice[1] = 2`).
28+
Dají se ale použít v cyklu `for` a dají se z nich číst jednotlivé prvky
29+
(např. `print(ntice[1])`).
2830

2931
```python
3032
osoby = 'máma', 'teta', 'babička'
@@ -62,7 +64,7 @@ print(seznam_dvojic)
6264

6365
<var>N</var>-tice se hodí, pokud chceš z funkce vrátit
6466
víc než jednu hodnotu.
65-
Když příkazu `return` oddělíš vracené hodnoty čárkou,
67+
Když u příkazu `return` použiješ vracených hodnoty oddělených čárkou,
6668
vypadá to, že vracíš několik hodnot, ale
6769
ve skutečnosti se vrací jen jedna <var>n</var>-tice.
6870

@@ -122,6 +124,10 @@ nebo seznam karet v balíčku.
122124
Oproti tomu `for pozdrav in 'Ahoj', 'Hello', 'Hola', 'Hei', 'SYN':`
123125
používá <var>n</var>-tici.
124126

127+
Když se počet prvků může v průběhu programu měnit, určitě sáhni po seznamu.
128+
Příklad budiž seznam přihlášených uživatelů, nevyřešených požadavků,
129+
karet v ruce nebo položek v inventáři.
130+
125131
<var>N</var>-tice se často používají na hodnoty
126132
různých typů, kdy má každá „pozice”
127133
v <var>n</var>-tici úplně jiný význam.
@@ -133,12 +139,12 @@ prvkem se zapisují trochu divně a má to své důvody:
133139
může-li nastat situace, kdy takovou sekvenci budeš
134140
potřebovat, většinou je lepší sáhnout po seznamu.
135141
Například seznam hracích karet v ruce nebo
136-
seznam lidí aktuálně přihlášených do soutěže
137-
může být občas prázdný.
142+
seznam lidí aktuálně sledujících video může být občas prázdný.
138143

139144
Seznamy i n-tice mají i technické limity:
140-
<var>n</var>-tice nejdou měnit a až se naučíme pracovat se slovníky,
141-
zjistíme že seznamy tam nepůjdou použít jako klíče.
145+
<var>n</var>-tice nejdou měnit a až se naučíš pracovat se slovníky,
146+
zjistíš že seznamy tam nepůjdou použít jako klíče.
147+
V takových případech je potřeba použít ten druhý typ sekvence.
142148

143-
Často není úplně jasné, který typ použít
144-
– v takovém případě je to pravděpodobně jedno.
149+
Často není úplně jasné, který typ použít.
150+
takovém případě je to pravděpodobně jedno.

0 commit comments

Comments
 (0)