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łufunctools
- 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 funkcjisum()
z argumentem będącym łańcuchem znaków spowoduje zgłoszenie wyjątkuTypeError
(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.