Řetězce umí všelijaké triky.
Funkcí len()
můžeš zjistit, jak je řetězec dlouhý;
operátorem in
pak jestli v sobě obsahuje daný podř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.
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.
Zkus si to!
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ý.
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).
Ř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áš.
Pro úplnost: občas uvidíš metoda format
, která doplní do šablony
podobné jako u formátovacích řetězců (f'...'
).
sablona = '{a}×{b} je {vysledek}'
vypis = sablona.format(vysledek=3 * 4, a=3, b=4)
print(vypis)
Funguje i zkrácený zápis, kdy necháš závorky prázdné a argumenty nepojmenuješ:
vypis = 'Ahoj {}! Výsledek je {}.'.format('Elvíro', 7)
print(vypis)
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říklad:
# Zaměň třetí znak ve slově "čokoláda"
print(zamen('čokoláda', 3, 'u')) # → čokuláda
Pozor na to, že řetězce v Pythonu nelze měnit. Musíš vytvořit nový řetězec poskládaný z částí toho starého.
{ "data": { "sessionMaterial": { "id": "session-material:2019/brno-jaro-2019-pondeli:turtle:3", "title": "Řetězcové funkce a metody", "html": "\n \n \n\n <h1>Řetězcové funkce a metody</h1>\n<p>Řetězce umí všelijaké triky.\nFunkcí <code>len()</code> můžeš zjistit, jak je řetězec dlouhý;\noperátorem <code>in</code> pak jestli v sobě obsahuje daný podřetězec.</p>\n<table class=\"table\">\n <tbody><tr>\n <th>Zápis</th>\n <th>Popis</th>\n <th>Příklad</th>\n </tr>\n <tr>\n <td><code>len(r)</code></td>\n <td>Délka řetězce</td>\n <td><code>len('čokoláda')</code></td>\n </tr>\n <tr>\n <td><code>x in r</code></td>\n <td>True pokud je řetězec <code>x</code> obsažen v <code>r</code></td>\n <td><code>'oko' in 'čokoláda'</code></td>\n </tr>\n <tr>\n <td><code>x not in r</code></td>\n <td>Opak <code>x in r</code></td>\n <td><code>'dub' not in 'čokoláda</code></td>\n </tr>\n</tbody></table><p>Řetězce vždy berou v potaz velikost písmen,\ntakže např. <code>'ČOKO' in 'čokoláda'</code> je <code>False</code>.\nKdybys chtěla porovnávat bez ohledu na velikost písmen,\nmusela bys oba řetězce převést třeba na malá písmena\na pak je porovnat.</p>\n<p>A jak se převádí na malá písmena?\nK tomu budeme potřebovat další novou vlastnost Pythonu: metody.</p>\n<h2>Metody</h2>\n<p><em>Metoda</em> (angl. <em>method</em>) je jako funkce – něco, co se dá zavolat.\nNa rozdíl od funkce je svázaná s nějakým <em>objektem</em> (hodnotou).\nVolá se tak, že se za objekt napíše tečka,\nza ní jméno metody a za to celé se, jako u funkcí, připojí závorky\ns případnými argumenty.</p>\n<p>Řetězcové metody <code>upper()</code> a <code>lower()</code>\npřevádí text na velká, respektive malá písmena.\nZkus si to!</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">retezec</span> <span class=\"o\">=</span> <span class=\"s1\">'Ahoj'</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šimni si, že původní řetězec se nemění; metoda vrátí nový řetězec, ten\nstarý zůstává.</p>\n<p>To je obecná vlastnost řetězců v Pythonu: jednou existující řetězec se už\nnedá změnit, dá se jen vytvořit nějaký odvozený.</p>\n</div><h3>Iniciály</h3>\n<p>Pro procvičení metod a vybírání znaků si zkus napsat program,\nkterý se zeptá na jméno, pak na příjmení\na pak vypíše iniciály – první písmena zadaných jmen.</p>\n<p>Iniciály jsou vždycky velkými písmeny\n(i kdyby byl uživatel líný mačkat Shift).</p>\n<div class=\"solution\" id=\"solution-0\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-jaro-2019-pondeli/beginners/str-methods/index/solutions/0/\"><span class=\"link-text\">Ukázat řešení</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\">'Zadej jméno: '</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\">'Zadej příjmení '</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\">'Iniciály:'</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ůsobů, jak takový program napsat, je více.\nLze například zavolat <code>upper()</code> dvakrát – zvlášť na jméno a zvlášť na příjmení.</p>\n<p>Nebo to jde zapsat i takto –\nmetoda se dá volat na výsledku jakéhokoli vý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\">'Zadej jméno: '</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\">'Zadej příjmení '</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Iniciály:'</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čuji spíš první způsob, ten se smysluplnými názvy proměnných.\nJe sice delší, ale mnohem přehlednější.</p>\n </div>\n</div><p>Řetězcových metod je celá řada.\nNejužitečnější z nich najdeš v <a href=\"https://pyvec.github.io/cheatsheets/strings/strings-cs.pdf\">taháku</a>, který si můžeš stáhnout či vytisknout.</p>\n<p>A úplně všechny řetězcové metody jsou popsány v <a href=\"https://docs.python.org/3/library/stdtypes.html#string-methods\">dokumentaci Pythonu</a> (anglicky; plné věcí, které ještě neznáš).</p>\n<p>Všimni si, že <code>len</code> není metoda, ale funkce; píše se <code>len(r)</code>, ne <code>r.len()</code>.\nProč tomu tak je, to za nějakou dobu poznáš.</p>\n<h2>Metoda format</h2>\n<p>Pro úplnost: občas uvidíš metoda <code>format</code>, která doplní do šablony\npodobné jako u formátovacích řetězců (<code>f'...'</code>).</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">sablona</span> <span class=\"o\">=</span> <span class=\"s1\">'{a}×{b} je {vysledek}'</span>\n<span class=\"n\">vypis</span> <span class=\"o\">=</span> <span class=\"n\">sablona</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">vysledek</span><span class=\"o\">=</span><span class=\"mi\">3</span> <span class=\"o\">*</span> <span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"n\">a</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"n\">b</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>Funguje i zkrácený zápis, kdy necháš závorky prázdné a argumenty nepojmenuješ:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">vypis</span> <span class=\"o\">=</span> <span class=\"s1\">'Ahoj {}! Výsledek je {}.'</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"s1\">'Elvíro'</span><span class=\"p\">,</span> <span class=\"mi\">7</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><h2>Cvičení</h2>\n<p>Zkus napsat funkci <code>zamen(retezec, pozice, znak)</code>.</p>\n<p>Tato funkce vrátí řetězec, který má na dané pozici\ndaný znak; jinak je stejný jako původní <code>retezec</code>. Například:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"c1\"># Zaměň třetí znak ve slově "čokoláda"</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zamen</span><span class=\"p\">(</span><span class=\"s1\">'čokoláda'</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"s1\">'u'</span><span class=\"p\">))</span> <span class=\"c1\"># → čokuláda</span>\n</pre></div><p>Pozor na to, že řetězce v Pythonu nelze měnit.\nMusíš vytvořit nový řetězec poskládaný z částí toho starého.</p>\n<div class=\"solution\" id=\"solution-1\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-jaro-2019-pondeli/beginners/str-methods/index/solutions/1/\"><span class=\"link-text\">Ukázat řešení</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\">"""Zamění znak na dané pozici</span>\n\n<span class=\"sd\"> Vrátí řetězec, který má na dané pozici daný znak;</span>\n<span class=\"sd\"> jinak je stejný jako vstupní retezec</span>\n<span class=\"sd\"> """</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 " } } }