Řetězce

Teď se podíváme na zoubek řetězcům (angl. strings). Už víš, jak je zapisovat:

'tohle je řetězec'
"tohle taky"

Někdy potřebuješ řetězce, které obsahují více řádků. Pythonní řetězce ale můžeš normálně napsat jen na jeden řádek. Jinak by koncová uvozovka mohla být kdekoli a špatně by se hledala, kdybys na ni zapomněla.

Můžeš ale do řetězce znak pro nový řádek vložit pomocí speciálního zápisu \n:

print('Haló haló!\nCo se stalo?')

Obecně zpětné lomítko umožňuje zapsat znaky, které by se špatně zadávaly. Třeba uvozovka se dá zapsat jako \" a „apostrof“ jako \'. To se dá použít, když potřebuješ mít v jednom řetězci uvozovku i apostrof:

print("Vtom vnuk křik': \"Hleď!\"")
print('"Jen ho nech," řek\' děd. "Kdo zná líp kraj?"')

Zpětným lomítkem se dají přidávat i exotické znaky, které nemáš na klávesnici. Ty se dají zapsat jako \N a jméno znaku v složených („kudrnatých“) závorkách. Třeba následující znaky. (Do konzole na Windows bohužel nemusí jít všechny vypsat, ale aspoň první by jít měl):

print('--\N{LATIN SMALL LETTER L WITH STROKE}--')
print('--\N{SECTION SIGN}--')
print('--\N{PER MILLE SIGN}--')
print('--\N{BLACK STAR}--')
print('--\N{SNOWMAN}--')
print('--\N{KATAKANA LETTER TU}--')

Tahle vychytávka má jeden, někdy nepříjemný, důsledek: pokud chceš použít zpětné lomítko (třeba ve jménech souborů na Windows), musíš ho ve zdrojovém kódu zdvojit. Sekvence \\ znamená „jedno zpětné lomítko“.

print('C:\\PyLadies\\Nový adresář')

Ale zpátky k řetězcům na více řádků. Kromě \n je i druhý způsob, jak takový řetězec zadat: ohraničit ho třemi uvozovkami (jednoduchými nebo dvojitými) na každé straně:

basen = '''Haló haló!
Co se stalo?
Prase kozu potrkalo!'''

Takové dlouhé texty nachází uplatnění třeba v dokumentačních řetězcích u funkcí.

def vynasob(a, b):
    """Vynásobí argumenty a vrátí výsledek.

    Oba argumenty by měly být čísla.
    """

    return a * b

Jen pozor na to, že pokud je tenhle řetězec v odsazeném kódu, každý jeho řádek bude začínat několika mezerami. (V dokumentačních řetězcích to nevadí, tam se s odsazením počítá.)

Tolik k zápisu řetězců. Teď se podíváme, jak se zadanými řetězci pracovat.

Výběr znaků

Už umíš spojovat dohromady kratší řetězce:

spojeny_retezec = 'a' + 'b'
dlouhy_retezec = 'ó' * 100

Teď se podíváme na opačný proces: jak z dlouhého řetězce dostat kratší součásti. Začneme jednotlivými znaky. Dělá se to operací vybrání prvku (angl. subscripting), která se píše podobně jako volání funkce, jen s hranatými závorkami:

pate_pismeno = 'čokoláda'[5]

print(pate_pismeno)

Funguje to? Dostala jsi opravdu páté písmeno?

Řešení

Jak sis možná už všimla, programátoři počítají od nuly. „První“ prvek má vždy číslo nula, druhý číslo jedna a tak dál.

Stejně je to i s písmeny v řetězcích: první písmeno má číslo nula, druhé jedna, ... a osmé písmeno má číslo sedm.

Proč je tomu tak? K úplnému pochopení důvodů by ses potřebovala naučit něco o ukazatelích a polích, což nebude hned, takže pro teď nám bude stačit vědět, že programátoři jsou prostě divní.

A nebo že mají rádi divná čísla jako nulu.

   [0] [1] [2] [3] [4] [5] [6] [7]

  ╭───┬───┬───┬───┬───┬───┬───┬───╮
  │ Č │ o │ k │ o │ l │ á │ d │ a │
  ╰───┴───┴───┴───┴───┴───┴───┴───╯

A když už jsme u divných čísel, co se asi stane, když budu chtít vybírat písmena pomocí záporných čísel?

Řešení

Řetězce umí i jiné triky. Třeba můžeš zjistit, jak je řetězec dlouhý nebo jestli v sobě obsahuje daný menší řetězec.

Zápis Popis Příklad
len(r) Délka řetězce len('čokoláda')
x in r True pokud je řetězec x obsažen v r 'oko' in 'čokoláda'
x not in r Opak x in r 'dub' not in 'čokoláda

Řetězce vždy berou v potaz velikost písmen, takže např. 'ČOKO' in 'čokoláda' je False. Kdybys chtěla porovnávat bez ohledu na velikost písmen, musela bys oba řetězce převést třeba na malá písmena a pak je porovnat.

A jak se převádí na malá písmena? K tomu budeme potřebovat další novou vlastnost Pythonu: metody.

Metody

Metoda (angl. method) je jako funkce – něco, co se dá zavolat. Na rozdíl od funkce je svázaná s nějakým objektem (hodnotou). Volá se tak, že se za objekt napíše tečka, za ní jméno metody a za to celé se, jako u funkcí, připojí závorky s případnými argumenty.

Řetězcové metody upper() a lower() převádí text na velká, respektive malá písmena.

retezec = 'Ahoj'
print(retezec.upper())
print(retezec.lower())
print(retezec)

Všimni si, že původní řetězec se nemění; metoda vrátí nový řetězec, ten starý zůstává.

To je obecná vlastnost řetězců v Pythonu: jednou existující řetězec se už nedá změnit, dá se jen vytvořit nějaký odvozený.

Iniciály

Pro procvičení metod a vybírání znaků si zkus napsat program, který se zeptá na jméno, pak na příjmení a pak vypíše iniciály – první písmena zadaných jmen.

Iniciály jsou vždycky velkými písmeny (i kdyby byl uživatel líný mačkat Shift).

Řešení

Řetězcových metod je celá řada. Nejužitečnější z nich najdeš v taháku, který si můžeš stáhnout či vytisknout.

A úplně všechny řetězcové metody jsou popsány v dokumentaci Pythonu (anglicky; plné věcí, které ještě neznáš).

Všimni si, že len není metoda, ale funkce; píše se len(r), ne r.len(). Proč tomu tak je, to za nějakou dobu poznáš.

Formátování

Obzvláště užitečná je metoda format, která v rámci řetězce nahradí dvojice „kudrnatých“ závorek za to, co dostane v argumentech:

vypis = '{}×{} je {}'.format(3, 4, 3 * 4)
print(vypis)

Řetězec '{}×{} je {}' tady funguje jako šablona (angl. template). Představ si to jako jako formulář, do kterého Python na vyznačená místa vpisuje hodnoty.

Pokud chceš nahradit hodnoty v jiném pořadí, nebo když chceš aby šablona byla čitelnější, můžeš do „kudrnatých“ závorek napsat jména:

vypis = 'Ahoj {jmeno}! Výsledek je {cislo}.'.format(cislo=7, jmeno='Elvíro')
print(vypis)

Formátování se používá skoro všude, kde je potřeba „hezky“ vypsat nějakou hodnotu.

Sekání řetězců

Teď se vrátíme k vybírání kousků řetězců. Zkus, co dělá tenhle program:

retezec = 'čokoláda'
kousek = retezec[5:]
print(kousek)

Řešení

Dá se použít i retezec[:5], který vybere všechno až po znak číslo 5. Ale ne znak 5 samotný, takže retezec[:5] + retezec[5:] == retezec.

Co asi udělá retezec[2:5]?

A co retezec[-4:]?

retezec = 'čokoláda'
print(retezec[:4])
print(retezec[2:5])
print(retezec[-4:])

Určování vhodných čísel, indexů, občas vyžaduje trochu zamyšlení.

U podobného „sekání“ (angl. string slicing) je lepší si číslovat „hranice“ mezi znaky. Člověk tomu pak lépe rozumí:

  ╭───┬───┬───┬───┬───┬───┬───┬───╮
  │ Č │ o │ k │ o │ l │ á │ d │ a │
  ├───┼───┼───┼───┼───┼───┼───┼───┤
  │   │   │   │   │   │   │   │   │
  0   1   2   3   4   5   6   7   8
 -8  -7  -6  -5  -4  -3  -2  -1

  ╰───────────────╯
  'čokoláda'[:4] == 'čoko'

          ╰───────────────╯
        'čokoláda'[2:6] == 'kolá'

                      ╰───────────╯
                      'čokoláda'[-3:] == 'áda'

Cvičení

Zkus napsat funkci zamen(retezec, pozice, znak).

Tato funkce vrátí řetězec, který má na dané pozici daný znak; jinak je stejný jako původní retezec. Např:

zamen('palec', 0, 'v') == 'valec'
zamen('valec', 2, 'j') == 'vajec'

Pozor na to, že řetězce v Pythonu nelze měnit. Musíš vytvořit nový řetězec poskládaný z částí toho starého.

Řešení

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2017/pyladies-ostrava-podzim:def-str:1",
      "title": "Řetězce",
      "html": "\n          \n    \n\n    <h1>&#x158;et&#x11B;zce</h1>\n<p>Te&#x10F; se pod&#xED;v&#xE1;me na zoubek &#x159;et&#x11B;zc&#x16F;m (angl. <em>strings</em>).\nU&#x17E; v&#xED;&#x161;, jak je zapisovat:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"s1\">&apos;tohle je &#x159;et&#x11B;zec&apos;</span>\n<span class=\"s2\">&quot;tohle taky&quot;</span>\n</pre></div><p>N&#x11B;kdy pot&#x159;ebuje&#x161; &#x159;et&#x11B;zce, kter&#xE9; obsahuj&#xED; v&#xED;ce &#x159;&#xE1;dk&#x16F;.\nPythonn&#xED; &#x159;et&#x11B;zce ale m&#x16F;&#x17E;e&#x161; norm&#xE1;ln&#x11B; napsat jen na jeden &#x159;&#xE1;dek.\nJinak by koncov&#xE1; uvozovka mohla b&#xFD;t kdekoli\na &#x161;patn&#x11B; by se hledala, kdybys na ni zapomn&#x11B;la.</p>\n<p>M&#x16F;&#x17E;e&#x161; ale do &#x159;et&#x11B;zce znak pro nov&#xFD; &#x159;&#xE1;dek vlo&#x17E;it pomoc&#xED; speci&#xE1;ln&#xED;ho\nz&#xE1;pisu <code>\\n</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Hal&#xF3; hal&#xF3;!</span><span class=\"se\">\\n</span><span class=\"s1\">Co se stalo?&apos;</span><span class=\"p\">)</span>\n</pre></div><p>Obecn&#x11B; zp&#x11B;tn&#xE9; lom&#xED;tko umo&#x17E;&#x148;uje zapsat znaky, kter&#xE9; by se &#x161;patn&#x11B; zad&#xE1;valy.\nT&#x159;eba uvozovka se d&#xE1; zapsat jako <code>\\&quot;</code> a &#x201E;apostrof&#x201C; jako <code>\\&apos;</code>.\nTo se d&#xE1; pou&#x17E;&#xED;t, kdy&#x17E; pot&#x159;ebuje&#x161; m&#xED;t v jednom\n&#x159;et&#x11B;zci uvozovku i apostrof:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Vtom vnuk k&#x159;ik&apos;: </span><span class=\"se\">\\&quot;</span><span class=\"s2\">Hle&#x10F;!</span><span class=\"se\">\\&quot;</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;&quot;Jen ho nech,&quot; &#x159;ek</span><span class=\"se\">\\&apos;</span><span class=\"s1\"> d&#x11B;d. &quot;Kdo zn&#xE1; l&#xED;p kraj?&quot;&apos;</span><span class=\"p\">)</span>\n</pre></div><p>Zp&#x11B;tn&#xFD;m lom&#xED;tkem se daj&#xED; p&#x159;id&#xE1;vat i\nexotick&#xE9; znaky, kter&#xE9; nem&#xE1;&#x161; na kl&#xE1;vesnici.\nTy se daj&#xED; zapsat jako <code>\\N</code> a jm&#xE9;no znaku\nv&#xA0;slo&#x17E;en&#xFD;ch (&#x201E;kudrnat&#xFD;ch&#x201C;) z&#xE1;vork&#xE1;ch.\nT&#x159;eba n&#xE1;sleduj&#xED;c&#xED; znaky.\n(Do konzole na Windows bohu&#x17E;el nemus&#xED; j&#xED;t v&#x161;echny\nvypsat, ale aspo&#x148; prvn&#xED; by j&#xED;t m&#x11B;l):</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;--</span><span class=\"se\">\\N{LATIN SMALL LETTER L WITH STROKE}</span><span class=\"s1\">--&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;--</span><span class=\"se\">\\N{SECTION SIGN}</span><span class=\"s1\">--&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;--</span><span class=\"se\">\\N{PER MILLE SIGN}</span><span class=\"s1\">--&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;--</span><span class=\"se\">\\N{BLACK STAR}</span><span class=\"s1\">--&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;--</span><span class=\"se\">\\N{SNOWMAN}</span><span class=\"s1\">--&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;--</span><span class=\"se\">\\N{KATAKANA LETTER TU}</span><span class=\"s1\">--&apos;</span><span class=\"p\">)</span>\n</pre></div><p>Tahle vychyt&#xE1;vka m&#xE1; jeden, n&#x11B;kdy nep&#x159;&#xED;jemn&#xFD;,\nd&#x16F;sledek: pokud chce&#x161; pou&#x17E;&#xED;t zp&#x11B;tn&#xE9; lom&#xED;tko\n(t&#x159;eba ve jm&#xE9;nech soubor&#x16F; na Windows),\nmus&#xED;&#x161; ho ve zdrojov&#xE9;m k&#xF3;du zdvojit.\nSekvence <code>\\\\</code> znamen&#xE1; &#x201E;jedno zp&#x11B;tn&#xE9; lom&#xED;tko&#x201C;.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;C:</span><span class=\"se\">\\\\</span><span class=\"s1\">PyLadies</span><span class=\"se\">\\\\</span><span class=\"s1\">Nov&#xFD; adres&#xE1;&#x159;&apos;</span><span class=\"p\">)</span>\n</pre></div><p>Ale zp&#xE1;tky k &#x159;et&#x11B;zc&#x16F;m na v&#xED;ce &#x159;&#xE1;dk&#x16F;. Krom&#x11B; <code>\\n</code> je i druh&#xFD; zp&#x16F;sob, jak takov&#xFD;\n&#x159;et&#x11B;zec zadat: ohrani&#x10D;it ho <em>t&#x159;emi</em> uvozovkami (jednoduch&#xFD;mi nebo dvojit&#xFD;mi)\nna ka&#x17E;d&#xE9; stran&#x11B;:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">basen</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;&apos;&apos;Hal&#xF3; hal&#xF3;!</span>\n<span class=\"s1\">Co se stalo?</span>\n<span class=\"s1\">Prase kozu potrkalo!&apos;&apos;&apos;</span>\n</pre></div><p>Takov&#xE9; dlouh&#xE9; texty nach&#xE1;z&#xED; uplatn&#x11B;n&#xED; t&#x159;eba v dokumenta&#x10D;n&#xED;ch &#x159;et&#x11B;zc&#xED;ch\nu funkc&#xED;.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">vynasob</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=\"sd\">&quot;&quot;&quot;Vyn&#xE1;sob&#xED; argumenty a vr&#xE1;t&#xED; v&#xFD;sledek.</span>\n\n<span class=\"sd\">    Oba argumenty by m&#x11B;ly b&#xFD;t &#x10D;&#xED;sla.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">a</span> <span class=\"o\">*</span> <span class=\"n\">b</span>\n</pre></div><p>Jen pozor na to, &#x17E;e pokud je tenhle &#x159;et&#x11B;zec\nv odsazen&#xE9;m k&#xF3;du, ka&#x17E;d&#xFD; jeho &#x159;&#xE1;dek bude za&#x10D;&#xED;nat\nn&#x11B;kolika mezerami.\n(V dokumenta&#x10D;n&#xED;ch &#x159;et&#x11B;zc&#xED;ch to nevad&#xED;, tam se s odsazen&#xED;m po&#x10D;&#xED;t&#xE1;.)</p>\n<p>Tolik k z&#xE1;pisu &#x159;et&#x11B;zc&#x16F;.\nTe&#x10F; se pod&#xED;v&#xE1;me, jak se zadan&#xFD;mi &#x159;et&#x11B;zci pracovat.</p>\n<h2>V&#xFD;b&#x11B;r znak&#x16F;</h2>\n<p>U&#x17E; um&#xED;&#x161; spojovat dohromady krat&#x161;&#xED; &#x159;et&#x11B;zce:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">spojeny_retezec</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;a&apos;</span> <span class=\"o\">+</span> <span class=\"s1\">&apos;b&apos;</span>\n<span class=\"n\">dlouhy_retezec</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;&#xF3;&apos;</span> <span class=\"o\">*</span> <span class=\"mi\">100</span>\n</pre></div><p>Te&#x10F; se pod&#xED;v&#xE1;me na opa&#x10D;n&#xFD; proces: jak z dlouh&#xE9;ho\n&#x159;et&#x11B;zce dostat krat&#x161;&#xED; sou&#x10D;&#xE1;sti.\nZa&#x10D;neme jednotliv&#xFD;mi znaky.\nD&#x11B;l&#xE1; se to operac&#xED; <em>vybr&#xE1;n&#xED; prvku</em> (angl. <em>subscripting</em>),\nkter&#xE1; se p&#xED;&#x161;e podobn&#x11B; jako vol&#xE1;n&#xED; funkce, jen s hranat&#xFD;mi z&#xE1;vorkami:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">pate_pismeno</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;&#x10D;okol&#xE1;da&apos;</span><span class=\"p\">[</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">pate_pismeno</span><span class=\"p\">)</span>\n</pre></div><p>Funguje to? Dostala jsi opravdu p&#xE1;t&#xE9; p&#xED;smeno?</p>\n<div class=\"solution\" id=\"solution-0\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2017/pyladies-ostrava-podzim/beginners/str/index/solutions/0/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <p>Nedostala &#x2013; dostala jsi <em>&#x161;est&#xE9;</em> p&#xED;smeno.</p>\n    </div>\n</div><p>Jak sis mo&#x17E;n&#xE1; u&#x17E; v&#x161;imla, program&#xE1;to&#x159;i po&#x10D;&#xED;taj&#xED; od nuly.\n&#x201E;Prvn&#xED;&#x201C; prvek m&#xE1; v&#x17E;dy &#x10D;&#xED;slo nula, druh&#xFD; &#x10D;&#xED;slo jedna a tak d&#xE1;l.</p>\n<p>Stejn&#x11B; je to i s p&#xED;smeny v &#x159;et&#x11B;zc&#xED;ch: prvn&#xED; p&#xED;smeno m&#xE1; &#x10D;&#xED;slo nula,\ndruh&#xE9; jedna, ... a osm&#xE9; p&#xED;smeno m&#xE1; &#x10D;&#xED;slo sedm.</p>\n<p>Pro&#x10D; je tomu tak?\nK &#xFA;pln&#xE9;mu pochopen&#xED; d&#x16F;vod&#x16F; by ses pot&#x159;ebovala\nnau&#x10D;it n&#x11B;co o ukazatel&#xED;ch a pol&#xED;ch,\nco&#x17E; nebude hned, tak&#x17E;e pro te&#x10F; n&#xE1;m bude\nsta&#x10D;it v&#x11B;d&#x11B;t,\n&#x17E;e program&#xE1;to&#x159;i jsou prost&#x11B; divn&#xED;.</p>\n<p>A nebo &#x17E;e maj&#xED; r&#xE1;di divn&#xE1; &#x10D;&#xED;sla jako nulu.</p>\n<div class=\"highlight\"><pre><code>   [0] [1] [2] [3] [4] [5] [6] [7]\n\n  &#x256D;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x256E;\n  &#x2502; &#x10C; &#x2502; o &#x2502; k &#x2502; o &#x2502; l &#x2502; &#xE1; &#x2502; d &#x2502; a &#x2502;\n  &#x2570;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x256F;</code></pre></div><p>A kdy&#x17E; u&#x17E; jsme u divn&#xFD;ch &#x10D;&#xED;sel,\nco se asi stane, kdy&#x17E; budu cht&#xED;t vyb&#xED;rat p&#xED;smena\npomoc&#xED; z&#xE1;porn&#xFD;ch &#x10D;&#xED;sel?</p>\n<div class=\"solution\" id=\"solution-1\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2017/pyladies-ostrava-podzim/beginners/str/index/solutions/1/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;&#x10C;okol&#xE1;da&apos;</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">])</span>  <span class=\"c1\"># &#x2192; a</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;&#x10C;okol&#xE1;da&apos;</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"p\">])</span>  <span class=\"c1\"># &#x2192; d</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;&#x10C;okol&#xE1;da&apos;</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">3</span><span class=\"p\">])</span>  <span class=\"c1\"># &#x2192; &#xE1;</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;&#x10C;okol&#xE1;da&apos;</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">4</span><span class=\"p\">])</span>  <span class=\"c1\"># &#x2192; l</span>\n</pre></div><p>Z&#xE1;porn&#xE1; &#x10D;&#xED;sla vyb&#xED;raj&#xED; p&#xED;smenka od konce.</p>\n<div class=\"highlight\"><pre><code>   [0] [1] [2] [3] [4] [5] [6] [7]\n   [-8][-7][-6][-5][-4][-3][-2][-1]\n  &#x256D;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x256E;\n  &#x2502; &#x10C; &#x2502; o &#x2502; k &#x2502; o &#x2502; l &#x2502; &#xE1; &#x2502; d &#x2502; a &#x2502;\n  &#x2570;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x256F;</code></pre></div>\n    </div>\n</div><p>&#x158;et&#x11B;zce um&#xED; i jin&#xE9; triky.\nT&#x159;eba m&#x16F;&#x17E;e&#x161; zjistit, jak je &#x159;et&#x11B;zec dlouh&#xFD;\nnebo jestli v sob&#x11B; obsahuje dan&#xFD; men&#x161;&#xED; &#x159;et&#x11B;zec.</p>\n<table class=\"table\">\n    <tbody><tr>\n        <th>Z&#xE1;pis</th>\n        <th>Popis</th>\n        <th>P&#x159;&#xED;klad</th>\n    </tr>\n    <tr>\n        <td><code>len(r)</code></td>\n        <td>D&#xE9;lka &#x159;et&#x11B;zce</td>\n        <td><code>len(&apos;&#x10D;okol&#xE1;da&apos;)</code></td>\n    </tr>\n    <tr>\n        <td><code>x&#xA0;in&#xA0;r</code></td>\n        <td>True pokud je &#x159;et&#x11B;zec <code>x</code> obsa&#x17E;en v <code>r</code></td>\n        <td><code>&apos;oko&apos; in &apos;&#x10D;okol&#xE1;da&apos;</code></td>\n    </tr>\n    <tr>\n        <td><code>x&#xA0;not&#xA0;in&#xA0;r</code></td>\n        <td>Opak <code>x in r</code></td>\n        <td><code>&apos;dub&apos; not in &apos;&#x10D;okol&#xE1;da</code></td>\n    </tr>\n</tbody></table><p>&#x158;et&#x11B;zce v&#x17E;dy berou v potaz velikost p&#xED;smen,\ntak&#x17E;e nap&#x159;. <code>&apos;&#x10C;OKO&apos; in &apos;&#x10D;okol&#xE1;da&apos;</code> je <code>False</code>.\nKdybys cht&#x11B;la porovn&#xE1;vat bez ohledu na velikost p&#xED;smen,\nmusela bys oba &#x159;et&#x11B;zce p&#x159;ev&#xE9;st t&#x159;eba na mal&#xE1; p&#xED;smena\na pak je porovnat.</p>\n<p>A jak se p&#x159;ev&#xE1;d&#xED; na mal&#xE1; p&#xED;smena?\nK tomu budeme pot&#x159;ebovat dal&#x161;&#xED; novou vlastnost Pythonu: metody.</p>\n<h2>Metody</h2>\n<p><em>Metoda</em> (angl. <em>method</em>) je jako funkce &#x2013; n&#x11B;co, co se d&#xE1; zavolat.\nNa rozd&#xED;l od funkce je sv&#xE1;zan&#xE1; s n&#x11B;jak&#xFD;m <em>objektem</em> (hodnotou).\nVol&#xE1; se tak, &#x17E;e se za objekt nap&#xED;&#x161;e te&#x10D;ka,\nza n&#xED; jm&#xE9;no metody a za to cel&#xE9; se, jako u funkc&#xED;, p&#x159;ipoj&#xED; z&#xE1;vorky\ns&#xA0;p&#x159;&#xED;padn&#xFD;mi argumenty.</p>\n<p>&#x158;et&#x11B;zcov&#xE9; metody <code>upper()</code> a <code>lower()</code>\np&#x159;ev&#xE1;d&#xED; text na velk&#xE1;, respektive mal&#xE1; p&#xED;smena.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">retezec</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;Ahoj&apos;</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">())</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">())</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">)</span>\n</pre></div><div class=\"admonition note\"><p>V&#x161;imni si, &#x17E;e p&#x16F;vodn&#xED; &#x159;et&#x11B;zec se nem&#x11B;n&#xED;; metoda vr&#xE1;t&#xED; nov&#xFD; &#x159;et&#x11B;zec, ten\nstar&#xFD; z&#x16F;st&#xE1;v&#xE1;.</p>\n<p>To je obecn&#xE1; vlastnost &#x159;et&#x11B;zc&#x16F; v&#xA0;Pythonu: jednou existuj&#xED;c&#xED; &#x159;et&#x11B;zec se u&#x17E;\nned&#xE1; zm&#x11B;nit, d&#xE1; se jen vytvo&#x159;it n&#x11B;jak&#xFD; odvozen&#xFD;.</p>\n</div><h3>Inici&#xE1;ly</h3>\n<p>Pro procvi&#x10D;en&#xED; metod a vyb&#xED;r&#xE1;n&#xED; znak&#x16F; si zkus napsat program,\nkter&#xFD; se zept&#xE1; na jm&#xE9;no, pak na p&#x159;&#xED;jmen&#xED;\na pak vyp&#xED;&#x161;e inici&#xE1;ly &#x2013; prvn&#xED; p&#xED;smena zadan&#xFD;ch jmen.</p>\n<p>Inici&#xE1;ly jsou v&#x17E;dycky velk&#xFD;mi p&#xED;smeny\n(i kdyby byl u&#x17E;ivatel l&#xED;n&#xFD; ma&#x10D;kat Shift).</p>\n<div class=\"solution\" id=\"solution-2\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2017/pyladies-ostrava-podzim/beginners/str/index/solutions/2/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <div class=\"highlight\"><pre><span></span><span class=\"n\">jmeno</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">&apos;Zadej jm&#xE9;no: &apos;</span><span class=\"p\">)</span>\n<span class=\"n\">prijmeni</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">&apos;Zadej p&#x159;&#xED;jmen&#xED; &apos;</span><span class=\"p\">)</span>\n<span class=\"n\">inicialy</span> <span class=\"o\">=</span> <span class=\"n\">jmeno</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">prijmeni</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Inici&#xE1;ly:&apos;</span><span class=\"p\">,</span> <span class=\"n\">inicialy</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">())</span>\n</pre></div><p>Zp&#x16F;sob&#x16F;, jak takov&#xFD; program napsat, je v&#xED;ce.\nLze nap&#x159;&#xED;klad zavolat <code>upper()</code> dvakr&#xE1;t &#x2013; zvl&#xE1;&#x161;&#x165; na jm&#xE9;no a zvl&#xE1;&#x161;&#x165; na p&#x159;&#xED;jmen&#xED;.</p>\n<p>Nebo to jde zapsat i takto &#x2013;\nmetoda se d&#xE1; volat na v&#xFD;sledku jak&#xE9;hokoli v&#xFD;razu:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">jmeno</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">&apos;Zadej jm&#xE9;no: &apos;</span><span class=\"p\">)</span>\n<span class=\"n\">prijmeni</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s1\">&apos;Zadej p&#x159;&#xED;jmen&#xED; &apos;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Inici&#xE1;ly:&apos;</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">jmeno</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">prijmeni</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">())</span>\n</pre></div><p>Doporu&#x10D;uji sp&#xED;&#x161; prvn&#xED; zp&#x16F;sob, ten se smyslupln&#xFD;mi n&#xE1;zvy prom&#x11B;nn&#xFD;ch.\nJe sice del&#x161;&#xED;, ale mnohem p&#x159;ehledn&#x11B;j&#x161;&#xED;.</p>\n    </div>\n</div><p>&#x158;et&#x11B;zcov&#xFD;ch metod je cel&#xE1; &#x159;ada.\nNeju&#x17E;ite&#x10D;n&#x11B;j&#x161;&#xED; z&#xA0;nich najde&#x161; v&#xA0;<a href=\"https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf\">tah&#xE1;ku</a>, kter&#xFD; si m&#x16F;&#x17E;e&#x161; st&#xE1;hnout &#x10D;i vytisknout.</p>\n<p>A &#xFA;pln&#x11B; v&#x161;echny &#x159;et&#x11B;zcov&#xE9; metody jsou pops&#xE1;ny v&#xA0;<a href=\"https://docs.python.org/3/library/stdtypes.html#string-methods\">dokumentaci Pythonu</a> (anglicky; pln&#xE9; v&#x11B;c&#xED;, kter&#xE9; je&#x161;t&#x11B; nezn&#xE1;&#x161;).</p>\n<p>V&#x161;imni si, &#x17E;e <code>len</code> nen&#xED; metoda, ale funkce; p&#xED;&#x161;e se <code>len(r)</code>, ne <code>r.len()</code>.\nPro&#x10D; tomu tak je, to za n&#x11B;jakou dobu pozn&#xE1;&#x161;.</p>\n<h2>Form&#xE1;tov&#xE1;n&#xED;</h2>\n<p>Obzvl&#xE1;&#x161;t&#x11B; u&#x17E;ite&#x10D;n&#xE1; je metoda <code>format</code>,\nkter&#xE1; v&#xA0;r&#xE1;mci &#x159;et&#x11B;zce nahrad&#xED; dvojice &#x201E;kudrnat&#xFD;ch&#x201C; z&#xE1;vorek\nza to, co dostane v argumentech:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">vypis</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;{}&#xD7;{} je {}&apos;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">3</span> <span class=\"o\">*</span> <span class=\"mi\">4</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">vypis</span><span class=\"p\">)</span>\n</pre></div><p>&#x158;et&#x11B;zec <code>&apos;{}&#xD7;{} je {}&apos;</code> tady funguje jako <em>&#x161;ablona</em> (angl. <em>template</em>).\nP&#x159;edstav si to jako jako formul&#xE1;&#x159;, do kter&#xE9;ho Python na vyzna&#x10D;en&#xE1; m&#xED;sta\nvpisuje hodnoty.</p>\n<p>Pokud chce&#x161; nahradit hodnoty v jin&#xE9;m po&#x159;ad&#xED;, nebo kdy&#x17E; chce&#x161; aby &#x161;ablona\nbyla &#x10D;iteln&#x11B;j&#x161;&#xED;, m&#x16F;&#x17E;e&#x161; do &#x201E;kudrnat&#xFD;ch&#x201C; z&#xE1;vorek napsat jm&#xE9;na:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">vypis</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;Ahoj {jmeno}! V&#xFD;sledek je {cislo}.&apos;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">cislo</span><span class=\"o\">=</span><span class=\"mi\">7</span><span class=\"p\">,</span> <span class=\"n\">jmeno</span><span class=\"o\">=</span><span class=\"s1\">&apos;Elv&#xED;ro&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">vypis</span><span class=\"p\">)</span>\n</pre></div><p>Form&#xE1;tov&#xE1;n&#xED; se pou&#x17E;&#xED;v&#xE1; skoro v&#x161;ude, kde je\npot&#x159;eba &#x201E;hezky&#x201C; vypsat n&#x11B;jakou hodnotu.</p>\n<h2>Sek&#xE1;n&#xED; &#x159;et&#x11B;zc&#x16F;</h2>\n<p>Te&#x10F; se vr&#xE1;t&#xED;me k vyb&#xED;r&#xE1;n&#xED; kousk&#x16F; &#x159;et&#x11B;zc&#x16F;.\nZkus, co d&#x11B;l&#xE1; tenhle program:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">retezec</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;&#x10D;okol&#xE1;da&apos;</span>\n<span class=\"n\">kousek</span> <span class=\"o\">=</span> <span class=\"n\">retezec</span><span class=\"p\">[</span><span class=\"mi\">5</span><span class=\"p\">:]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">kousek</span><span class=\"p\">)</span>\n</pre></div><div class=\"solution\" id=\"solution-3\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2017/pyladies-ostrava-podzim/beginners/str/index/solutions/3/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <p>Z&#xE1;pis <code>retezec[5:]</code> vybere <em>pod&#x159;et&#x11B;zec</em> od znaku &#x10D;&#xED;slo 5 d&#xE1;l.</p>\n    </div>\n</div><p>D&#xE1; se pou&#x17E;&#xED;t i <code>retezec[:5]</code>,\nkter&#xFD; vybere v&#x161;echno <em>a&#x17E; po</em> znak &#x10D;&#xED;slo 5.\nAle ne znak 5 samotn&#xFD;, tak&#x17E;e <code>retezec[:5] + retezec[5:] == retezec</code>.</p>\n<p>Co asi ud&#x11B;l&#xE1; <code>retezec[2:5]</code>?</p>\n<p>A co <code>retezec[-4:]</code>?</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">retezec</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;&#x10D;okol&#xE1;da&apos;</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">[:</span><span class=\"mi\">4</span><span class=\"p\">])</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:</span><span class=\"mi\">5</span><span class=\"p\">])</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">4</span><span class=\"p\">:])</span>\n</pre></div><p>Ur&#x10D;ov&#xE1;n&#xED; vhodn&#xFD;ch &#x10D;&#xED;sel, <em>index&#x16F;</em>, ob&#x10D;as vy&#x17E;aduje trochu zamy&#x161;len&#xED;.</p>\n<p>U podobn&#xE9;ho &#x201E;sek&#xE1;n&#xED;&#x201C; (angl. <em>string slicing</em>)\nje lep&#x161;&#xED; si &#x10D;&#xED;slovat &#x201E;hranice&#x201C; mezi znaky.\n&#x10C;lov&#x11B;k tomu pak l&#xE9;pe rozum&#xED;:</p>\n<p><a id=\"slicing-diagram\"></a></p>\n<div class=\"highlight\"><pre><code>  &#x256D;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x256E;\n  &#x2502; &#x10C; &#x2502; o &#x2502; k &#x2502; o &#x2502; l &#x2502; &#xE1; &#x2502; d &#x2502; a &#x2502;\n  &#x251C;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2524;\n  &#x2502;   &#x2502;   &#x2502;   &#x2502;   &#x2502;   &#x2502;   &#x2502;   &#x2502;   &#x2502;\n  0   1   2   3   4   5   6   7   8\n -8  -7  -6  -5  -4  -3  -2  -1\n\n  &#x2570;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x256F;\n  &apos;&#x10D;okol&#xE1;da&apos;[:4] == &apos;&#x10D;oko&apos;\n\n          &#x2570;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x256F;\n        &apos;&#x10D;okol&#xE1;da&apos;[2:6] == &apos;kol&#xE1;&apos;\n\n                      &#x2570;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x256F;\n                      &apos;&#x10D;okol&#xE1;da&apos;[-3:] == &apos;&#xE1;da&apos;</code></pre></div><h2>Cvi&#x10D;en&#xED;</h2>\n<p>Zkus napsat funkci <code>zamen(retezec, pozice, znak)</code>.</p>\n<p>Tato funkce vr&#xE1;t&#xED; &#x159;et&#x11B;zec, kter&#xFD; m&#xE1; na dan&#xE9; pozici\ndan&#xFD; znak; jinak je stejn&#xFD; jako p&#x16F;vodn&#xED; <code>retezec</code>. Nap&#x159;:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">zamen</span><span class=\"p\">(</span><span class=\"s1\">&apos;palec&apos;</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"s1\">&apos;v&apos;</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"s1\">&apos;valec&apos;</span>\n<span class=\"n\">zamen</span><span class=\"p\">(</span><span class=\"s1\">&apos;valec&apos;</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s1\">&apos;j&apos;</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"s1\">&apos;vajec&apos;</span>\n</pre></div><p>Pozor na to, &#x17E;e &#x159;et&#x11B;zce v&#xA0;Pythonu nelze m&#x11B;nit.\nMus&#xED;&#x161; vytvo&#x159;it nov&#xFD; &#x159;et&#x11B;zec poskl&#xE1;dan&#xFD; z &#x10D;&#xE1;st&#xED; toho star&#xE9;ho.</p>\n<div class=\"solution\" id=\"solution-4\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2017/pyladies-ostrava-podzim/beginners/str/index/solutions/4/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">zamen</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">,</span> <span class=\"n\">pozice</span><span class=\"p\">,</span> <span class=\"n\">znak</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Zam&#x11B;n&#xED; znak na dan&#xE9; pozici</span>\n\n<span class=\"sd\">    Vr&#xE1;t&#xED; &#x159;et&#x11B;zec, kter&#xFD; m&#xE1; na dan&#xE9; pozici dan&#xFD; znak;</span>\n<span class=\"sd\">    jinak je stejn&#xFD; jako vstupn&#xED; retezec</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">retezec</span><span class=\"p\">[:</span><span class=\"n\">pozice</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">znak</span> <span class=\"o\">+</span> <span class=\"n\">retezec</span><span class=\"p\">[</span><span class=\"n\">pozice</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">:]</span>\n</pre></div>\n    </div>\n</div>\n\n\n        "
    }
  }
}