IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 1 - Úvod do kolekcí v Pythonu

V tutoriálu Python Kolekce se zaměříme na úvodní teorii ke kolekcím. Po absolvování kurzu budeme rozumět pokročilým seznamům, budeme vědět, co je to tuple a co jsou slovníky. Tyto kolekce jsou velmi užitečné pro ukládání a práci s daty v programech. Naučíme se je vytvořit a inicializovat, jak s nimi pracovat (např. přidávat, odebírat prvky), jak se na ně odkazovat a jak je procházet. Vysvětlíme si také příklady použití kolekcí v různých situacích, abychom si ukázali jejich praktickou hodnotu. Pochopíme také rozdíl mezi generickými a obecnými kolekcemi.

Minimální požadavky

Pro tento kurz je nutné ovládat Základní konstrukce jazyka a Objektově orientované programování v Pythonu.

Kolekce v Pythonu

Pojem kolekce označuje v Pythonu datové typy, které umožňují ukládat více hodnot v jednom objektu. Mezi nejběžnější kolekce v Pythonu patří seznamy, tuple, slovníky a množiny. Kolekcí nicméně existuje více, a ačkoli se zvenku mnohdy tváří podobně, uvnitř fungují velmi odlišně. Vybíráme si je tedy podle konkrétního účelu.

Hash table a kolekce

Python má několik různých typů kolekcí, jako jsou seznamy, sady a slovníky. Tyto kolekce jsou založeny na principu hash table, což je datová struktura, která umožňuje rychlé vyhledávání, přidávání a odebírání prvků.

Hash table funguje tak, že pro každý prvek kolekce se vytvoří hash (číslo) na základě jeho hodnoty. Tato hodnota se poté použije jako index, který označuje, kde se prvek uloží. Když se v budoucnu potřebujeme k prvku vrátit, vytvoříme znovu hash a použijeme ho jako index pro jeho vyhledání. Tento proces je velmi rychlý.

Genericita v Pythonu

V Pythonu jsou generické typy implementovány pomocí modulu typing, který byl představen v Pythonu 3.5. Modul typing nám umožňuje specifikovat typy prvků v kolekci. Generické kolekce v Pythonu jsou specifické pro daný typ, což znamená, že obsahují pouze prvky jednoho typu. Cílem generik v Pythonu, stejně jako v jiných programovacích jazycích, je zlepšit reusability (opakovatelnost) kódu a snížit počet duplicitních částí. Generické třídy a metody umožňují kódu pracovat s různými typy dat bez nutnosti explicitního určení typu. Jedna třída nebo metoda tedy může být použita pro různé typy dat bez nutnosti vytvoření nové verze pro každý konkrétní typ. To umožňuje kódu být flexibilnější.

Je ale třeba mít na paměti, že když definujeme proměnnou nebo atribut třídy jako generický typ (např. List[int]), Python nezkontroluje v runtime, jestli proměnná nebo atribut skutečně obsahují prvky tohoto typu. Můžeme tedy přiřadit libovolný typ hodnoty k proměnné deklarované jako generický typ a Python nevyvolá chybu. To ale může vést k chybám, pokud omylem proměnné přiřadíme hodnotu špatného typu. Python se tím liší od staticky typovaných jazyků, jako jsou Java nebo C#, kde kompilátor zkontroluje v runtime, že proměnná nebo atribut prvky daného typu skutečně obsahuje. Při omylem přiřazené hodnotě špatného typu Java nebo C# na rozdíl od Pythonu vyvolají v runtime chybu.

V praxi tedy můžeme říci, že staticky typované jazyky mají větší ochranu proti typovým chybám. Avšak zároveň jsou ale více omezující při definování proměnných a atributů třídy, protože je nutné specifikovat jejich typy explicitně. V Pythonu máme tedy větší flexibilitu, ale současně to znamená, že musíme být opatrnější.

Type hints

Řekněme, že chceme vytvořit kolekci instancí nějaké třídy. V Pythonu (3.9) je to velmi snadné. S použitím type hints to zvládneme velmi rychle:

from dataclasses import dataclass


@dataclass
class Postava:
    jmeno: str
    level: int = 1


hrac1 = Postava("Sven Kladivo")
hrac2 = Postava("Rudá Sonja", 2)
host = "Není postava"
postavy: list[Postava] = [hrac1, hrac2]

print(postavy)
postavy.append(host)
print(postavy)

V konzoli uvidíme výstup:

Konzolová aplikace
[Postava(jmeno='Sven Kladivo', level=1), Postava(jmeno='Rudá Sonja', level=2)]
[Postava(jmeno='Sven Kladivo', level=1), Postava(jmeno='Rudá Sonja', level=2), 'Není postava']

Tímto způsobem dokážeme vytvořit kolekci libovolných objektů.

Uživatelem definované generické typy

V následujícím příkladu si vytvoříme třídu Rodina. Typ obsahu třídy je obecný a uvedeme ho ve chvíli, kdy vytváříme instanci této třídy. Po vytvoření instance bude tato instance na rozdíl od předchozího příkladu přijímat pouze argumenty tohoto typu:

from typing import Dict, Generic, TypeVar

T = TypeVar("T")

class Rodina(Generic[T]):
    def __init__(self) -> None:
        self._uloz: Dict[str, T] = {}

    def nastav_polozku(self, k: str, v: T) -> None:
        self._uloz[k] = v

    def nacti_polozku(self, k: str) -> T:
        return self._uloz[k]

if __name__ == "__main__":
    jmeno_pribuzneho = Rodina[str]()
    vek_pribuzneho = Rodina[int]()

    jmeno_pribuzneho.nastav_polozku("manželka", "Dana")
    jmeno_pribuzneho.nastav_polozku("dědeček", "Tomáš")

    vek_pribuzneho.nastav_polozku("Tomáš", 70)

Genericita nám tedy umožnila vytvořit třídu, kterou lze použít s více typy. Současně díky nástrojům jako je mypy nedovolí, aby byly do metod instance odesílány jiné argumenty než ty zadaného typu. Proto pokud se pokusíme o vložení řetězce místo čísla do věku:

vek_pribuzneho.nastav_polozku("Tomáš", "citron")

mypy nám vynadá:

Konzolová aplikace
Argument 2 to "nastav_polozku" of "Rodina" has incompatible type "str"; expected "int"

Využití kolekcí v Pythonu

Využití kolekcí je velmi široké. Mohou být použity pro různé úkoly a aplikace, jako například:

  • práce s databází: slovníky a seznamy jsou často používány pro ukládání a práci s daty z databáze,
  • textové procesy: seznamy a tuple jsou často používány pro práci s textem například pro rozdělení textu na slova nebo procházení textu po řádcích,
  • matematické operace: množiny jsou často používány pro matematické operace, jako je například práce s množinou unikátních hodnot nebo sjednocení nebo rozdíl množin,
  • webové aplikace: slovníky a seznamy jsou často používány pro práci s daty z webových aplikací, jako jsou například JSON nebo XML soubory,
  • algoritmy: Seznamy a tuple jsou často používány pro implementaci různých algoritmů, jako jsou například prohledávání nebo řazení.

V každém případě volba kolekce závisí na konkrétním úkolu a na tom, jakým způsobem chceme data manipulovat. Je důležité si uvědomit vlastnosti jednotlivých kolekcí a vybrat tu nejvhodnější pro daný úkol.

V příští lekci, Tuples, množiny a slovníky v Pythonu, se podíváme na tuples, množiny a slovníky.


 

Všechny články v sekci
Kolekce v Pythonu
Přeskočit článek
(nedoporučujeme)
Tuples, množiny a slovníky v Pythonu
Článek pro vás napsal Ondřej Tom
Avatar
Uživatelské hodnocení:
231 hlasů
a
Aktivity