Syntaxe, příklady a případy použití

Při manipulaci s iterovatelnými objekty v Pythonu se často setkáváme s potřebou zjistit, kolik prvků daný objekt obsahuje. Tento článek vás provede použitím vestavěné funkce `len()` v Pythonu pro zjištění délky iterovatelných datových struktur a ukáže vám i další možnosti jejího využití.

Python nabízí celou škálu předdefinovaných datových struktur a metod pro práci s nimi. Kromě toho jsou k dispozici i vestavěné funkce, které se při interakci s těmito strukturami hodí. Jednou z nich je funkce `len()`, která vrací počet prvků v dané iterovatelné struktuře.

V tomto průvodci se seznámíme s použitím funkce `len()` u seznamů, n-tic, řetězců a dalších datových typů. Rovněž si představíme několik běžných scénářů, kde se tato funkce uplatní.

Pojďme na to! 👩‍🏫

Syntaxe funkce `len()` v Pythonu

Následuje syntaxe pro použití funkce `len()` v Pythonu:

len(iterovatelný_objekt)

Jak vidíme, funkce `len()` přijímá jediný argument, a to libovolný platný iterovatelný objekt. Často se jedná o seznam, n-tici nebo řetězec, ale může to být i jakýkoli jiný podporovaný datový typ.

Syntaxe funkce `len()` je velice jednoduchá. Podívejme se nyní na konkrétní příklady v kódu.

📑 Pro účely tohoto tutoriálu můžete kódovat v Python REPL.

Použití funkce `len()` s iterovatelnými objekty

Se sekvencemi

Funkci `len()` můžete použít pro určení délky sekvenčních datových struktur, jako jsou seznamy, n-tice a řetězce.

Zde je příklad:

>>> čísla = [9, 3, 6, 1, 2]
>>> len(čísla)
5

>>> čísla_ntice = (9, 3, 6, 1, 2)
>>> len(čísla_ntice)
5

U těchto datových struktur, které uchovávají posloupnost prvků, se obvykle přistupuje k jednotlivým prvkům pomocí jejich indexů, případně se získává podsekvence pomocí řezu.

S dalšími kolekcemi

Funkci `len()` lze také použít s dalšími kolekcemi v Pythonu, jako jsou množiny a slovníky.

Tyto datové struktury jsou neuspořádané kolekce. I když vás nemusí zajímat pořadí prvků, celkový počet prvků v kolekci může být stále užitečný.

>>> čísla_množina = set(čísla)
>>> len(čísla_množina)
5

>>> ceny = {'Zápisník': 5, 'Pouzdro': 7, 'Záložky': 3, 'Pera': 1, 'Fixy': 8}
>>> len(ceny)
5

Běžné případy použití funkce `len()` v Pythonu

Dosud jsme se seznámili s jednoduchými příklady použití funkce `len()` pro zjištění počtu prvků v iterovatelném objektu. Nyní se podíváme, kde ji můžeme uplatnit v praxi.

#1. Iterace s cyklem `for`

Cyklus `for` v Pythonu umožňuje procházet iterovatelné objekty. Pokud však potřebujete pracovat s indexy prvků, namísto samotných prvků nebo s indexem i prvkem dohromady, můžete využít funkci `range()`, jak je ukázáno níže:

>>> čísla = [9, 2, 4, 7, 8]
>>> for i in range(len(čísla)):
...     print(f"Index {i}: {čísla[i]}")

Funkce `range(N)` generuje posloupnost celých čísel 0, 1, 2, …, N – 1. Tímto způsobem, `range(len(čísla))` získáme sadu platných indexů, které můžeme procházet.

# Výstup
Index 0: 9
Index 1: 2
Index 2: 4
Index 3: 7
Index 4: 8

Nicméně, doporučeným, Pythonic způsobem pro přístup k indexu i prvku je využití funkce `enumerate`:

>>> čísla = [9, 2, 4, 7, 8]
>>> for idx, num in enumerate(čísla):
...     print(f"Index {idx}: {num}")
# Výstup
Index 0: 9
Index 1: 2
Index 2: 4
Index 3: 7
Index 4: 8

#2. Podmíněné opakování s cyklem `while`

Představte si, že máte seznam čísel `čísla`. Metoda seznamu `pop()` odstraní a vrátí poslední prvek seznamu.

Dokud je délka seznamu čísel, zjištěná pomocí `len(čísla)`, větší než nula, existuje alespoň jeden prvek, který lze odstranit.

>>> čísla = [9, 2, 4, 7, 8]
>>> while len(čísla) > 0:
...     čísla.pop()
# Výstup
8
7
4
2
9

Výše uvedený příklad je explicitnější způsob, jak napsat následující kód:

>>> čísla = [9, 2, 4, 7, 8]
>>> while čísla:
...     čísla.pop()

`while čísla:` je ekvivalentní podmínce „dokud seznam `čísla` není prázdný“.

#3. Kontrola a ověření délky iterovatelných objektů

Další běžné použití funkce `len()` je při kontrole a ověřování délky iterovatelných objektů.

Zde ověříme, zda je uživatelské jméno platným řetězcem na základě jeho délky (vypočtené pomocí funkce `len()`):

>>> uživatelské_jméno = "jine_nahodne_jmeno"
>>> if len(uživatelské_jméno) > 10:
...     print("Uživatelské jméno je příliš dlouhé; mělo by mít maximálně 10 znaků.")
... elif len(uživatelské_jméno) < 5:
...     print("Uživatelské jméno je příliš krátké; mělo by mít alespoň 5 znaků.")
... else:
...     print("Platné uživatelské jméno!")
Uživatelské jméno je příliš dlouhé; mělo by mít maximálně 10 znaků.

#4. Seznam a slovníkové komprehenze

Komprehenze v Pythonu poskytují stručnou syntaxi pro vytváření nových iterovatelných objektů z existujících. V rámci komprehenze můžeme používat vestavěné funkce.

Seznamová komprehenze

V této seznamové komprehenzi používáme funkci `len()` pro zjištění délky každého řetězce v seznamu jazyků.

>>> jazyky = ['Python', 'C', 'Rust', 'JavaScript']
>>> delky_jazyku = [len(jazyk) for jazyk in jazyky]
>>> delky_jazyku
[6, 1, 4, 10]

Slovníková komprehenze

V této slovníkové komprehenzi používáme seznam jazyků a funkci `len()` k vytvoření slovníku:

>>> jazyky = ['Python', 'C', 'Rust', 'JavaScript']
>>> jazyk_delka = {jazyk: len(jazyk) for jazyk in jazyky}
>>> jazyk_delka
{'Python': 6, 'C': 1, 'Rust': 4, 'JavaScript': 10}

Zde jsou klíče a hodnoty tvořeny názvy jazyků a jejich délkami.

#5. Klíčový parametr při vlastním řazení

Python disponuje vestavěnou metodou `sort()` pro řazení seznamů na místě a funkcí `sorted()` pro řazení seznamů a dalších iterovatelných objektů.

U obou těchto metod je možné využít parametr `key` pro přizpůsobení procesu řazení.

Zde řadíme seznam jazyků podle délky jejich názvů.

>>> jazyky = ['Python', 'C', 'Rust', 'JavaScript']
>>> jazyky.sort(key=len)
>>> jazyky
['C', 'Rust', 'Python', 'JavaScript']

V následujícím fragmentu kódu používáme funkci `sorted()` pro získání seřazeného seznamu.

>>> jazyky = ['Hindština', 'Angličtina', 'Němčina', 'Francouzština']
>>> sorted(jazyky, key=len)
['Hindština', 'Němčina', 'Francouzština', 'Angličtina']

V tomto případě mají „Němčina“ a „Francouzština“ shodně 6 znaků. Protože funkce `sorted()` provádí stabilní řazení, je zachováno jejich původní pořadí v seznamu.

#6. Délka NumPy polí

Funkci `len()` můžete použít i s dalšími datovými strukturami, jako jsou NumPy pole.

>>> import numpy as np
>>> np_pole = np.array([3, 4, 6, 9])
>>> type(np_pole)
<class 'numpy.ndarray'>
>>> len(np_pole)
4

V tomto případě je `np_pole` vektor o 4 prvcích. Takže `len(np_pole)` vrátí 4, což je počet prvků v poli.

Matice je dvourozměrné pole.

Podívejme se na následující příklad. `len(np_pole)` je 2, což je počet řádků.

>>> matice = [[1, 2, 3], [4, 5, 6]]
>>> np_pole = np.array(matice)
>>> np_pole
array([[1, 2, 3],
       [4, 5, 6]])
>>> len(np_pole)
2

Pro lepší pochopení, vraťme se k proměnné `matice`. Máme zde strukturu vnořených seznamů, kde vnější seznam obsahuje dva vnořené seznamy. A funkce `len()` vrací počet prvků v kontejneru (v tomto případě se jedná o dva seznamy):

>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

Nicméně, pokud pracujete s vícerozměrnými poli, je doporučeno používat atribut `shape`.

>>> np_pole.shape
(2, 3)

Běžná úskalí, kterým je třeba se vyhnout při používání funkce `len()` v Pythonu

Na závěr naší diskuze si projděme několik běžných úskalí, kterým byste se měli vyhnout při používání funkce `len()` v Pythonu.

Použití `len()` s neiterovatelnými datovými typy

Víme, že funkce `len()` přijímá jako argument pouze platné iterovatelné objekty. To znamená, že pokud zavoláte funkci `len()` s neplatným datovým typem, který není iterovatelný, dojde k chybě.

Mezi takové neplatné typy patří základní datové typy jako celá čísla, čísla s plovoucí desetinnou čárkou a booleovské hodnoty:

>>> len(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()

>>> len(True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'bool' has no len()

>>> len(3.14)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'float' has no len()

V Pythonu jsou generátory paměťově efektivní pro scénáře, kdy je potřeba generovat posloupnost. Generátor vrací prvky posloupnosti postupně, jeden po druhém na vyžádání. Nicméně, objekty generátoru nemají definovanou délku.

Pokud se tedy pokusíte vypočítat délku objektu generátoru, dojde k chybě:

>>> čísla_na_druhou = (i * i for i in range(10))
>>> čísla_na_druhou
<generator object <genexpr> at 0x0157DBC0>
>>> len(čísla_na_druhou)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()

Použití `len()` s n-ticemi délky jedna

Pokud vložíte pouze jeden prvek do n-tice, Python jej bude interpretovat jako jeden prvek a ne jako n-tici.

Zde je příklad:

>>> čísla = (1)
>>> len(čísla)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()

Takže, pokud chcete vytvořit n-tici pouze s jedním prvkem, inicializujte ji ve tvaru: `název_ntice = (prvek, )`, aby byla interpretována jako n-tice:

>>> čísla = (1,)
>>> len(čísla)
1

Shrnutí

Zde je shrnutí toho, co jsme probrali v tomto tutoriálu:

  • Počet prvků v libovolném iterovatelném objektu lze zjistit pomocí funkce `len()` v Pythonu. Syntaxe pro použití této funkce je: `len(libovolný_platný_iterovatelný_objekt)`.
  • To zahrnuje sekvence, jako jsou seznamy, n-tice a řetězce, a také další kolekce, jako jsou slovníky a množiny.
  • Funkce `len()` se běžně používá v cyklech a komprehenzích.
  • Funkci `len()` lze také použít jako klíčový parametr, pokud potřebujete přizpůsobit řazení podle délky, například při řazení seznamu řetězců dle jejich délky.

Dále se naučte, jak používat funkci `sum()` v Pythonu.