Pochopení funkce součtu v Pythonu [With Examples]

Objevte všechny aspekty funkce sum() v Pythonu. Prozkoumáme její syntaxi, různorodé použití s iterovatelnými strukturami a poskytneme praktické ukázky kódu.

Při manipulaci s iterovatelnými datovými typy v Pythonu, například seznamy čísel, je běžnou operací zjišťování součtu všech prvků. Tento úkol se objevuje i při práci s jinými iterovatelnými kolekcemi, jako jsou n-tice a množiny.

Existuje několik přístupů k řešení tohoto problému, ale nejvíce doporučeným a „pythonovským“ řešením je použití vestavěné funkce sum().

Začneme s pohledem na alternativní metody, jako je použití smyček a definování vlastní funkce. Následně se zaměříme na detailní prozkoumání syntaxe funkce sum() v Pythonu, včetně příkladů kódu pro lepší pochopení.

Sčítání hodnot v iterovatelných objektech v Pythonu

Můžete experimentovat s kódem přímo v Python REPL, případně využít online editor Pythonu.

Uvažujme následující seznam čísel:

>>> nums = [2,8,5,3,11,7,9]

Naším cílem je vypočítat součet všech čísel v seznamu. Než se dostaneme k samotné funkci sum(), projdeme si několik dalších metod, které můžeme použít. Mezi tyto metody patří:

  • Použití jednoduché smyčky for
  • Využití funkce reduce() z modulu functools
  • Definování vlastní uživatelské funkce

Použití smyček

Pro výpočet součtu všech prvků v seznamu můžeme použít smyčku for následovně:

  • Inicializujeme proměnnou pro součet na nulu.
  • Projdeme seznam čísel a získáme přístup ke každému číslu.
  • Přidáme aktuální číslo k celkovému součtu.
>>> nums = [2,8,5,3,11,7,9]
>>> total = 0
>>> for num in nums:
...     total += num
...
>>> total
45

Využití funkce reduce

Další metodou pro sčítání prvků v iterovatelných objektech je použití funkce reduce(). Tato funkce, zabudovaná do modulu functools v Pythonu, přijímá funkci a iterovatelný objekt. Funkce reduce() postupně aplikuje danou funkci na prvky iterovatelného objektu a redukuje jej na jednu hodnotu.

V následujícím příkladu použijeme lambda funkci k definování sčítání dvou čísel. Tento proces je aplikován na seznam čísel:

>>> nums = [2,8,5,3,11,7,9]
>>> from functools import reduce
>>> total = reduce(lambda n1, n2: n1 + n2, nums)
>>> total
45

Funkce reduce() iterativně sčítá dvě čísla zleva doprava, dokud se celková hodnota nesníží na součet.

Definování vlastní funkce

Můžeme také definovat vlastní funkci pro tento účel. Vytvoříme funkci sum_list, která:

  • Přijme jako argument seznam čísel.
  • Vrátí součet všech prvků seznamu.

Tělo funkce využívá konstrukci smyčky, kterou jsme si představili výše. Definování funkce nám však umožňuje opakované použití kódu.

>>> def sum_list(some_list):
...     total = 0
...     for num in some_list:
...        total += num
...     return total
...

Volání funkce sum_list() s argumentem nums vrátí součet 45:

>>> nums = [2,8,5,3,11,7,9]
>>> total = sum_list(nums)
>>> total
45

Nyní se podíváme na vestavěnou funkci sum(). Ta je nejen stručná, ale také robustní, protože dobře funguje s různými iterovatelnými objekty a datovými typy.

Syntaxe funkce sum() v Pythonu

Syntaxe použití funkce sum() je následující:

sum(iterable, start)

Kde:

  • iterable je povinný argument. Může to být libovolný iterovatelný objekt, který podporuje operaci sčítání, jako je seznam nebo n-tice čísel. Použití funkce sum() s řetězci vyvolá výjimku TypeError (více o tom později).
  • start je volitelný argument. Často je to číselná hodnota, která se přičte k vypočtenému součtu. Tato možnost je užitečná, když potřebujeme k výsledku přičíst konstantní hodnotu.

Nyní, když známe syntaxi funkce sum() v Pythonu, podívejme se na její použití při sčítání prvků iterovatelných objektů.

Sčítání iterovatelných objektů pomocí funkce sum()

#1. Seznam

Nalezněme součet čísel v seznamu pomocí funkce sum():

>>> nums = [2,8,5,3,11,7,9]
>>> sum_1 = sum(nums)
>>> sum_1
45

Použití volitelné počáteční hodnoty

Pokud chceme k součtu přičíst konstantní hodnotu, můžeme použít funkci sum() s volitelnou počáteční hodnotou. V následujícím příkladu přidáme hodnotu 100 jako poziční argument:

>>> sum_start = sum(nums,100)
>>> sum_start
145

Počáteční hodnotu lze také zadat jako argument s klíčovým slovem:

>>> sum_start = sum(nums,start=10)
>>> sum_start
55

#2. N-tice

Funkce sum() funguje také s n-ticemi. N-tici nums_tuple vytvoříme přetypováním seznamu nums na n-tici:

>>> nums_tuple = tuple(nums)
>>> nums_tuple
(2, 8, 5, 3, 11, 7, 9)
>>> sum_2 = sum(nums_tuple)
>>> sum_2
45

#3. Množina

Můžeme také použít funkci sum() s množinou čísel:

>>> nums_set = set(nums)
>>> nums_set
{2, 3, 5, 7, 8, 9, 11}

V tomto příkladu přetypujeme seznam nums na množinu a vypočítáme součet prvků v nums_set.

>>> sum_3 = sum(nums_set)
>>> sum_3
45

#4. Slovník

Uvažujme následující slovník students_dict s číselnými klíči. Podívejte se, co se stane, když zavoláme funkci sum() s tímto slovníkem jako argumentem.

>>> students_dict = {1:106,2:112,3:127}
>>> sum_4 = sum(students_dict)
>>> sum_4
6

Ve výchozím nastavení funkce sum() vrací součet klíčů slovníku.

Sčítání klíčů

Jak víme, výchozí chování funkce je sečtení klíčů slovníku.

Můžeme však toto chování explicitně vyjádřit použitím metody keys() k přístupu ke klíčům, které pak předáme funkci sum():

>>> sum_keys = sum(students_dict.keys())
>>> sum_keys
6

Sčítání hodnot

Pokud místo toho chceme sečíst hodnoty slovníku, můžeme k nim přistoupit voláním metody values() na objektu slovníku:

>>> sum_vals = sum(students_dict.values())
>>> sum_vals
345

Použití funkce sum() v Pythonu s jinými typy číselných dat

Dosud jsme viděli, jak používat funkci sum() s iterovatelnými objekty obsahujícími celá čísla. Nyní se podíváme na několik příkladů s jinými číselnými datovými typy.

Komplexní čísla

Funkci sum() lze také použít ke sčítání komplexních čísel. V tomto příkladu nums_c je seznam komplexních čísel:

>>> nums_c = [3 + 4j, 1 + 2j]
>>> sum_c = sum(nums_c)
>>> sum_c
(4+6j)

Čísla s plovoucí desetinnou čárkou

V tomto příkladu použijeme funkci sum() k sečtení seznamu čísel s plovoucí desetinnou čárkou nums_f:

>>> nums_f = [1.8,2.5,3.6,7.2]
>>> sum_f = sum(nums_f)
>>> sum_f
15.100000000000001

Pro vyšší přesnost při sčítání čísel s plovoucí desetinnou čárkou můžete použít funkci fsum() z modulu math.

Zploštění iterovatelných objektů pomocí funkce sum()

Nyní se podívejme, jak lze funkci sum() použít ke sloučení a zřetězení iterovatelných objektů.

Zploštění seznamu

Předpokládejme, že máme vnořený seznam:

>>> lists = [[2,4,6],[3,5,7]]

Když zavoláme funkci sum() a předáme jí tento vnořený seznam jako argument spolu s prázdným seznamem jako počáteční hodnotou:

>>> sum(lists,[])
[2, 4, 6, 3, 5, 7]

Vidíme, že vnořený seznam byl transformován do jednoho plochého seznamu čísel.

Pokud uvažujeme, že seznam má tvar l3 = [l1,l2], funkce sum() zřetězí dva seznamy l1 a l2, které jsou vnořené v l3.

Pro procvičení si zkuste použít funkci sum() na jiné vnořené iterovatelné objekty.

Časté úskalí: Nepoužívejte funkci sum() s řetězci

Jak už jsme viděli, funkci sum() lze použít ke sloučení a zřetězení seznamů (a dalších iterovatelných objektů, jako jsou n-tice). Proto by se mohlo zdát lákavé ji použít i ke zřetězení řetězců.

Pokud se o to ale pokusíte, narazíte na výjimku TypeError:

>>> sum(['a','b','c'],'')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]

Funkci sum() tedy nelze použít k sečtení (nebo zřetězení) řetězců.

Jak je ale uvedeno ve výše zmíněné chybové zprávě, můžete použít metodu join() ke zřetězení seznamu řetězců do jednoho řetězce.

>>> ''.join(['a','b','c'])
'abc'

Závěr

V tomto tutoriálu jsme se naučili, jak používat vestavěnou funkci sum() k nalezení součtu všech prvků v iterovatelném objektu. Obecná syntaxe pro použití funkce sum() je: sum(iterable, start), kde iterable je povinný argument a start je argument volitelný.

Ukázali jsme si několik příkladů, abychom pochopili použití funkce sum() s iterovatelnými objekty, jako jsou seznamy, n-tice, množiny a slovníky. Později jsme se podívali na to, jak lze funkci sum() použít ke zploštění a zřetězení iterovatelných objektů, kromě řetězců v Pythonu.

Doufám, že vám tento tutoriál byl užitečný. Dále byste si mohli chtít prohlédnout tento tutoriál o funkci map() v Pythonu.