Разумевање Питхон-ове функције сума [With Examples]

Otkrijte sve o funkciji sum() u Pythonu: od sintakse do primene sa različitim iterabilnim objektima – uz korisne primere koda.

Kada radite sa Python iterabilnim objektima, kao što je lista brojeva, uobičajena operacija je pronalaženje zbira svih elemenata unutar liste. Slične operacije se pojavljuju i pri radu sa drugim iterabilnim objektima poput tuple-ova i skupova.

Ovo se može postići na više načina, ali preporučeni, „pythonic“ pristup je korišćenje ugrađene funkcije sum().

U nastavku ćemo razmotriti neke druge pristupe, poput upotrebe petlje i definisanja sopstvene funkcije. Potom ćemo detaljno proučiti sintaksu Python funkcije sum() i predstaviti primere koda za bolje razumevanje njenog delovanja.

Sabiranje vrednosti u Python iterabilnim objektima

📋 Možete paralelno pratiti kod u Python REPL-u. Ili možete koristiti online Python editor.

Razmotrimo sledeću listu brojeva:

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

Naš cilj je da izračunamo zbir svih brojeva u listi. Uskoro ćemo preći na Python funkciju sum(), ali prvo ćemo pogledati neke druge metode koje možemo primeniti. To uključuje:

  • Upotrebu jednostavne for petlje
  • Korišćenje funkcije reduce() iz modula functools
  • Definisanje prilagođene funkcije

Upotreba petlji

Da bismo izračunali zbir svih elemenata u listi, možemo koristiti for petlju na sledeći način:

  • Inicijalizujemo promenljivu total na nulu.
  • Prolazimo kroz listu brojeva i pristupamo svakom broju pojedinačno.
  • Dodajemo trenutni broj promenljivoj total.
>>> nums = [2,8,5,3,11,7,9]
>>> total = 0
>>> for num in nums:
...     total += num
...
>>> total
45

Upotreba funkcije Reduce

Drugi pristup sabiranju elemenata iterabilnog objekta je korišćenje funkcije reduce(). Funkcija reduce(), ugrađena u Pythonov modul functools, prihvata funkciju i iterabilni objekat. Ona redukuje iterabilni objekat uzastopnom primenom funkcije na njegove elemente.

Ovde koristimo lambda funkciju da definišemo sabiranje dva broja i prosleđujemo listu brojeva kao iterabilni objekat.

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

Funkcija reduce() radi tako što sukcesivno sabira dva broja – s leva na desno – dok se ne redukuje na jedinstvenu vrednost zbira:

Upotreba prilagođene funkcije

Takođe možemo definisati sopstvenu funkciju za ovaj zadatak. Ovde definišemo funkciju sum_list koja:

  • Prihvata listu brojeva kao argument i
  • Vraća zbir elemenata unutar te liste.

Telo funkcije koristi konstrukciju petlje koju smo već razmatrali. Međutim, definisanjem funkcije dobijamo mogućnost njene ponovne upotrebe.

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

Pozivanje funkcije sum_list() sa listom brojeva kao argumentom vraća zbir 45:

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

Sada, hajde da naučimo o ugrađenoj funkciji sum(). Ona nije samo koncizna, već i robusna jer efikasno radi sa različitim iterabilnim objektima i tipovima podataka.

Sintaksa funkcije Python sum()

Sintaksa korišćenja funkcije sum() je sledeća:

sum(iterable, start)

Gde je:

  • iterable obavezan argument. Može biti bilo koji iterabilni objekat za koji je važeća operacija sabiranja, poput liste ili skupa brojeva. Pozivanje funkcije sum() sa Python stringovima generiše TypeError izuzetak (više o tome kasnije).
  • start opcionalni argument. To je često numerička vrednost koja se dodaje izračunatom zbiru. Ovo može biti korisno kada trebate da dodate konstantnu vrednost rezultatu.

Sada kada smo naučili sintaksu Python funkcije sum(), iskoristimo je za sabiranje različitih iterabilnih objekata.

Sabiranje iterabilnih objekata funkcijom sum()

#1. Lista

Hajde da izračunamo zbir brojeva u listi koristeći funkciju sum():

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

Upotreba opcionalne početne vrednosti

Da bismo dodali konstantnu vrednost zbiru, možemo koristiti funkciju sum() sa opcionalnom početnom vrednošću. Ovde prosleđujemo početnu vrednost 100 kao pozicioni argument:

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

Početna vrednost se takođe može navesti kao argument ključne reči:

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

#2. Tuple

Funkcija sum() radi i sa tuple-ovima. Kreiramo tuple nums_tuple tako što pretvaramo listu nums u tuple:

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

#3. Skup

Takođe možemo koristiti funkciju sum() sa skupom brojeva:

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

Ovde konvertujemo nums listu u Python skup i izračunavamo zbir elemenata u nums_set.

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

#4. Rečnik

Razmotrimo sledeći rečnik students_dict sa numeričkim ključevima. Obratite pažnju na to šta se dešava kada pozovete funkciju sum() sa ovim rečnikom kao argumentom.

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

Po default-u, funkcija sum() vraća zbir ključeva.

Sabiranje ključeva

Znamo da je podrazumevano ponašanje sabiranje ključeva rečnika.

Međutim, ovo možete učiniti eksplicitnijim korišćenjem metode keys() rečnika za pristup ključevima. Zatim prosledite listu ključeva funkciji sum():

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

Sabiranje vrednosti

Ako umesto toga želite da saberete vrednosti rečnika, pristupite vrednostima pozivanjem metode values() na objektu rečnika:

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

Korišćenje Pythonove funkcije sum() sa drugim numeričkim tipovima podataka

Do sada smo videli kako koristiti funkciju sum() sa iterabilnim objektima celih brojeva. Pogledajmo sada nekoliko primera sa drugim numeričkim tipovima podataka.

Kompleksni brojevi

Funkcija sum() se takođe može koristiti za sabiranje kompleksnih brojeva. U ovom primeru, nums_c je lista kompleksnih brojeva:

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

Brojevi sa pokretnim zarezom

Ovde koristimo funkciju sum() da saberemo listu brojeva sa pokretnim zarezom nums_f:

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

📑 Za poboljšanu preciznost u rezultatu sabiranja brojeva sa pokretnim zarezom, možete koristiti funkciju fsum() iz matematičkog modula da biste sumirali iterabilne objekte sa vrednostima u pokretnom zarezu.

Ravnanje iterabilnih objekata funkcijom sum()

Sada da vidimo kako se funkcija sum() može koristiti za ravnanje i spajanje iterabilnih objekata.

Ravnjanje liste

Pretpostavimo da imamo ugnježdenu listu:

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

Kada pozovemo funkciju sum() tako što prosledimo ovu ugnježdenu listu kao argument zajedno sa praznom listom kao početnom vrednošću:

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

Vidimo da je ugnježdena lista sada spljoštena u jednu listu brojeva.

Ekivalentno, kada pomislimo da je lista oblika l3 = [l1,l2] funkcija sum() spaja dve liste l1 i l2 ugnježđene unutar liste l3.

📝 Kao brzu vežbu, pokušajte da koristite funkciju sum() na drugim ugnježdenim iterabilnim objektima.

Uobičajena zamka: Nemojte koristiti Pythonovu funkciju sum() sa stringovima

Pošto smo videli da se funkcija sum() može koristiti za ravnanje i spajanje lista (i drugih iterabilnih objekata kao što su tuple-ovi), primamljivo je pomisliti da je možemo koristiti i za spajanje stringova.

Ali ako pokušate to da uradite, naići ćete na 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]

Dakle, funkcija sum() se ne može koristiti za sabiranje (ili spajanje) stringova.

Međutim, kao što se vidi u gornjoj poruci o grešci, možete koristiti metodu join() da povežete listu stringova u jedan string.

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

Zaključak

U ovom vodiču smo naučili kako da koristimo ugrađenu funkciju sum() da pronađemo zbir svih elemenata u iterabilnom objektu. Opšta sintaksa za korišćenje funkcije sum() je: sum(iterable, start), gde je iterable obavezan argument, a start je opcioni argument.

Zatim smo predstavili nekoliko primera koda da bismo razumeli upotrebu funkcije sum() sa iterabilnim objektima kao što su liste, tuple-ovi, skupovi i rečnici. Kasnije smo pogledali kako se funkcija sum() može koristiti za ravnanje i spajanje iterabilnih objekata – sa izuzetkom Python stringova.

Nadam se da vam je ovaj vodič bio koristan. Sledeće, možda ćete želeti da pogledate ovaj vodič o Pythonovoj funkciji map().