Zrozumienie funkcji sumy w Pythonie [With Examples]

Odkryj tajniki funkcji sum() w języku Python: od jej konstrukcji po różnorodne zastosowania z iterowalnymi strukturami danych, wzbogacone praktycznymi przykładami kodu.

Podczas operowania na sekwencjach danych w Pythonie, takich jak listy liczb, częstym zadaniem jest obliczenie sumy wszystkich elementów. Podobne potrzeby pojawiają się również w przypadku innych struktur iterowalnych, takich jak krotki czy zbiory.

Istnieje kilka metod realizacji tego zadania, jednak Python rekomenduje użycie wbudowanej funkcji sum().

Na początku przyjrzymy się alternatywnym podejściom, takim jak iteracja za pomocą pętli i tworzenie własnych funkcji. Następnie skupimy się na składni funkcji sum() oraz zaprezentujemy przykłady, które pomogą Ci w pełni zrozumieć jej działanie.

Sumowanie wartości w kolekcjach iterowalnych Pythona

Zachęcamy do eksperymentowania z kodem w interaktywnym środowisku Python REPL lub w dowolnym edytorze online.

Weźmy pod uwagę następującą listę liczb:

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

Naszym celem jest obliczenie sumy wszystkich elementów tej listy. Zanim przejdziemy do omówienia funkcji sum(), zapoznamy się z innymi technikami, które można zastosować, w tym:

  • Użycie pętli for
  • Wykorzystanie funkcji reduce() z modułu functools
  • Zdefiniowanie własnej funkcji

Zastosowanie pętli

Aby obliczyć sumę wszystkich elementów listy, możemy wykorzystać pętlę for w następujący sposób:

  • Zainicjalizuj zmienną total wartością zero.
  • Przejdź przez listę nums, uzyskując dostęp do każdego elementu.
  • Dodaj wartość bieżącego elementu do zmiennej total.
>>> nums = [2,8,5,3,11,7,9]
>>> total = 0
>>> for num in nums:
...     total += num
...
>>> total
45

Wykorzystanie funkcji `reduce()`

Innym podejściem do sumowania elementów kolekcji jest użycie funkcji reduce(). Ta funkcja, dostępna w module functools Pythona, przyjmuje jako argumenty funkcję oraz obiekt iterowalny. Następnie sukcesywnie aplikuje funkcję na elementach iterowalnych, „redukując” je do pojedynczej wartości.

W naszym przypadku używamy funkcji lambda, aby zdefiniować operację dodawania dwóch liczb, przekazując listę nums jako obiekt iterowalny.

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

Funkcja reduce() działa poprzez kolejne dodawanie dwóch liczb – od lewej do prawej – aż do uzyskania pojedynczej wartości będącej sumą:

Zastosowanie własnej funkcji

Możemy również zdefiniować własną funkcję, która wykona to zadanie. Utworzymy funkcję sum_list, która:

  • Przyjmuje listę liczb jako argument.
  • Zwraca sumę elementów znajdujących się na tej liście.

W ciele funkcji wykorzystujemy konstrukcję pętli, którą omawialiśmy wcześniej. Zaletą zdefiniowania własnej funkcji jest możliwość jej wielokrotnego użycia.

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

Wywołanie funkcji sum_list() z listą nums jako argumentem zwraca sumę równą 45:

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

Teraz przejdźmy do wbudowanej funkcji sum(). Jest ona nie tylko zwięzła, ale również uniwersalna, ponieważ działa poprawnie z różnymi strukturami iterowalnymi i typami danych.

Składnia funkcji `sum` w Pythonie

Składnia funkcji sum() wygląda następująco:

sum(iterable, start)

Gdzie:

  • iterable jest argumentem obowiązkowym. Może to być dowolna struktura iterowalna, dla której operacja sumowania ma sens, np. lista lub krotka liczb. Wywołanie funkcji sum() z argumentem będącym łańcuchem znaków spowoduje zgłoszenie wyjątku TypeError (więcej o tym później).
  • start jest argumentem opcjonalnym. Najczęściej jest to wartość liczbowa, która jest dodawana do obliczonej sumy. Może to być przydatne, gdy trzeba dodać stałą wartość do wyniku.

Po zapoznaniu się ze składnią funkcji sum() w Pythonie, wykorzystajmy ją do sumowania elementów różnych struktur iterowalnych.

Sumowanie obiektów iterowalnych za pomocą funkcji `sum`

#1. Lista

Obliczmy sumę liczb na liście nums przy użyciu funkcji sum():

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

Wykorzystanie opcjonalnej wartości początkowej

Aby dodać stałą wartość do sumy, możemy użyć funkcji sum() z opcjonalną wartością początkową. W tym przykładzie przekazujemy wartość początkową 100 jako argument pozycyjny:

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

Wartość początkową można również podać jako argument nazwany:

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

#2. Krotka

Funkcja sum() działa również z krotkami. Utwórzmy krotkę nums_tuple, przekształcając listę nums na krotkę:

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

#3. Zbiór

Możemy także użyć funkcji sum() ze zbiorem liczb:

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

Tutaj przekształcamy listę nums w zbiór Pythona i obliczamy sumę jego elementów:

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

#4. Słownik

Rozważmy następujący słownik student_dict, w którym kluczami są liczby. Zwróć uwagę na zachowanie funkcji sum(), gdy przekażemy jej ten słownik jako argument.

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

Domyślnie funkcja sum() zwraca sumę kluczy słownika.

Sumowanie kluczy

Wiemy, że domyślnym zachowaniem jest sumowanie kluczy słownika.

Aby wyraźnie zaznaczyć, że chcemy sumować klucze, możemy skorzystać z metody keys() obiektu słownika, aby uzyskać do nich dostęp. Następnie listę kluczy przekazujemy do funkcji sum():

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

Sumowanie wartości

Jeżeli zamiast tego chcemy zsumować wartości słownika, uzyskujemy do nich dostęp, wywołując metodę values() na obiekcie słownika:

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

Użycie funkcji `sum` w Pythonie z innymi numerycznymi typami danych

Do tej pory widzieliśmy, jak używać funkcji sum() z kolekcjami liczb całkowitych. Spójrzmy teraz na kilka przykładów z innymi numerycznymi typami danych.

Liczby zespolone

Funkcja sum() może być również używana do sumowania liczb zespolonych. W tym przykładzie nums_c jest listą liczb zespolonych:

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

Liczby zmiennoprzecinkowe

Tutaj używamy funkcji sum() do zsumowania listy liczb zmiennoprzecinkowych nums_f:

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

Aby zwiększyć dokładność wyników dodawania liczb zmiennoprzecinkowych, można użyć funkcji fsum() z modułu math.

Spłaszczanie iteracji za pomocą funkcji `sum`

Zobaczmy teraz, jak można wykorzystać funkcję sum() do spłaszczania i łączenia iteracji.

Spłaszczanie listy

Załóżmy, że mamy zagnieżdżoną listę:

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

Kiedy wywołamy funkcję sum(), przekazując jej tę zagnieżdżoną listę jako argument, oraz pustą listę jako wartość początkową:

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

Widzimy, że zagnieżdżona lista została spłaszczona do pojedynczej listy liczb.

Równoważnie, jeżeli potraktujemy listę w postaci l3 = [l1,l2], to funkcja sum() połączy dwie listy l1 i l2, zagnieżdżone w liście l3.

Zachęcamy do eksperymentowania z funkcją sum() na innych zagnieżdżonych iteracjach.

Częsty błąd: nie używaj funkcji `sum()` z łańcuchami znaków

Widzieliśmy, że funkcja sum() może być używana do spłaszczania i łączenia list (oraz innych iterowalnych struktur danych, takich jak krotki). W związku z tym kuszące może być użycie jej również do łączenia łańcuchów znaków.

Jeżeli spróbujemy to zrobić, napotkamy błąd 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]

Funkcji sum() nie można używać do sumowania (lub łączenia) łańcuchów znaków.

Jak widać w powyższym komunikacie o błędzie, można użyć metody join() do połączenia listy łańcuchów znaków w pojedynczy łańcuch.

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

Podsumowanie

W tym samouczku nauczyliśmy się, jak używać wbudowanej funkcji sum() do obliczania sumy wszystkich elementów w obiekcie iterowalnym. Ogólna składnia funkcji sum() to sum(iterowalna, start), gdzie iterowalna jest argumentem obowiązkowym, a start argumentem opcjonalnym.

Następnie zaprezentowaliśmy szereg przykładów, które pomogły w zrozumieniu działania funkcji sum() z iterowalnymi strukturami danych, takimi jak listy, krotki, zbiory i słowniki. Dowiedzieliśmy się również, jak wykorzystać sum() do spłaszczania i łączenia iteracji, z wyjątkiem łańcuchów znaków w Pythonie.

Mamy nadzieję, że ten samouczek okazał się dla Ciebie pomocny. Zachęcamy do zapoznania się z kolejnymi materiałami, na przykład z tym o funkcji map() w Pythonie.