Skip to content

Commit 82dbcb5

Browse files
committed
Adjust materials for range, zip, enumerate
1 parent bbb284f commit 82dbcb5

2 files changed

Lines changed: 65 additions & 17 deletions

File tree

lessons/beginners/range/index.md

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,27 @@ range(0, 10000)
4646
[0, 1, 2, 3, ..., 9999]
4747
```
4848

49-
Kdybys zkusil{{a}} třeba `list(range(1000000000000000000))`, počítači
49+
Kdybys zkusil{{a}} třeba `list(range(1000000000000000))`, počítači
5050
dojde paměť.
51-
Miliarda čísel se tam prostě nevejde.
51+
Biliarda čísel se tam prostě nevejde.
5252
Python vyhodí výjimku `MemoryError`.
53-
Se samotným `range(1000000000000000000)` ale není problém.
54-
S konceptem čísel od 0 do miliardy se počítač vypořádá, i když si je neumí
55-
„zapamatovat“ všechny *najednou*.
53+
54+
55+
> [warning]
56+
> Pokud máš na počítači v jiném okně neuloženou práci, radši `list(range(...))`
57+
> s hodně vysokými čísly nezkoušej.
58+
>
59+
> U absurdně vysokého čísla jako `1000000000000000` Python předem ví,
60+
> že mu paměť dojde, a tak ohlásí chybu ještě než se bude snažit seznam vytvořit.
61+
> U trochu menšího čísla (např. `1000000000`, ale na každém počítači je to
62+
> jinak) se může stát, že se Python pokusí seznam začít tvořit, zaplní přitom
63+
> většinu dostupné paměti a počítač „zamrzne“.
64+
> V závislosti na systému se pak třeba může stát že reakce na
65+
> <kbd>Ctrl</kbd>+<kbd>C</kbd> bude trvat hodně dlouho.
66+
67+
Se samotným `range(1000000000000000)` ale není problém.
68+
S konceptem *všech čísel od 0 do biliardy* se počítač vypořádá, i když si je
69+
neumí „zapamatovat“ všechny *najednou*.
5670

5771
Je spousta věcí, které Python umí s `range` udělat, aniž by potřeboval
5872
„spočítat“ každé z čísel.
@@ -93,6 +107,25 @@ True
93107
23
94108
```
95109

96-
Objekt `range` ale nejde měnit – metody jako `zajimava_cisla.sort()`,
97-
`zajimava_cisla.pop()` fungovat nebudou.
110+
Objekt `range` ale nejde měnit – mazání prvků nebo metody jako
111+
`zajimava_cisla.sort()`, `zajimava_cisla.pop()` fungovat nebudou.
112+
113+
> [note] Proč ne?
114+
> Když máš objekt jako `range(8, 10000, 3)`, osmdesátý prvek je jen trocha
115+
> matematiky: spočítáš `8 + 3 * 80` a zkontroluješ že to nepřesáhlo `10000`.
116+
> Podobně je to s ostatními sekvencemi „všech <var>X</var>-tých čísel od
117+
> <var>A</var> do <var>B</var>“, tedy s ostatními `range`.
118+
>
119+
> Kdyby ale šlo udělat něco jako:
120+
>
121+
> ```python
122+
> sekvence = range(8, 10000, 3)
123+
> del sekvence[10]
124+
> sekvence.insert(103, 'ježek')
125+
> ```
126+
>
127+
> … jde najednou o mnohem složitější koncept, kde se N-tý prvek hledá mnohem
128+
> hůř. Už to není jednoduchá sekvence čísel – už to není `range`, ale spíš
129+
> seznam jakýchkoli hodnot.
98130
131+
Pokud budeš něco co `range` neumí potřebovat, převeď `range` na seznam.

lessons/beginners/zip-enumerate/index.md

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Spousta těchto typů umí něco navíc: zjistit jestli obsahují nějaký prvek
1818
Nic z toho ale není potřeba, aby byl objekt iterovatelný.
1919

2020
Podívejme se na dva další iterovatelné objekty: `enumerate` a `zip`.
21+
Oba jsou sekvence vytvořené z jiných, jednodušších sekvencí.
2122

2223

2324
## Enumerate: očíslování sekvence
@@ -59,9 +60,23 @@ for dvojice in enumerate(trpaslici):
5960
Objekt, který funkce `enumerate` vrací, je *iterátor dvojic* – sekvence,
6061
jejíž prvky jsou dvojice.
6162

63+
Sekvence `enumerate` toho „umí“ ještě míň než seznam nebo `range`.
64+
Nejde z ní ani vybírat prvky, o metodách jako `append` ani nemluvě:
65+
66+
```pycon
67+
>>> enumerate(trpaslici)[3]
68+
Traceback (most recent call last):
69+
File "<stdin>", line 1, in <module>
70+
TypeError: 'enumerate' object is not subscriptable
71+
```
72+
73+
Když budeš od sekvence `enumerate` chtít něco víc než iterování,
74+
převeď ji na seznam.
75+
76+
6277
## Rozbalování v cyklu for
6378

64-
Cyklus `for` umíme rozepsat: opakuje se v něm nastavení proměnné (které dělá
79+
Cyklus `for` umíš rozepsat: opakuje se v něm nastavení proměnné (které dělá
6580
`for` za tebe), pak tělo cyklu, a znovu nastavení proměnné, tělo cyklu, atd.
6681
Pro „trpasličí“ cyklus to je:
6782

@@ -155,11 +170,11 @@ for index, den in enumerate(dny, start=1):
155170
Další iterátor <var>n</var>-tic je funkce `zip`, která umí projít dvě sekvence
156171
naráz.
157172

158-
Řekněme že máš seznam věcí a k nim příslušných barev:
173+
Řekněme že máš seznam věcí a druhý seznam, ve kterém jsou barvy těch věcí:
159174

160175
``` python
161-
veci = ['tráva', 'slunce', 'mrkev', 'řeka']
162-
barvy = ['zelená', 'žluté', 'oranžová', 'modrá']
176+
veci = ['tráva', 'slunce', 'mrkev', 'list']
177+
barvy = ['zelená', 'žluté', 'oranžová', 'zelený']
163178
```
164179

165180
Když na ně zavoláš `zip`, dostaneš iterátor, který (podobně jako `enumerate`
@@ -179,7 +194,7 @@ Po převedení na seznam se ale ukáže seznam odpovídajících si dvojic:
179194

180195
```pycon
181196
>>> list(zip(veci, barvy))
182-
[('tráva', 'zelená'), ('slunce', 'žluté'), ('mrkev', 'oranžová'), ('řeka', 'modrá')]
197+
[('tráva', 'zelená'), ('slunce', 'žluté'), ('mrkev', 'oranžová'), ('list', 'zelený')]
183198
```
184199

185200
Takové dvojice jsou připravené na to, že je rozbalíš v cyklu `for`:
@@ -194,9 +209,9 @@ V následujícím případě vznikne iterátor čtveřic (věc, barva,
194209
místo, číslo):
195210

196211
```python
197-
veci = ['tráva', 'slunce', 'mrkev', 'řeka']
198-
barvy = ['zelená', 'žluté', 'oranžová', 'modrá']
199-
mista = ['na zemi', 'nahoře', 'na talíři', 'za zídkou']
212+
veci = ['tráva', 'slunce', 'mrkev', 'list']
213+
barvy = ['zelená', 'žluté', 'oranžová', 'zelený']
214+
mista = ['na zemi', 'nahoře', 'na talíři', 'na stromě']
200215
cisla = range(4)
201216

202217
for vec, barva, misto, cislo in zip(veci, barvy, mista, cisla):
@@ -209,8 +224,8 @@ for vec, barva, misto, cislo in zip(veci, barvy, mista, cisla):
209224
Jak se `zip` chová, když dostane seznamy různých délek?
210225

211226
```python
212-
veci = ['tráva', 'slunce', 'mrkev', 'řeka', 'myšlenka', 'spravedlnost']
213-
barvy = ['zelená', 'žluté', 'oranžová', 'modrá']
227+
veci = ['tráva', 'slunce', 'mrkev', 'list', 'myšlenka', 'spravedlnost']
228+
barvy = ['zelená', 'žluté', 'oranžová', 'zelený']
214229
for vec, barva in zip(veci, barvy):
215230
print(f"{vec} je {barva}")
216231
```

0 commit comments

Comments
 (0)