Řetězce

Čísla jsou pro počítače dost užitečná (ostatně slovo počítač to naznačuje), ale Python umí pracovat i s jinými druhy informací. Třeba s textem.

Zkus si to: zadej své jméno do uvozovek, jak vidíš níže:

>>> 'Ola'
'Ola'

Nyní jsi vytvořila svůj první řetězec! Řetězec (angl. string) je programátorský termín pro text – posloupnost znaků (písmenek), které mohou být zpracovány počítačem.

Když řetězec zadáváš, musíš ho vždy uzavřít do uvozovek (apostrofů). Jinak by Python nepoznal, co je text se kterým má pracovat a co jsou instrukce které má provést. To je pro počítač docela důležité – lidem podobné věci dojdou z kontextu, ale počítač je hloupé zařízení.

(Ilustrační komiks. Člověk říká robotovi: "Řekni Pavlovi, ať mi zavolá!". Robot odpoví: "PAVLOVI AŤ MI ZAVOLÁ!")

Řetězce se dají spojovat – „sečítat“ – pomocí +. Zkus toto:

>>> 'Já jsem ' + 'Ola'
'Já jsem Ola'

Pozor na mezeru! Když zadáš 'Já jsem'+'Ola', spojí se ti dvě slova dohromady. Počítač považuje i mezeru za znak; chová se k ní stejně jako k jakémukoli písmenku. Když nedáš mezeru do uvozovek, nebude součástí řetězce.

Zkus si dát do uvozovek i mezeru samotnou:

>>> 'Já jsem' + ' ' + 'Ola'
'Já jsem Ola'

Kromě „sečítání“ můžeš řetězce i opakovat – násobit číslem:

>>> 'Ola' * 3
'OlaOlaOla'

Uvozování

A co když budeš chtít dát dovnitř do svého řetězce apostrof? Můžeš kolem řetězce použít dvojité uvozovky:

>>> "To bych řek', že jsou pořádně praštěný!"
"To bych řek', že jsou pořádně praštěný!"

Pythonu je jedno, se kterým druhem uvozovek řetězec zadáš. Podstatná jsou jen písmenka uvnitř. Když Python řetězec vypisuje, může si vybrat jiný druh uvozovek než jsi použila ty:

>>> "Ola"
'Ola'

Funkce a metody

Už umíš řetězce „sčítat“ ('Ahoj ' + 'Olo!') a „násobit“ ('la' * 3). Na všechny ostatní věci, které se s textem dají dělat, ale na klávesnici není dost symbolů. Proto jsou některé operace pojmenované slovně – třeba takzvané funkce.

Chceš-li znát počet písmen ve svém jméně, zavolej funkci len. Napiš len (bez uvozovek), pak kulaté závorky, a do těch závorek své jméno jako řetězec (v uvozovkách):

>>> len('Ola')
3

Existuje funkce type, která zjistí jestli je něco číslo nebo řetězec. Jak bych ji zavolal?

Řešení

Kromě funkcí existují metody, které se zapisují trochu jinak.

Chceš-li vidět své jméno velkými písmeny, zavolej metodu upper. Napiš řetězec, pak tečku, jméno metody upper (bez uvozovek) a prázdné závorky:

>>> 'Ola'.upper()
'OLA'

Řetězce mají i metodu lower. Zkus ji zavolat na své jméno.

Řešení

Co je metoda (které voláš s tečkou, jako 'Ola'.upper()) a co je funkce (kde vložíš informaci do závorek jako len('Ola')), to se budeš muset vždycky zapamatovat nebo vyhledat.

Skládání výrazů

Volání funkce nebo metody můžeš použít jako jinou hodnotu.

Nech Python spočítat matematický výraz (1 + 3) / 2:

>>> (1 + 3) / 2
2.0

Python napřed sečte 1 + 3 a vyjde mu 4. Čtverku doplní místo 1 + 3 do původního příkladu, a dostane 4 / 2. To vydělí a dostane 2.0.

Neboli: (1 + 3) / 2 = 4 / 2 = 2.0

Zkus se zamyslet, jak Python zpracuje tyto výrazy:

>>> len('Ola') + 1
4
>>> 'Já jsem ' + 'Ola'.upper()
'Já jsem OLA'
>>> len('Ola'.upper())
3
>>> len('Ola' * 3)
9

Řešení

Podobné skládání je v programování velice časté. Většinu základních stavebních bloků se začátečník naučí za pár týdnů – a pak po celou svou progrmátorskou kariéru objevuje nové způsoby, jak je poskládat do složitějších a složitějších konstrukcí.

Shrnutí

OK, dost bylo řetězců. Co ses zatím naučila:

  • Řetězce se používají na práci s textem.
  • Operátory + a * se používají na spojování a opakování řetězců.
  • Funkce a metody jako len() a upper() provádí na řetězcích nějaké akce.
  • Výrazy se dají skládat dohromady.

Čísla, řetězce a operátory a funkce jsou základy většiny programovacích jazyků.

Připravena na něco dalšího? Vsadíme se, že ano!

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2019/brno-jaro-snake:intro:2",
      "title": "Řetězce",
      "html": "\n          \n    \n\n    <h1>&#x158;et&#x11B;zce</h1>\n<p>&#x10C;&#xED;sla jsou pro po&#x10D;&#xED;ta&#x10D;e dost u&#x17E;ite&#x10D;n&#xE1; (ostatn&#x11B; slovo <em>po&#x10D;&#xED;ta&#x10D;</em> to nazna&#x10D;uje),\nale Python um&#xED; pracovat i s jin&#xFD;mi druhy informac&#xED;.\nT&#x159;eba s&#xA0;textem.</p>\n<p>Zkus si to: zadej sv&#xE9; jm&#xE9;no do uvozovek, jak vid&#xED;&#x161; n&#xED;&#x17E;e:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"s1\">&apos;Ola&apos;</span>\n<span class=\"go\">&apos;Ola&apos;</span>\n</pre></div><p>Nyn&#xED; jsi vytvo&#x159;ila sv&#x16F;j prvn&#xED; <em>&#x159;et&#x11B;zec</em>!\n&#x158;et&#x11B;zec (angl. <em>string</em>) je program&#xE1;torsk&#xFD; term&#xED;n pro <em>text</em> &#x2013; posloupnost\nznak&#x16F; (p&#xED;smenek),\nkter&#xE9; mohou b&#xFD;t zpracov&#xE1;ny po&#x10D;&#xED;ta&#x10D;em.</p>\n<p>Kdy&#x17E; &#x159;et&#x11B;zec zad&#xE1;v&#xE1;&#x161;, mus&#xED;&#x161; ho v&#x17E;dy uzav&#x159;&#xED;t do uvozovek (apostrof&#x16F;).\nJinak by Python nepoznal, co je text se kter&#xFD;m m&#xE1; pracovat a co jsou instrukce\nkter&#xE9; m&#xE1; prov&#xE9;st.\nTo je pro po&#x10D;&#xED;ta&#x10D; docela d&#x16F;le&#x17E;it&#xE9; &#x2013; lidem podobn&#xE9; v&#x11B;ci dojdou z kontextu,\nale po&#x10D;&#xED;ta&#x10D; je hloup&#xE9; za&#x159;&#xED;zen&#xED;.</p>\n<p><span class=\"figure\"><a href=\"/2019/brno-jaro-snake/fast-track/str/static/quote-comic.svg\"><img src=\"/2019/brno-jaro-snake/fast-track/str/static/quote-comic.svg\" alt=\"(Ilustra&#x10D;n&#xED; komiks. &#x10C;lov&#x11B;k &#x159;&#xED;k&#xE1; robotovi: &quot;&#x158;ekni Pavlovi, a&#x165; mi zavol&#xE1;!&quot;. Robot odpov&#xED;: &quot;PAVLOVI A&#x164; MI ZAVOL&#xC1;!&quot;)\"></a></span></p>\n<p>&#x158;et&#x11B;zce se daj&#xED; spojovat &#x2013; &#x201E;se&#x10D;&#xED;tat&#x201C; &#x2013; pomoc&#xED; <code>+</code>. Zkus toto:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"s1\">&apos;J&#xE1; jsem &apos;</span> <span class=\"o\">+</span> <span class=\"s1\">&apos;Ola&apos;</span>\n<span class=\"go\">&apos;J&#xE1; jsem Ola&apos;</span>\n</pre></div><p>Pozor na mezeru! Kdy&#x17E; zad&#xE1;&#x161; <code>&apos;J&#xE1; jsem&apos;+&apos;Ola&apos;</code>, spoj&#xED; se ti dv&#x11B; slova dohromady.\nPo&#x10D;&#xED;ta&#x10D; pova&#x17E;uje i mezeru za <em>znak</em>; chov&#xE1; se k&#xA0;n&#xED; stejn&#x11B; jako k&#xA0;jak&#xE9;mukoli\np&#xED;smenku.\nKdy&#x17E; ned&#xE1;&#x161; mezeru do uvozovek, nebude sou&#x10D;&#xE1;st&#xED; &#x159;et&#x11B;zce.</p>\n<p>Zkus si d&#xE1;t do uvozovek i mezeru samotnou:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"s1\">&apos;J&#xE1; jsem&apos;</span> <span class=\"o\">+</span> <span class=\"s1\">&apos; &apos;</span> <span class=\"o\">+</span> <span class=\"s1\">&apos;Ola&apos;</span>\n<span class=\"go\">&apos;J&#xE1; jsem Ola&apos;</span>\n</pre></div><p>Krom&#x11B; &#x201E;se&#x10D;&#xED;t&#xE1;n&#xED;&#x201C; m&#x16F;&#x17E;e&#x161; &#x159;et&#x11B;zce i opakovat &#x2013; n&#xE1;sobit &#x10D;&#xED;slem:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"s1\">&apos;Ola&apos;</span> <span class=\"o\">*</span> <span class=\"mi\">3</span>\n<span class=\"go\">&apos;OlaOlaOla&apos;</span>\n</pre></div><h2>Uvozov&#xE1;n&#xED;</h2>\n<p>A co kdy&#x17E; bude&#x161; cht&#xED;t d&#xE1;t dovnit&#x159; do sv&#xE9;ho &#x159;et&#x11B;zce apostrof?\nM&#x16F;&#x17E;e&#x161; kolem &#x159;et&#x11B;zce pou&#x17E;&#xED;t dvojit&#xE9; uvozovky:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"s2\">&quot;To bych &#x159;ek&apos;, &#x17E;e jsou po&#x159;&#xE1;dn&#x11B; pra&#x161;t&#x11B;n&#xFD;!&quot;</span>\n<span class=\"go\">&quot;To bych &#x159;ek&apos;, &#x17E;e jsou po&#x159;&#xE1;dn&#x11B; pra&#x161;t&#x11B;n&#xFD;!&quot;</span>\n</pre></div><p>Pythonu je jedno, se kter&#xFD;m druhem uvozovek &#x159;et&#x11B;zec zad&#xE1;&#x161;.\nPodstatn&#xE1; jsou jen p&#xED;smenka uvnit&#x159;.\nKdy&#x17E; Python &#x159;et&#x11B;zec vypisuje, m&#x16F;&#x17E;e si vybrat jin&#xFD; druh uvozovek\nne&#x17E; jsi pou&#x17E;ila ty:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"s2\">&quot;Ola&quot;</span>\n<span class=\"go\">&apos;Ola&apos;</span>\n</pre></div><h2>Funkce a metody</h2>\n<p>U&#x17E; um&#xED;&#x161; &#x159;et&#x11B;zce &#x201E;s&#x10D;&#xED;tat&#x201C; (<code>&apos;Ahoj &apos; + &apos;Olo!&apos;</code>)\na &#x201E;n&#xE1;sobit&#x201C; (<code>&apos;la&apos; * 3</code>).\nNa v&#x161;echny ostatn&#xED; v&#x11B;ci, kter&#xE9; se s&#xA0;textem daj&#xED; d&#x11B;lat,\nale na kl&#xE1;vesnici nen&#xED; dost symbol&#x16F;.\nProto jsou n&#x11B;kter&#xE9; operace pojmenovan&#xE9; slovn&#x11B; &#x2013; t&#x159;eba takzvan&#xE9; <em>funkce</em>.</p>\n<p>Chce&#x161;-li zn&#xE1;t po&#x10D;et p&#xED;smen ve sv&#xE9;m jm&#xE9;n&#x11B;, zavolej funkci <code>len</code>.\nNapi&#x161; <code>len</code> (bez uvozovek), pak kulat&#xE9; z&#xE1;vorky, a do t&#x11B;ch z&#xE1;vorek\nsv&#xE9; jm&#xE9;no jako &#x159;et&#x11B;zec (v&#xA0;uvozovk&#xE1;ch):</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"s1\">&apos;Ola&apos;</span><span class=\"p\">)</span>\n<span class=\"go\">3</span>\n</pre></div><p>Existuje funkce <code>type</code>, kter&#xE1; zjist&#xED; jestli je n&#x11B;co &#x10D;&#xED;slo nebo &#x159;et&#x11B;zec.\nJak bych ji zavolal?</p>\n<div class=\"solution\" id=\"solution-0\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2019/brno-jaro-snake/fast-track/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        <div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"mi\">123</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;class &apos;int&apos;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"s1\">&apos;123&apos;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;class &apos;str&apos;&gt;</span>\n</pre></div>\n    </div>\n</div><p>Krom&#x11B; funkc&#xED; existuj&#xED; <em>metody</em>, kter&#xE9; se zapisuj&#xED; trochu jinak.</p>\n<p>Chce&#x161;-li vid&#x11B;t sv&#xE9; jm&#xE9;no velk&#xFD;mi p&#xED;smeny, zavolej metodu <code>upper</code>.\nNapi&#x161; &#x159;et&#x11B;zec, pak te&#x10D;ku, jm&#xE9;no metody <code>upper</code> (bez uvozovek) a pr&#xE1;zdn&#xE9;\nz&#xE1;vorky:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"s1\">&apos;Ola&apos;</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span>\n<span class=\"go\">&apos;OLA&apos;</span>\n</pre></div><p>&#x158;et&#x11B;zce maj&#xED; i metodu <code>lower</code>. Zkus ji zavolat na sv&#xE9; jm&#xE9;no.</p>\n<div class=\"solution\" id=\"solution-1\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2019/brno-jaro-snake/fast-track/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=\"gp\">&gt;&gt;&gt; </span><span class=\"s1\">&apos;Ola&apos;</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">()</span>\n<span class=\"go\">&apos;ola&apos;</span>\n</pre></div>\n    </div>\n</div><p>Co je metoda (kter&#xE9; vol&#xE1;&#x161; s te&#x10D;kou, jako <code>&apos;Ola&apos;.upper()</code>) a co je funkce\n(kde vlo&#x17E;&#xED;&#x161; informaci do z&#xE1;vorek jako <code>len(&apos;Ola&apos;)</code>),\nto se bude&#x161; muset v&#x17E;dycky zapamatovat nebo vyhledat.</p>\n<h2>Skl&#xE1;d&#xE1;n&#xED; v&#xFD;raz&#x16F;</h2>\n<p>Vol&#xE1;n&#xED; funkce nebo metody m&#x16F;&#x17E;e&#x161; pou&#x17E;&#xED;t jako jinou hodnotu.</p>\n<p>Nech Python spo&#x10D;&#xED;tat matematick&#xFD; v&#xFD;raz <code>(1 + 3) / 2</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"p\">(</span><span class=\"mi\">1</span> <span class=\"o\">+</span> <span class=\"mi\">3</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n<span class=\"go\">2.0</span>\n</pre></div><p>Python nap&#x159;ed se&#x10D;te <code>1 + 3</code> a vyjde mu 4.\n&#x10C;tverku dopln&#xED; m&#xED;sto <code>1 + 3</code> do p&#x16F;vodn&#xED;ho p&#x159;&#xED;kladu, a dostane <code>4 / 2</code>.\nTo vyd&#x11B;l&#xED; a dostane <code>2.0</code>.</p>\n<p>Neboli: <code>(1 + 3) / 2</code> = <code>4 / 2</code> = <code>2.0</code></p>\n<p>Zkus se zamyslet, jak Python zpracuje tyto v&#xFD;razy:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"s1\">&apos;Ola&apos;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n<span class=\"go\">4</span>\n</pre></div><div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"s1\">&apos;J&#xE1; jsem &apos;</span> <span class=\"o\">+</span> <span class=\"s1\">&apos;Ola&apos;</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span>\n<span class=\"go\">&apos;J&#xE1; jsem OLA&apos;</span>\n</pre></div><div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"s1\">&apos;Ola&apos;</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">())</span>\n<span class=\"go\">3</span>\n</pre></div><div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"s1\">&apos;Ola&apos;</span> <span class=\"o\">*</span> <span class=\"mi\">3</span><span class=\"p\">)</span>\n<span class=\"go\">9</span>\n</pre></div><div class=\"solution\" id=\"solution-2\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2019/brno-jaro-snake/fast-track/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        <p><code>&apos;J&#xE1; jsem &apos; + &apos;Ola&apos;.upper()</code> &#x2192; <code>&apos;J&#xE1; jsem &apos; + &apos;OLA&apos;</code> &#x2192; <code>&apos;J&#xE1; jsem OLA&apos;</code></p>\n<p><code>len(&apos;Ola&apos;) + 1</code> &#x2192; <code>3 + 1</code> &#x2192; <code>4</code></p>\n<p><code>len(&apos;Ola&apos;.upper())</code> &#x2192; <code>len(&apos;OLA&apos;)</code> &#x2192; <code>3</code></p>\n<p><code>len(&apos;Ola&apos; * 3)</code> &#x2192; <code>len(&apos;OlaOlaOla&apos;)</code> &#x2192; <code>9</code></p>\n    </div>\n</div><p>Podobn&#xE9; skl&#xE1;d&#xE1;n&#xED; je v&#xA0;programov&#xE1;n&#xED; velice &#x10D;ast&#xE9;.\nV&#x11B;t&#x161;inu z&#xE1;kladn&#xED;ch stavebn&#xED;ch blok&#x16F; se za&#x10D;&#xE1;te&#x10D;n&#xED;k nau&#x10D;&#xED; za p&#xE1;r\nt&#xFD;dn&#x16F; &#x2013; a pak po celou svou progrm&#xE1;torskou kari&#xE9;ru objevuje nov&#xE9; zp&#x16F;soby,\njak je poskl&#xE1;dat do slo&#x17E;it&#x11B;j&#x161;&#xED;ch a slo&#x17E;it&#x11B;j&#x161;&#xED;ch konstrukc&#xED;.</p>\n<h3>Shrnut&#xED;</h3>\n<p>OK, dost bylo &#x159;et&#x11B;zc&#x16F;. Co ses zat&#xED;m nau&#x10D;ila:</p>\n<ul>\n<li><strong>&#x158;et&#x11B;zce</strong> se pou&#x17E;&#xED;vaj&#xED; na pr&#xE1;ci s&#xA0;textem.</li>\n<li><strong>Oper&#xE1;tory</strong> <code>+</code> a <code>*</code> se pou&#x17E;&#xED;vaj&#xED; na spojov&#xE1;n&#xED; a opakov&#xE1;n&#xED; &#x159;et&#x11B;zc&#x16F;.</li>\n<li><strong>Funkce</strong> a <strong>metody</strong> jako <code>len()</code> a <code>upper()</code> prov&#xE1;d&#xED; na &#x159;et&#x11B;zc&#xED;ch\nn&#x11B;jak&#xE9; akce.</li>\n<li><strong>V&#xFD;razy</strong> se daj&#xED; skl&#xE1;dat dohromady.</li>\n</ul>\n<p>&#x10C;&#xED;sla, &#x159;et&#x11B;zce a oper&#xE1;tory a funkce jsou z&#xE1;klady v&#x11B;t&#x161;iny programovac&#xED;ch jazyk&#x16F;.</p>\n<p>P&#x159;ipravena na n&#x11B;co dal&#x161;&#xED;ho? Vsad&#xED;me se, &#x17E;e ano!</p>\n\n\n        "
    }
  }
}