Funkce range(10)
vrátí speciální hodnotu,
která v sobě obsahuje čísla od 0 do 9:
>>> sekvence = range(10)
>>> sekvence
range(0, 10)
Je to hodnota typu range
, podobně jako čísla jsou typu int
, řetězce typu
str
, nebo seznamy typu list
.
Chceš-li se podívat, co v tomhle range(0, 10)
vlastně je, máš dvě základní
možnosti – projít ho cyklem for
nebo převést na seznam konkrétních čísel:
>>> sekvence
range(0, 10)
>>> for i in sekvence:
... print(i)
0
1
2
3
4
5
6
7
8
9
>>> list(sekvence)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Možná se ptáš – proč tak složitě?
Proč se místo range(0, 10)
prostě ta čísla neukážou rovnou?
Je to proto, že range
se dá použít na opravdu dlouhé řady čísel:
>>> range(10000)
range(0, 10000)
>>> list(range(10000))
[0, 1, 2, 3, ..., 9999]
Kdybys zkusila třeba list(range(1000000000000000000))
, počítači
dojde paměť.
Miliarda čísel se tam prostě nevejde.
Python vyhodí výjimku MemoryError
.
Se samotným range(1000000000000000000)
ale není problém.
S konceptem čísel od 0 do miliardy se počítač vypořádá, i když si je neumí
„zapamatovat“ všechny najednou.
Je spousta věcí, které Python umí s range
udělat, aniž by potřeboval
„spočítat“ každé z čísel.
Spousta operací, které znáš od seznamů, bude fungovat i s range
:
>>> zajimava_cisla = range(8, 10000, 3) # Každé třetí číslo od 8 do 9999
>>> zajimava_cisla[80] # Osmdesáté "zajímavé číslo"
248
>>> zajimava_cisla[:5] # Prvních 5 "zajímavých čísel"
range(8, 23, 3)
>>> list(zajimava_cisla[:5]) # Vypsání prvních 5 "zajímavých čísel"
[8, 11, 14, 17, 20]
>>> len(zajimava_cisla) # Kolik tam je čísel?
3331
>>> 1337 in zajimava_cisla # Je v této sekvenci moje konkrétní číslo ?
True
>>> zajimava_cisla.index(1337) # Kolikáté je?
443
>>> import random
>>> random.choice(zajimava_cisla)
1229
>>> for i in zajimava_cisla:
... print(i)
... if i > 20:
... break # Stačilo!
8
11
14
17
20
23
Objekt range
ale nejde měnit – metody jako zajimava_cisla.sort()
,
zajimava_cisla.pop()
fungovat nebudou.
{ "data": { "sessionMaterial": { "id": "session-material:2019/brno-jaro-2019-pondeli:solitaire:0", "title": "Range - sekvence čísel", "html": "\n \n \n\n <h1>Range – sekvence čísel</h1>\n<p>Funkce <code>range(10)</code> vrátí speciální hodnotu,\nkterá v sobě obsahuje čísla od 0 do 9:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">>>> </span><span class=\"n\">sekvence</span> <span class=\"o\">=</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n<span class=\"gp\">>>> </span><span class=\"n\">sekvence</span>\n<span class=\"go\">range(0, 10)</span>\n</pre></div><p>Je to hodnota typu <code>range</code>, podobně jako čísla jsou typu <code>int</code>, řetězce typu\n<code>str</code>, nebo seznamy typu <code>list</code>.</p>\n<p>Chceš-li se podívat, co v tomhle <code>range(0, 10)</code> vlastně je, máš dvě základní\nmožnosti – projít ho cyklem <code>for</code> nebo převést na seznam konkrétních čísel:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">>>> </span><span class=\"n\">sekvence</span>\n<span class=\"go\">range(0, 10)</span>\n<span class=\"gp\">>>> </span><span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">sekvence</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span> <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)</span>\n<span class=\"go\">0</span>\n<span class=\"go\">1</span>\n<span class=\"go\">2</span>\n<span class=\"go\">3</span>\n<span class=\"go\">4</span>\n<span class=\"go\">5</span>\n<span class=\"go\">6</span>\n<span class=\"go\">7</span>\n<span class=\"go\">8</span>\n<span class=\"go\">9</span>\n<span class=\"gp\">>>> </span><span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">sekvence</span><span class=\"p\">)</span>\n<span class=\"go\">[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</span>\n</pre></div><p>Možná se ptáš – proč tak složitě?\nProč se místo <code>range(0, 10)</code> prostě ta čísla neukážou rovnou?</p>\n<p>Je to proto, že <code>range</code> se dá použít na opravdu dlouhé řady čísel:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">>>> </span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">10000</span><span class=\"p\">)</span>\n<span class=\"go\">range(0, 10000)</span>\n<span class=\"gp\">>>> </span><span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">10000</span><span class=\"p\">))</span>\n<span class=\"go\">[0, 1, 2, 3, ..., 9999]</span>\n</pre></div><p>Kdybys zkusila třeba <code>list(range(1000000000000000000))</code>, počítači\ndojde paměť.\nMiliarda čísel se tam prostě nevejde.\nPython vyhodí výjimku <code>MemoryError</code>.\nSe samotným <code>range(1000000000000000000)</code> ale není problém.\nS konceptem čísel od 0 do miliardy se počítač vypořádá, i když si je neumí\n„zapamatovat“ všechny <em>najednou</em>.</p>\n<p>Je spousta věcí, které Python umí s <code>range</code> udělat, aniž by potřeboval\n„spočítat“ každé z čísel.\nSpousta operací, které znáš od seznamů, bude fungovat i s <code>range</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">>>> </span><span class=\"n\">zajimava_cisla</span> <span class=\"o\">=</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"mi\">10000</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">)</span> <span class=\"c1\"># Každé třetí číslo od 8 do 9999</span>\n<span class=\"gp\">>>> </span><span class=\"n\">zajimava_cisla</span><span class=\"p\">[</span><span class=\"mi\">80</span><span class=\"p\">]</span> <span class=\"c1\"># Osmdesáté "zajímavé číslo"</span>\n<span class=\"go\">248</span>\n<span class=\"gp\">>>> </span><span class=\"n\">zajimava_cisla</span><span class=\"p\">[:</span><span class=\"mi\">5</span><span class=\"p\">]</span> <span class=\"c1\"># Prvních 5 "zajímavých čísel"</span>\n<span class=\"go\">range(8, 23, 3)</span>\n<span class=\"gp\">>>> </span><span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">zajimava_cisla</span><span class=\"p\">[:</span><span class=\"mi\">5</span><span class=\"p\">])</span> <span class=\"c1\"># Vypsání prvních 5 "zajímavých čísel"</span>\n<span class=\"go\">[8, 11, 14, 17, 20]</span>\n<span class=\"gp\">>>> </span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">zajimava_cisla</span><span class=\"p\">)</span> <span class=\"c1\"># Kolik tam je čísel?</span>\n<span class=\"go\">3331</span>\n<span class=\"gp\">>>> </span><span class=\"mi\">1337</span> <span class=\"ow\">in</span> <span class=\"n\">zajimava_cisla</span> <span class=\"c1\"># Je v této sekvenci moje konkrétní číslo ?</span>\n<span class=\"go\">True</span>\n<span class=\"gp\">>>> </span><span class=\"n\">zajimava_cisla</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">(</span><span class=\"mi\">1337</span><span class=\"p\">)</span> <span class=\"c1\"># Kolikáté je?</span>\n<span class=\"go\">443</span>\n</pre></div><div class=\"highlight\"><pre><span></span><span class=\"gp\">>>> </span><span class=\"kn\">import</span> <span class=\"nn\">random</span>\n<span class=\"gp\">>>> </span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">choice</span><span class=\"p\">(</span><span class=\"n\">zajimava_cisla</span><span class=\"p\">)</span>\n<span class=\"go\">1229</span>\n</pre></div><div class=\"highlight\"><pre><span></span><span class=\"gp\">>>> </span><span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">zajimava_cisla</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span> <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span> <span class=\"k\">if</span> <span class=\"n\">i</span> <span class=\"o\">></span> <span class=\"mi\">20</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span> <span class=\"k\">break</span> <span class=\"c1\"># Stačilo!</span>\n<span class=\"go\">8</span>\n<span class=\"go\">11</span>\n<span class=\"go\">14</span>\n<span class=\"go\">17</span>\n<span class=\"go\">20</span>\n<span class=\"go\">23</span>\n</pre></div><p>Objekt <code>range</code> ale nejde měnit – metody jako <code>zajimava_cisla.sort()</code>,\n<code>zajimava_cisla.pop()</code> fungovat nebudou.</p>\n\n\n " } } }