<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="/cjs/screen.xsl" media="screen"?>
<lecture>

<meta>
  <maintitle>Python</maintitle>
  <author>Jiří Znamenáček</author>
  <title>Sekvenční typy</title>
  <date>2011-11-10</date>
  <link><!--a href="http://vyuka.ookami.cz" rel="external">http://vyuka.ookami.cz</a--></link>
</meta>
<!--
  „“–
  ←→ ↑↓ ↔↕
  ↵ aneb &#x21B5; aneb \r aneb CR aneb CarriageReturn
-->


<slide title="Úvod">

  <p>
    <strong>Sekvence</strong> jsou v Python'u vůbec nejrozsáhlejší datový typ. Patří mezi ně např. <a href="lists.xml">seznamy</a>, <em>řetězce</em> (<a href="strings.xml">textové</a> i <a href="bytes.xml">bajtové</a>) nebo <a href="tuples.xml">n-tice</a>. Mezi jejich význačné vlastnosti patří především:
  </p>
  <ul>
    <li>
      přístup k prvkům podle jejich pozice výřezovou notací <code>[:]</code>
    </li>
    <li>
      podpora zjišťování délky funkcí <code>len()</code>
    </li>
    <li>
      dotaz na výskyt prvku <code>in</code>, resp. <code>not in</code>
    </li>
    <li>
     podpora pro přirozené procházení prvků sekvence smyčkou <code>for-in</code>
    </li>
  </ul>

</slide>
<slide title="Testovací sekvence">

  <p>
    Pro ukázky vlastností sekvencí budeme používat následující řetězec:
  </p>
  <example lang="python">
    >>> sekvence = "Ahoj, světe! Jak se máš?"
  </example>
  <br/>
  <p>
    PS: Kdyby někomu řetězec připadal na první pohled málo „sekvenční“, nechť si z něj vyrobí třeba seznam znaků, se kterým se bude z hlediska sekvenčních typů pracovat úplně stejně:
  </p>
  <example lang="python">
>>> list(sekvence)
['A', 'h', 'o', 'j', ',', ' ', 's', 'v', 'ě', 't', 'e', '!',
 ' ', 'J', 'a', 'k', ' ', 's', 'e', ' ', 'm', 'á', 'š', '?']
  </example>

</slide>
<slide title="Operátor „in“">

  <p>
    Sekvence se skládají z prvků a v Python'u se jich můžeme pomocí operátoru <code>in</code> (resp. jeho záporné varianty <code>not in</code>) ptát, zda se <strong>nějaký prvek někde v sekvenci vyskytuje</strong>:
  </p>
  <example lang="python">
    >>> sekvence = "Ahoj, světe! Jak se máš?"
    
    >>> 'A' in sekvence
    True
    
    >>> 'A' not in sekvence
    False
  </example>
  <note>
    PS: Dobře, zrovna u řetězce má operátor <code>in</code> trochu širší použití – může se ptát na celé sousedící skupiny znaků. Ale když se omezíme na znak jeden, je korespondence s ostatními sekvenčními typy dost dobrá.
  </note>

</slide>
<slide title="Funkce „len()“">

  <p>
    Základní vlastností sekvencí je, že obsahují jistý <strong>počet prvků</strong>. Ke zjištění tohoto počtu slouží vestavěná funkce na globální úrovni (v nulovém jmenném prostoru) <em>len()</em>:
  </p>
  <example lang="python">
    >>> sekvence = "Ahoj, světe! Jak se máš?"
    
    >>> len(sekvence)
    24
    
    # prázdná sekvence (zde prázdný řetězec) nemá žádný prvek
    >>> len("")
    0
  </example>

</slide>
<slide title="Výřezová notace „[:]“ I">

  <p>
    Pro Python a sekvence je zcela zásadní a typické, že k jejich prvkům se přistupuje pomocí jejich <strong>pořadí</strong>, jinak též <em>indexu</em>.
  </p>
  <note>
    To tedy znamená, že <em>prvky v sekvenci mají zaručené pořadí</em>!
  </note>
  
  <p class="enumerate">
    Přitom pozice prvku se v Python'u počítá <em>od nuly</em>:
  </p>
  <example lang="python">
    >>> sekvence = "Ahoj, světe! Jak se máš?"
    
    >>> sekvence[0]
    'A'
    >>> sekvence[4]
    ','
  </example>
  
  <p class="enumerate">
    Narozdíl od mnoha jiných jazyků máme v Python'u k dispozici i indexování <em>od konce pomocí záporných indexů</em>:
  </p>
  <example lang="python">
    >>> sekvence = "Ahoj, světe! Jak se máš?"
    
    >>> sekvence[-1]
    '?'
    >>> sekvence[-4]
    'm'
  </example>

</slide>
<slide title="Výřezová notace „[:]“ II">

  <p>
    Další zajímavou vlastností pythonovských sekvencí je podpora výřezové notace ve stejné podobě jako u <a href="/materialy/python/overview.2.xml?slajd=23">rozsahů</a>, tedy ve tvaru <code>[OD-INDEXU, PŘED-INDEX, KROK]</code> což obnáší:
  </p>
  
  <p class="enumerate">
    Vlastní výřezy:
  </p>
  <example lang="python">
    >>> sekvence = "Ahoj, světe! Jak se máš?"
    
    >>> sekvence[6:11]
    'světe'
    >>> sekvence[-4:-1]
    'máš'
  </example>
  
  <p class="enumerate">
    Výřezy až do kraje:
  </p>
  <example lang="python">
    >>> sekvence = "Ahoj, světe! Jak se máš?"
    
    >>> sekvence[:4]
    'Ahoj'
    >>> sekvence[-4:]
    'máš?'
  </example>
  
  <p class="enumerate">
    Výřezy s krokem, a to i záporným:
  </p>
  <example lang="python">
    >>> sekvence = "Ahoj, světe! Jak se máš?"
    
    >>> sekvence[:12:2]
    'Ao,sěe'
    >>> sekvence[::-3]
    '?msa!ě o'
  </example>

</slide>
<slide title="Smyčka „for-in“">

  <p>
    Jelikož se jedná o sekvence, je možné jejich prvky procházet v zaručeném a předem určeném pořadí (typicky pořadí přidání prvků do sekvence). Základním nástrojem pro to je smyčka <em>for-in</em>.
  </p>
  
  <p class="enumerate">
    V základním provedení smyčka <em>for-in</em> prochází prvky sekvence <strong>v přirozeném pořadí po jejích prvcích</strong>:
  </p>
  <example lang="python">
>>> sekvence = "Ahoj, světe! Jak se máš?"

>>> for prvek in sekvence:
      print(prvek, end='')
      
Ahoj, světe! Jak se máš?
  </example>
  
  <p class="enumerate">
    Stejně tak dobře si ale můžete sekvenci před průchodem nechat seřadit pomocí vestavěné funkce <em>sorted()</em>:
  </p>
  <example lang="python">
    >>> sekvence = "Ahoj, světe! Jak se máš?"
    >>> for prvek in sorted(sekvence):
          print(prvek, end='')
    
    !,?AJaeehjkmosstváěš
  </example>
  <note>
    Způsob řazení záleží samozřejmě na typu a dá se upravit pomocí parametrů <em>key</em> a <em>reverse</em> (viz <a href="/materialy/python/sorting/overview.xml">přednáška o třídění</a>).
  </note>

</slide>
<slide title="Smyčka „for-in-enumerate“">

  <p>
    Smyčka <em>for-in</em> se dá zavolat ještě v mírně modifikované variantě za pomoci funkce <em>enumerate()</em>. Tato funkce zachovává přirozený způsob průchodu prvků sekvence, navíc ale ke každému vrácenému prvku přidává i jeho pozici (index) v rámci sekvence, přičemž obě tyto hodnoty poskytuje najednou v podobě n-tice o dvou prvcích:
  </p>
  <example lang="python">
>>> sekvence = "Ahoj, světe! Jak se máš?"
>>> for pozice, prvek in enumerate(sekvence):
      print(pozice, prvek)

0 A
1 h
2 o
3 j
4 ,
5  
6 s
7 v
8 ě
9 t
10 e
11 !
12  
13 J
14 a
15 k
16  
17 s
18 e
19  
20 m
21 á
22 š
23 ?
  </example>

</slide>
<slide title="Příkaz „del“">

  <p>
    Ačkoli každá <em>proměnná</em> (<em>mutable</em>) sekvence poskytuje nějaký způsob (často dokonce mnoho různých), jak ze sebe <strong>odstraňovat prvky</strong>, univerzální příkaz <em>del</em>, který jinak slouží k „likvidaci“ objektů ze jmenného prostoru, se dá použít právě i k tomuto.
  </p>
  <p>
    Parametry pro určení prvků ke smazání přitom příkaz <em>del</em> přijímá jako rozsahy ve stejné podobě jako <a href="?slajd=5">rozsahy pro výřez ze sekvence</a>:
  </p>
  <example lang="python">
>>> sekvence = "Ahoj, světe! Jak se máš?"
>>> sekvence = list("Ahoj, světe! Jak se máš?")
>>> sekvence
['A', 'h', 'o', 'j', ',', ' ', 's', 'v', 'ě', 't', 'e', '!', ' ', 'J', 'a', 'k',
 ' ', 's', 'e', ' ', 'm', 'á', 'š', '?']

>>> del sekvence[0]
>>> sekvence
['h', 'o', 'j', ',', ' ', 's', 'v', 'ě', 't', 'e', '!', ' ', 'J', 'a', 'k', ' ',
 's', 'e', ' ', 'm', 'á', 'š', '?']

>>> del sekvence[:5]
>>> sekvence
['s', 'v', 'ě', 't', 'e', '!', ' ', 'J', 'a', 'k', ' ', 's', 'e', ' ', 'm', 'á',
 'š', '?']

>>> del sekvence[-5:]
>>> sekvence
['s', 'v', 'ě', 't', 'e', '!', ' ', 'J', 'a', 'k', ' ', 's', 'e']

>>> del sekvence[4:9:2]
>>> sekvence
['s', 'v', 'ě', 't', '!', 'J', 'k', ' ', 's', 'e']
  </example>
  <note>
    Jelikož řetězec je typ neproměnný, převedl jsem ho pro tuto ukázku na typ proměnný, totiž seznam.
  </note>

</slide>


</lecture>
