Funkce a Seznamy v Pythonu: Kompletní Průvodce pro Studenty
Délka: 10 minut
Co je to seznam?
Indexy a slicing
Operace se seznamy
Pozor na kopírování!
Přidávání a odebírání prvků
Řazení a další metody
Práce s více seznamy najednou
Shrnutí
Anna: …takže je to vlastně takový nákupní seznam na steroidech!
Matěj: Přesně tak! Můžeš do něj přidávat, odebírat, přehazovat položky… Je neuvěřitelně flexibilní.
Anna: Okay, tohle si myslím, že musí slyšet každý. Posloucháte Studyfi Podcast a dnes se ponoříme do jedné z nejdůležitějších struktur v Pythonu.
Matěj: Přesně tak, Anno. Dnes jsou na řadě seznamy.
Anna: Dobře, Matěji, tak pojďme úplně od začátku. Co to ten seznam, anglicky 'list', vlastně je?
Matěj: Představ si ho jako uspořádanou krabičku, kam si můžeš dávat různé věci. Čísla, texty, cokoliv. A co je nejdůležitější — a to je klíčový rozdíl oproti textovým řetězcům — tu krabičku můžeš kdykoliv otevřít a věci v ní měnit.
Anna: Aha! Takže zatímco textový řetězec je jako vytesaný do kamene a nemůžu změnit jedno písmenko uprostřed…
Matěj: Přesně. U seznamu můžeš jakýkoliv prvek vzít a nahradit ho jiným. Téhle vlastnosti se říká 'mutabilita', tedy měnitelnost. To je superschopnost seznamů.
Anna: Super! A jak takový seznam vytvořím?
Matěj: Nejjednodušší je prostě napsat prvky do hranatých závorek. Třeba cisla = . Nebo můžeš vytvořit prázdný seznam a postupně ho plnit pomocí metody append().
Anna: Takže začnu s prázdným nákupním košíkem a pak do něj postupně přidávám, co potřebuju?
Matěj: Perfektní přirovnání! Přesně tak to funguje. Můžeš taky převádět jiné typy dat. Třeba z řetězce dna = list("ACGT") ti vznikne seznam .
Anna: Nebo když mám data oddělená čárkami, třeba z nějakého souboru?
Matěj: Ano, tam je skvělá metoda split(). Napíšeš data.split(",") a Python ti to automaticky rozdělí do seznamu podle těch čárek. Extrémně užitečné.
Anna: Dobře, mám seznam pacientů: pacienti = . Jak se dostanu k jednomu konkrétnímu?
Matěj: Úplně stejně jako u řetězců – pomocí indexování. Počítá se od nuly, takže pacienti ti vrátí 'Jan'.
Anna: A co když chci posledního? Nechce se mi počítat, kolik jich je.
Matěj: Na to je skvělá finta. Použiješ záporný index. pacienti je vždycky poslední prvek, pacienti předposlední a tak dále.
Anna: To je geniální! A co když chci získat jen část seznamu? Třeba Marii, Petra a Annu?
Matěj: Tomu se říká 'slicing'. Napsala bys pacienti. Vezme to prvky od indexu 1 až po index 4, ale pozor, ten čtvrtý už tam nebude.
Anna: Takže horní hranice se do toho nepočítá. Rozumím. A co nějaké další triky se slicingem?
Matěj: Určitě. pacienti ti dá vše od začátku do třetího prvku. pacienti zase vše od druhého indexu do konce. A můj oblíbený: pacienti ti obrátí celý seznam pozpátku.
Anna: Fajn, umíme k prvkům přistupovat. Co s nimi dál můžeme dělat? Třeba spojovat seznamy?
Matěj: Jednoduše. Stejně jako řetězce, můžeš je sečíst znaménkem plus. skupina_a + skupina_b ti vytvoří jeden velký seznam.
Anna: A co násobení? To zní trochu divně.
Matěj: Je to spíš opakování. Když napíšeš * 7, nedostaneš nulu, ale seznam, který obsahuje sedm nul. Je to skvělý způsob, jak rychle vytvořit seznam s opakujícími se hodnotami.
Anna: To se hodí. A jak zjistím, jestli je nějaký pacient v mém seznamu?
Matěj: Na to slouží operátor in. Prostě napíšeš if "Jan Novák" in pacienti:. Funguje to krásně čitelně, skoro jako anglická věta.
Matěj: Teď se dostáváme k jedné z nejčastějších chyb, na kterou narazí skoro každý začátečník.
Anna: O co jde? Zní to záhadně.
Matěj: Představ si, že máš seznam a = . A chceš si udělat jeho kopii, tak napíšeš b = a.
Anna: To zní logicky. Co je na tom špatně?
Matěj: Problém je, že se nevytvořila kopie. Proměnná b teď jen ukazuje na ten samý seznam v paměti jako a. Jsou to jen dvě jména pro jednu a tu samou věc.
Anna: Počkat... takže když změním b, třeba přidám čtyřku... tak se změní i a?
Matěj: Přesně! A to je často zdroj nečekaných chyb. Pokud chceš skutečnou, nezávislou kopii, musíš použít metodu copy(). Tedy b = a.copy().
Anna: Páni, to je zásadní informace. Takže b = a je jen další cedulka na stejnou krabici, ale b = a.copy() vytvoří úplně novou, identickou krabici.
Matěj: Perfektně řečeno. Tohle si určitě zapamatujte.
Anna: Pojďme teď k těm metodám, které seznam přímo mění. Jak do něj přidám nový prvek?
Matěj: Nejčastěji použiješ append(), která přidá jeden prvek na konec. Ale co když chceš přidat celý jiný seznam?
Anna: No... použiju append() a přidám ten druhý seznam?
Matěj: Můžeš, ale stane se něco nečekaného. append() přidá ten druhý seznam jako jeden jediný prvek. Budeš mít seznam v seznamu.
Anna: Aha, vnořený seznam! A co když chci jen přidat ty prvky, ne celý seznam?
Matěj: Na to je metoda extend(). Ta vezme všechny položky z druhého seznamu a přidá je jednotlivě na konec toho prvního. Tenhle rozdíl mezi append a extend je hodně důležitý.
Anna: A co odebírání? Jak se zbavím třeba pacientky jménem 'Marie'?
Matěj: Použiješ patients.remove("Marie"). Ale pozor, pokud by tam 'Marie' nebyla, program spadne s chybou. Je bezpečnější se nejdřív zeptat if "Marie" in patients.
Anna: A co když chci odebrat prvek na konkrétní pozici, třeba ten poslední?
Matěj: Na to je skvělá metoda pop(). Bez argumentu odebere a zároveň vrátí poslední prvek. Když jí dáš index, třeba pop(0), odebere a vrátí ten první.
Anna: Super. A co řazení? Jak seřadím seznam čísel od nejmenšího po největší?
Matěj: Na to má seznam metodu sort(). Prostě zavoláš cisla.sort() a ona ti ten seznam na místě seřadí. Pozor, nevrací žádnou hodnotu, jen změní původní seznam.
Anna: Takže kdybych napsala serazena_cisla = cisla.sort(), tak v té nové proměnné nic nebude?
Matěj: Přesně tak, bude tam None. To je další častá past. Pokud chceš vytvořit nový seřazený seznam a ten původní nechat na pokoji, použiješ funkci sorted(). Ta naopak vrací novou, seřazenou kopii.
Anna: Takže sort() mění na místě, sorted() vrací kopii. To je jasné. Jsou ještě nějaké další užitečné metody?
Matěj: Určitě. Třeba .index("Petr") ti najde, na jaké pozici se Petr nachází. A .count(36.5) ti spočítá, kolikrát se v seznamu vyskytuje teplota 36,5.
Anna: Často mám dva seznamy, které patří k sobě. Třeba jména a k nim odpovídající teploty. Jak je projdu oba najednou?
Matěj: Na to je v Pythonu elegantní funkce zip(). Spojí ti ty dva seznamy jako zip a v každém kroku cyklu ti dá jeden prvek z každého. Takže dostaneš jméno a k němu hned příslušnou teplotu.
Anna: To zní mnohem lépe než si pamatovat indexy. A co když chci procházet seznam a zároveň potřebuju vědět, na jakém indexu zrovna jsem?
Matěj: I na to má Python skvělou funkci: enumerate(). Místo složitého počítání ti v každém kroku dá index i hodnotu. Můžeš si dokonce říct, od jakého čísla má začít počítat, třeba od jedničky.
Anna: Takže zip pro paralelní průchod a enumerate pro průchod s indexem. To jsou skvělé vychytávky!
Matěj: Přesně tak. Dělají kód mnohem čistší a čitelnější.
Anna: Matěji, bylo to nabité informacemi. Kdyby si naši posluchači měli odnést jen tři nejdůležitější věci o seznamech, které by to byly?
Matěj: Dobrá otázka. Zaprvé, seznamy jsou měnitelné (mutable), což je jejich hlavní síla oproti řetězcům. Můžete je měnit na místě.
Anna: Rozumím. Za druhé?
Matěj: Dávejte si obrovský pozor na kopírování! b = a nedělá kopii. Pro skutečnou kopii použijte a.copy().
Anna: A poslední, třetí bod?
Matěj: Pamatujte na rozdíl mezi metodami, které mění seznam na místě, a funkcemi, které vrací novou hodnotu. Hlavně sort() versus sorted() a append() versus extend().
Anna: Skvělé shrnutí. Děkujeme, že jste s námi dnes byli. Tohle byl Studyfi Podcast.
Matěj: Mějte se fajn a zase příště!