Když už známe seznam, podívejme se na jeho sestřičku: takzvanou n-tici (angl. tuple).
N-tice, podobně jako seznam, může obsahovat n prvků. N-tice se dvěma prvky je dvojice neboli pár (angl. pair); se třemi prvky trojice (angl. 3-tuple), se čtyřmi čtveřice (angl. 4-tuple), atd.
Existují i n-tice s jedním prvkem (hmm… „jednice”?) a s nula prvky (prázdné n-tice, angl. empty tuple), ale těmi se ze začátku nebudeme zabývat.
N-tice se tvoří jako seznamy, jen kolem sebe nemají hranaté závorky. Stačí čárky mezi prvky.
Chovají skoro stejně jako seznamy, jen nejdou měnit.
Nemají tedy metody jako append
a pop
a nedá se jim přiřazovat do prvků.
Dají se ale použít v cyklu for
a dají se z nich číst jednotlivé prvky.
osoby = 'máma', 'teta', 'babička'
for osoba in osoby:
print(osoba)
print('První je {}'.format(osoby[0]))
Vypadá to povědomě? Aby ne!
N-tice jsme už použili dříve:
for jmeno in 'Hynek', 'Vilém', 'Jarmila':
ve skutečnosti používá n-tici!
Když chceš n-tici předat do funkce, narazíš na problém, že čárka odděluje jednotlivé argumenty funkce. V podobných případech musíš n-tici uzavřít do závorek, aby bylo jasné, že jde o jednu hodnotu (byť složenou).
seznam_dvojic = []
for i in range(10):
# `append` bere jen jeden argument; dáme mu jednu dvojici
seznam_dvojic.append((i, i**2))
print(seznam_dvojic)
N-tice se hodí, pokud chceš z funkce vrátit
víc než jednu hodnotu.
Prostě v příkazu return
oddělíš vracené hodnoty čárkou.
Vypadá to, že vracíš několik hodnot, ale
ve skutečnosti se vrací jen jedna n-tice.
def podil_a_zbytek(a, b):
return a // b, a % b
Tahle funkce už mimochodem v Pythonu je: jmenuje se
divmod
a je vždy k dispozici
(nemusí se importovat).
Python umí ještě jeden trik: pokud chceš přiřadit do několika proměnných najednou, stačí je na levé straně rovnítka oddělit čárkou a na pravou stranu dát nějakou „složenou” hodnotu – třeba právě n-tici.
podil, zbytek = podil_a_zbytek(12, 5)
N-tice se k tomuto účelu hodí nejvíc, ale
jde to se všemi hodnotami, které jdou použít ve for
:
x, o = 'xo'
jedna, dva, tri = [1, 2, 3]
zip
je zajímavá funkce.
Používá se ve for
cyklech, podobně jako funkce range
, která „dává” čísla.
Když funkce zip
dostane dva seznamy
(či jiné věci použitelné ve for
),
„dává” dvojice, a to tak, že nejdřív spáruje
první prvek jednoho seznamu s prvním prvkem
druhého seznamu,
pak druhý s druhým, třetí s třetím a tak dál.
Hodí se to, když máš dva seznamy se stejnou strukturou – příslušné prvky k sobě „patří” a chceš je zpracovávat společně:
osoby = 'máma', 'teta', 'babička', 'vrah'
vlastnosti = 'hodná', 'milá', 'laskavá', 'zákeřný'
for osoba, vlastnost in zip(osoby, vlastnosti):
print('{} je {}'.format(osoba, vlastnost))
Když zip
dostane tři seznamy,
bude tvořit trojice, ze čtyř seznamů nadělá čtveřice a tak dále.
Další funkce, která vrací dvojice, je enumerate
.
Jako argument bere seznam (či jinou věc použitelnou
ve for
) a vždy spáruje index (pořadí v seznamu) s příslušným prvkem.
Jako první tedy dá
(0, první prvek seznamu), potom
(1, druhý prvek seznamu),
(2, třetí prvek seznamu)
a tak dále.
prvocisla = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
for i, prvocislo in enumerate(prvocisla):
print('Prvočíslo č.{} je {}'.format(i, prvocislo))
Jak vytvořit n-tici s žádným nebo jedním prvkem? Takhle:
prazdna_ntice = ()
jednoprvkova_ntice = ('a', )
Druhý příklad jde i bez závorek –
jednoprvkova_ntice = 'a',
–
ale to vypadá jako zapomenutá čárka.
Když budeš opravdu potřebovat jednoprvkovou
n-tici, radši ji pro přehlednost ozávorkuj.
Seznamy se používají, když předem nevíš,
kolik v nich přesně bude hodnot,
nebo když je hodnot mnoho.
Například seznam slov ve větě,
seznam účastníků soutěže, seznam tahů ve hře
nebo seznam karet v balíčku.
Oproti tomu for pozdrav in 'Ahoj', 'Hello', 'Hola', 'Hei', 'SYN':
používá n-tici.
N-tice se často používají na hodnoty
různých typů, kdy má každá „pozice”
v n-tici úplně jiný význam.
Například seznam můžeš použít na písmena abecedy,
ale dvojice index–hodnota z enumerate
je n-tice.
Prázdné n-tice a n-tice s jedním prvkem se zapisují trochu divně a má to své důvody: může-li nastat situace, kdy takovou sekvenci budeš potřebovat, většinou je lepší sáhnout po seznamu. Například seznam hracích karet v ruce nebo seznam lidí aktuálně přihlášených do soutěže může být občas prázdný.
Seznamy i n-tice mají i technické limity: n-tice nejdou měnit a až se naučíme pracovat se slovníky, zjistíme že seznamy tam nepůjdou použít jako klíče.
Často není úplně jasné, který typ použít – v takovém případě je to pravděpodobně jedno. Řiď se instinktem. :)
{ "data": { "sessionMaterial": { "id": "session-material:2019/pyladies-hradec-jaro:list:1", "title": "N-tice", "html": "\n \n \n\n <h2><var>N</var>-tice</h2>\n<p>Když už známe seznam, podívejme se na jeho sestřičku: takzvanou\n<var>n</var>-tici (angl. <em>tuple</em>).</p>\n<p><var>N</var>-tice, podobně jako seznam,\nmůže obsahovat <var>n</var> prvků. \n<var>N</var>-tice se dvěma prvky je <em>dvojice</em>\nneboli <em>pár</em> (angl. <em>pair</em>); se třemi\nprvky <em>trojice</em> (angl. <em>3-tuple</em>),\nse čtyřmi <em>čtveřice</em> (angl. <em>4-tuple</em>), atd.</p>\n<div class=\"admonition note\"><p>Existují i <var>n</var>-tice s jedním prvkem (hmm… „jednice”?)\na s nula prvky (prázdné <var>n</var>-tice, angl. <em>empty tuple</em>),\nale těmi se ze začátku nebudeme zabývat.</p>\n</div><p><var>N</var>-tice se tvoří jako seznamy, jen kolem sebe nemají hranaté závorky.\nStačí čárky mezi prvky.</p>\n<p>Chovají skoro stejně jako seznamy, jen nejdou měnit.\nNemají tedy metody jako <code>append</code>\na <code>pop</code> a nedá se jim přiřazovat do prvků.\nDají se ale použít v cyklu <code>for</code>\na dají se z nich číst jednotlivé prvky.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">osoby</span> <span class=\"o\">=</span> <span class=\"s1\">'máma'</span><span class=\"p\">,</span> <span class=\"s1\">'teta'</span><span class=\"p\">,</span> <span class=\"s1\">'babička'</span>\n<span class=\"k\">for</span> <span class=\"n\">osoba</span> <span class=\"ow\">in</span> <span class=\"n\">osoby</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">osoba</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'První je {}'</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">osoby</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]))</span>\n</pre></div><div class=\"admonition note\"><p>Vypadá to povědomě? Aby ne!\n<var>N</var>-tice jsme už použili dříve:\n<code>for jmeno in 'Hynek', 'Vilém', 'Jarmila':</code>\nve skutečnosti používá <var>n</var>-tici!</p>\n</div><p>Když chceš <var>n</var>-tici předat do funkce,\nnarazíš na problém, že čárka odděluje jednotlivé\nargumenty funkce.\nV podobných případech musíš <var>n</var>-tici\nuzavřít do závorek, aby bylo jasné, že jde o jednu\nhodnotu (byť složenou).</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">seznam_dvojic</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n<span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">):</span>\n <span class=\"c1\"># `append` bere jen jeden argument; dáme mu jednu dvojici</span>\n <span class=\"n\">seznam_dvojic</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">((</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">i</span><span class=\"o\">**</span><span class=\"mi\">2</span><span class=\"p\">))</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">seznam_dvojic</span><span class=\"p\">)</span>\n</pre></div><p><var>N</var>-tice se hodí, pokud chceš z funkce vrátit\nvíc než jednu hodnotu.\nProstě v příkazu <code>return</code> oddělíš vracené hodnoty čárkou.\nVypadá to, že vracíš několik hodnot, ale\nve skutečnosti se vrací jen jedna <var>n</var>-tice.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">podil_a_zbytek</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">):</span>\n <span class=\"k\">return</span> <span class=\"n\">a</span> <span class=\"o\">//</span> <span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">a</span> <span class=\"o\">%</span> <span class=\"n\">b</span>\n</pre></div><div class=\"admonition note\"><p>Tahle funkce už mimochodem v Pythonu je: jmenuje se\n<code>divmod</code> a je vždy k dispozici\n(nemusí se importovat).</p>\n</div><p>Python umí ještě jeden trik: pokud chceš přiřadit\ndo několika proměnných najednou, stačí je na levé\nstraně rovnítka oddělit čárkou a na pravou stranu\ndát nějakou „složenou” hodnotu – třeba právě\n<var>n</var>-tici.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">podil</span><span class=\"p\">,</span> <span class=\"n\">zbytek</span> <span class=\"o\">=</span> <span class=\"n\">podil_a_zbytek</span><span class=\"p\">(</span><span class=\"mi\">12</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">)</span>\n</pre></div><p><var>N</var>-tice se k tomuto účelu hodí nejvíc, ale\njde to se všemi hodnotami, které jdou použít ve <code>for</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">o</span> <span class=\"o\">=</span> <span class=\"s1\">'xo'</span>\n<span class=\"n\">jedna</span><span class=\"p\">,</span> <span class=\"n\">dva</span><span class=\"p\">,</span> <span class=\"n\">tri</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">]</span>\n</pre></div><h2>Funkce, které vracejí <var>n</var>-tice</h2>\n<p><code>zip</code> je zajímavá funkce.\nPoužívá se ve <code>for</code> cyklech, podobně jako funkce <code>range</code>, která „dává” čísla.</p>\n<p>Když funkce <code>zip</code> dostane dva seznamy\n(či jiné věci použitelné ve <code>for</code>),\n„dává” dvojice, a to tak, že nejdřív spáruje\nprvní prvek jednoho seznamu s prvním prvkem\ndruhého seznamu,\npak druhý s druhým, třetí s třetím a tak dál.</p>\n<p>Hodí se to, když máš dva seznamy se stejnou\nstrukturou – příslušné prvky k sobě „patří”\na chceš je zpracovávat společně:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">osoby</span> <span class=\"o\">=</span> <span class=\"s1\">'máma'</span><span class=\"p\">,</span> <span class=\"s1\">'teta'</span><span class=\"p\">,</span> <span class=\"s1\">'babička'</span><span class=\"p\">,</span> <span class=\"s1\">'vrah'</span>\n<span class=\"n\">vlastnosti</span> <span class=\"o\">=</span> <span class=\"s1\">'hodná'</span><span class=\"p\">,</span> <span class=\"s1\">'milá'</span><span class=\"p\">,</span> <span class=\"s1\">'laskavá'</span><span class=\"p\">,</span> <span class=\"s1\">'zákeřný'</span>\n<span class=\"k\">for</span> <span class=\"n\">osoba</span><span class=\"p\">,</span> <span class=\"n\">vlastnost</span> <span class=\"ow\">in</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">osoby</span><span class=\"p\">,</span> <span class=\"n\">vlastnosti</span><span class=\"p\">):</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'{} je {}'</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">osoba</span><span class=\"p\">,</span> <span class=\"n\">vlastnost</span><span class=\"p\">))</span>\n</pre></div><p>Když <code>zip</code> dostane tři seznamy,\nbude tvořit trojice, ze čtyř seznamů nadělá čtveřice a tak dále.</p>\n<p>Další funkce, která vrací dvojice, je <code>enumerate</code>.\nJako argument bere seznam (či jinou věc použitelnou\nve <code>for</code>) a vždy spáruje index (pořadí v seznamu) s příslušným prvkem.\nJako první tedy dá\n(0, <em>první prvek seznamu</em>), potom\n(1, <em>druhý prvek seznamu</em>),\n(2, <em>třetí prvek seznamu</em>)\na tak dále.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">prvocisla</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">7</span><span class=\"p\">,</span> <span class=\"mi\">11</span><span class=\"p\">,</span> <span class=\"mi\">13</span><span class=\"p\">,</span> <span class=\"mi\">17</span><span class=\"p\">,</span> <span class=\"mi\">19</span><span class=\"p\">,</span> <span class=\"mi\">23</span><span class=\"p\">,</span> <span class=\"mi\">29</span><span class=\"p\">]</span>\n\n<span class=\"k\">for</span> <span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">prvocislo</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">prvocisla</span><span class=\"p\">):</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Prvočíslo č.{} je {}'</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">prvocislo</span><span class=\"p\">))</span>\n</pre></div><h2>Malé <var>n</var>-tice</h2>\n<p>Jak vytvořit <var>n</var>-tici s žádným nebo jedním prvkem? Takhle:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">prazdna_ntice</span> <span class=\"o\">=</span> <span class=\"p\">()</span>\n<span class=\"n\">jednoprvkova_ntice</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">'a'</span><span class=\"p\">,</span> <span class=\"p\">)</span>\n</pre></div><p>Druhý příklad jde i bez závorek –\n<code>jednoprvkova_ntice = 'a',</code> –\nale to vypadá jako zapomenutá čárka.\nKdyž budeš <em>opravdu</em> potřebovat jednoprvkovou\n<var>n</var>-tici, radši ji pro přehlednost ozávorkuj.</p>\n<h2>Kdy použít seznam a kdy <var>n</var>-tici?</h2>\n<p>Seznamy se používají, když předem nevíš,\nkolik v nich přesně bude hodnot,\nnebo když je hodnot mnoho.\nNapříklad seznam slov ve větě,\nseznam účastníků soutěže, seznam tahů ve hře\nnebo seznam karet v balíčku.\nOproti tomu <code>for pozdrav in 'Ahoj', 'Hello', 'Hola', 'Hei', 'SYN':</code>\npoužívá <var>n</var>-tici.</p>\n<p><var>N</var>-tice se často používají na hodnoty\nrůzných typů, kdy má každá „pozice”\nv <var>n</var>-tici úplně jiný význam.\nNapříklad seznam můžeš použít na písmena abecedy,\nale dvojice index–hodnota z <code>enumerate</code>\nje <var>n</var>-tice.</p>\n<p>Prázdné <var>n</var>-tice a <var>n</var>-tice s jedním\nprvkem se zapisují trochu divně a má to své důvody:\nmůže-li nastat situace, kdy takovou sekvenci budeš\npotřebovat, většinou je lepší sáhnout po seznamu.\nNapříklad seznam hracích karet v ruce nebo\nseznam lidí aktuálně přihlášených do soutěže\nmůže být občas prázdný.</p>\n<p>Seznamy i n-tice mají i technické limity:\n<var>n</var>-tice nejdou měnit a až se naučíme pracovat se slovníky,\nzjistíme že seznamy tam nepůjdou použít jako klíče.</p>\n<p>Často není úplně jasné, který typ použít\n– v takovém případě je to pravděpodobně jedno.\nŘiď se instinktem. :)</p>\n\n\n " } } }