Už víš, že pomocí return
lze z funkce vracet hodnotu:
def dvojnasobek(x):
return x * 2
Jak ale napsat funkci, která vrátí dvě hodnoty? Chci třeba napsat funkci, která spočítá podíl a zbytek po dělení.
Dvě hodnoty se dají vrátit jako seznam:
def podil_a_zbytek(a, b):
podil = a // b
zbytek = a % b
return [podil, zbytek]
print(podil_a_zbytek(5, 2))
Lepší je ale vrátit dvojici čísel – dvě čísla oddělená čárkou:
def podil_a_zbytek(a, b):
podil = a // b
zbytek = a % b
return podil, zbytek
print(podil_a_zbytek(5, 2))
Tomuhle se říká dvojice – nebo trojice, čtveřice, pětice, šestice, prostě n-tice (angl. tuple) hodnot. Funguje podobně jako seznam, ale nedají se do ní přidávat prvky, nebo odebírat a jinak měnit. Když mám trojici, vždycky zůstane jako trojice.
Když máš n-tici, můžeš ji přiřazením rozbalit (angl. unpack) do několika proměnných:
podil, zbytek = podil_a_zbytek(5, 2)
print(podil)
print(zbytek)
N-tice mají spoustu využití, například:
(2, 'piky')
Občas je potřeba dát n-tice do seznamu, např. abys uložila informace o celém balíčku hracích karet. V podobných případech je potřeba každou n-tici uzavřít do závorek, aby bylo jasné kde začíná a kde končí. Tady je seznam dvojic:
ruka = [(2, 'piky'), (10, 'kříže'), (8, 'káry')]
Když takový seznam máš, můžeš ho projít v cyklu for
s pomocí rozbalování:
for hodnota, barva in ruka:
print('Hraju', hodnota, 'a jsou to', barva)
N-tice, respektive sekvenci n-tic vrací funkce zip
,
která umožňuje projít zároveň několik seznamů,
jejichž prvky si navzájem odpovídají:
veci = ['tráva', 'slunce', 'mrkev', 'řeka']
barvy = ['zelená', 'žluté', 'oranžová', 'modrá']
mista = ['na zemi', 'nahoře', 'na talíři', 'za zídkou']
for vec, barva, misto in zip(veci, barvy, mista):
print(barva, vec, 'je', misto)
{ "data": { "sessionMaterial": { "id": "session-material:2018/snake-brno:intro:12", "title": "N-tice a rozbalovánĂ", "html": "\n \n \n\n <h1><var>N</var>-tice</h1>\n<p>Už víš, že pomocí <code>return</code> lze z funkce vracet hodnotu:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">dvojnasobek</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">):</span>\n <span class=\"k\">return</span> <span class=\"n\">x</span> <span class=\"o\">*</span> <span class=\"mi\">2</span>\n</pre></div><p>Jak ale napsat funkci, která vrátí dvě hodnoty?\nChci třeba napsat funkci, která spočítá podíl a zbytek po dělení.</p>\n<p>Dvě hodnoty se dají vrátit jako seznam:</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=\"n\">podil</span> <span class=\"o\">=</span> <span class=\"n\">a</span> <span class=\"o\">//</span> <span class=\"n\">b</span>\n <span class=\"n\">zbytek</span> <span class=\"o\">=</span> <span class=\"n\">a</span> <span class=\"o\">%</span> <span class=\"n\">b</span>\n\n <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"n\">podil</span><span class=\"p\">,</span> <span class=\"n\">zbytek</span><span class=\"p\">]</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">podil_a_zbytek</span><span class=\"p\">(</span><span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">))</span>\n</pre></div><p>Lepší je ale vrátit <em>dvojici</em> čísel – dvě čísla oddělená čárkou:</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=\"n\">podil</span> <span class=\"o\">=</span> <span class=\"n\">a</span> <span class=\"o\">//</span> <span class=\"n\">b</span>\n <span class=\"n\">zbytek</span> <span class=\"o\">=</span> <span class=\"n\">a</span> <span class=\"o\">%</span> <span class=\"n\">b</span>\n\n <span class=\"k\">return</span> <span class=\"n\">podil</span><span class=\"p\">,</span> <span class=\"n\">zbytek</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">podil_a_zbytek</span><span class=\"p\">(</span><span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">))</span>\n</pre></div><p>Tomuhle se říká dvojice – nebo trojice, čtveřice, pětice, šestice, prostě\n<var>n</var>-tice (angl. <em>tuple</em>) hodnot.\nFunguje podobně jako seznam, ale nedají se do ní přidávat prvky, nebo odebírat\na jinak měnit.\nKdyž mám trojici, vždycky zůstane jako trojice.</p>\n<p>Když máš <var>n</var>-tici, můžeš ji přiřazením <em>rozbalit</em> (angl. <em>unpack</em>)\ndo několika proměnných:</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\">5</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">podil</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zbytek</span><span class=\"p\">)</span>\n</pre></div><p><var>N</var>-tice mají spoustu využití, například:</p>\n<ul>\n<li>Bod v prostoru má 3 souřadnice – trojice čísel!</li>\n<li>Hrací karta má barvu a hodotu – dvojice čísla a řetězce, např. <code>(2, 'piky')</code></li>\n</ul>\n<p>Občas je potřeba dát <var>n</var>-tice do seznamu, např. abys uložila\ninformace o celém balíčku hracích karet.\nV podobných případech je potřeba každou <var>n</var>-tici uzavřít do závorek,\naby bylo jasné kde začíná a kde končí.\nTady je seznam dvojic:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">ruka</span> <span class=\"o\">=</span> <span class=\"p\">[(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s1\">'piky'</span><span class=\"p\">),</span> <span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"s1\">'kříže'</span><span class=\"p\">),</span> <span class=\"p\">(</span><span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"s1\">'káry'</span><span class=\"p\">)]</span>\n</pre></div><p>Když takový seznam máš, můžeš ho projít v cyklu <code>for</code> s pomocí rozbalování:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">for</span> <span class=\"n\">hodnota</span><span class=\"p\">,</span> <span class=\"n\">barva</span> <span class=\"ow\">in</span> <span class=\"n\">ruka</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Hraju'</span><span class=\"p\">,</span> <span class=\"n\">hodnota</span><span class=\"p\">,</span> <span class=\"s1\">'a jsou to'</span><span class=\"p\">,</span> <span class=\"n\">barva</span><span class=\"p\">)</span>\n</pre></div><h2>Zip</h2>\n<p><var>N</var>-tice, respektive sekvenci <var>n</var>-tic vrací funkce <code>zip</code>,\nkterá umožňuje projít zároveň několik seznamů,\njejichž prvky si navzájem odpovídají:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">veci</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'tráva'</span><span class=\"p\">,</span> <span class=\"s1\">'slunce'</span><span class=\"p\">,</span> <span class=\"s1\">'mrkev'</span><span class=\"p\">,</span> <span class=\"s1\">'řeka'</span><span class=\"p\">]</span>\n<span class=\"n\">barvy</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'zelená'</span><span class=\"p\">,</span> <span class=\"s1\">'žluté'</span><span class=\"p\">,</span> <span class=\"s1\">'oranžová'</span><span class=\"p\">,</span> <span class=\"s1\">'modrá'</span><span class=\"p\">]</span>\n<span class=\"n\">mista</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'na zemi'</span><span class=\"p\">,</span> <span class=\"s1\">'nahoře'</span><span class=\"p\">,</span> <span class=\"s1\">'na talíři'</span><span class=\"p\">,</span> <span class=\"s1\">'za zídkou'</span><span class=\"p\">]</span>\n\n<span class=\"k\">for</span> <span class=\"n\">vec</span><span class=\"p\">,</span> <span class=\"n\">barva</span><span class=\"p\">,</span> <span class=\"n\">misto</span> <span class=\"ow\">in</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">veci</span><span class=\"p\">,</span> <span class=\"n\">barvy</span><span class=\"p\">,</span> <span class=\"n\">mista</span><span class=\"p\">):</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">barva</span><span class=\"p\">,</span> <span class=\"n\">vec</span><span class=\"p\">,</span> <span class=\"s1\">'je'</span><span class=\"p\">,</span> <span class=\"n\">misto</span><span class=\"p\">)</span>\n</pre></div>\n\n\n " } } }