Синтакса, примери и случајеви употребе

Kada radite sa Python iterabilnim objektima, često je potrebno utvrditi koliko stavki oni sadrže. U ovom tekstu, istražićemo kako koristiti ugrađenu Python funkciju za određivanje dužine iterabilnog objekta, i još mnogo toga.

Python nudi razne ugrađene strukture podataka, kao i metode za rad sa njima. Pored toga, postoje ugrađene funkcije koje olakšavaju manipulaciju tim strukturama. Jedna od takvih funkcija je len(), koja nam daje broj elemenata u datom iterabilnom objektu.

U ovom vodiču ćemo naučiti kako koristiti funkciju len() sa listama, tuple-ima, stringovima i drugim strukturama podataka. Takođe ćemo razmotriti nekoliko praktičnih primera njene primene.

Krenimo! 👩‍🏫

Sintaksa funkcije len() u Pythonu

Sintaksa za korišćenje Python funkcije len() je sledeća:

len(iterable)

Kao što vidite, funkcija len() prima jedan parametar, a to je bilo koji važeći iterabilni objekat. Najčešće su to liste, tuple-i ili stringovi, ali može biti i bilo koji drugi važeći tip.

Sintaksa je, kao što vidite, vrlo jednostavna. Hajde da sada pređemo na neke praktične primere.

📑 Za potrebe kodiranja primera u ovom vodiču, možete koristiti Python REPL (interaktivno okruženje).

Korišćenje funkcije len() sa iterabilnim objektima

Sa sekvencama

Funkciju len() možemo koristiti da saznamo dužinu sekvenci, kao što su liste, tuple-i i stringovi.

Evo nekoliko primera:

>>> nums = [9,3,6,1,2]
>>> len(nums)
5

>>> nums_tup = (9,3,6,1,2)
>>> len(nums_tup)
5

Kod ovih struktura podataka koje čuvaju sekvence, obično se elementima pristupa preko njihovog indeksa ili se izdvaja podsekvenca.

Sa ostalim kolekcijama

Funkciju len() možemo koristiti i sa drugim Python kolekcijama, kao što su skupovi (setovi) i rečnici.

Ove strukture podataka predstavljaju neuređene kolekcije. Iako redosled elemenata možda nije bitan, korisno je znati ukupan broj stavki u kolekciji.

>>> nums_set = set(nums)
>>> len(nums_set)
5

>>> prices = {'Notebook':5,'Pencil case':7,'Bookmarks':3,'Pens':1,'Markers':8}
>>> len(prices)
5

Uobičajene primene funkcije len() u Pythonu

Do sada smo videli jednostavne primere korišćenja funkcije len() za dobijanje broja stavki u iterabilnom objektu. Sada ćemo pogledati gde se to može koristiti u praksi.

#1. Iteracija pomoću for petlji

Python for petlja omogućava prolazak kroz iterabilne objekte, pri čemu se u svakom koraku petlje pristupa samoj stavki. Ali ako želimo da pristupimo indeksu svake stavke, ili i indeksu i samoj stavci zajedno, možemo koristiti funkciju range(), kao što je prikazano:

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

Pošto range(N) daje niz celih brojeva 0, 1, 2, …, N – 1, korišćenjem range(len(nums)) dobijamo skup validnih indeksa kroz koje možemo proći.

# Output
Index 0: 9
Index 1: 2
Index 2: 4
Index 3: 7
Index 4: 8

Međutim, preporučeni Pythonovski način za pristup i indeksu i elementu je korišćenje funkcije enumerate:

>>> nums = [9,2,4,7,8]
>>> for idx,num in enumerate(nums):
...     print(f"Index {idx}: {num}")
# Output
Index 0: 9
Index 1: 2
Index 2: 4
Index 3: 7
Index 4: 8

#2. Uslovno ponavljanje pomoću while petlji

Pretpostavimo da imamo listu brojeva. Metod pop() uklanja poslednji element iz liste i vraća ga.

Sve dok je dužina liste brojeva (len(nums)) veća od nule – to jest, dok postoji bar jedan element koji se može ukloniti – petlja će se izvršavati.

>>> nums = [9,2,4,7,8]
>>> while len(nums) > 0:
...     nums.pop()
# Output
8
7
4
2
9

Gornji primer je eksplicitniji način pisanja sledećeg:

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

while nums: je ekvivalentno uslovu „dok lista brojeva nije prazna“.

#3. Provera i validacija dužine iterabilnog objekta

Još jedna česta primena funkcije len je provera i validacija dužine određenih iterabilnih objekata.

Ovde proveravamo da li je korisničko ime validan string, na osnovu njegove dužine (izračunate pomoću funkcije len()):

>>> username = "another-random-user"
>>> if len(username) > 10:
...     print("Korisničko ime je predugačko; trebalo bi da ima najviše 10 karaktera.")
... elif len(username) < 5:
...     print("Korisničko ime je prekratko; trebalo bi da ima najmanje 5 karaktera.")
... else:
...     print("Validno korisničko ime!")
Korisničko ime je predugačko; trebalo bi da ima najviše 10 karaktera.

#4. Liste i rečnički izrazi

Izrazi u Pythonu omogućavaju sažetu sintaksu za kreiranje novih iterabilnih objekata od postojećih. U izrazima možemo koristiti ugrađene funkcije.

List Comprehensions

U ovom izrazu za generisanje liste, koristimo funkciju len() da dobijemo dužinu svakog stringa sa liste jezika.

>>> languages = ['Python','C','Rust','JavaScript']
>>> len_langs = [len(lang) for lang in languages]
>>> len_langs
[6, 1, 4, 10]

Dictionary Comprehensions

U ovom izrazu za generisanje rečnika, koristimo listu jezika i funkciju len() kako bismo kreirali rečnik:

>>> languages = ['Python','C','Rust','JavaScript']
>>> lang_len = {lang:len(lang) for lang in languages}
>>> lang_len
{'Python': 6, 'C': 1, 'Rust': 4, 'JavaScript': 10}

Ovde su ključevi i vrednosti nizovi jezika i njihove dužine, redom.

#5. Ključni parametar u prilagođenom sortiranju

Python ima ugrađeni metod sort() za sortiranje Python lista na licu mesta i funkciju sorted() za sortiranje listi i drugih iterabilnih objekata.

U oba slučaja, možemo koristiti ključni parametar da bismo prilagodili sortiranje.

Ovde sortiramo listu jezika na osnovu dužine stringa.

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

U sledećem isječku, koristimo funkciju sorted() da bismo dobili sortiranu listu.

>>> languages = ['Hindi','English','German','French']
>>> sorted(languages,key=len)
['Hindi', 'German', 'French', 'English']

U ovom primeru, i „German“ i „French“ imaju po 6 karaktera. Pošto funkcija sorted() obavlja stabilno sortiranje, redosled u originalnoj listi je sačuvan.

#6. Dužina NumPy nizova

Funkciju len() možemo koristiti i sa drugim strukturama podataka, kao što su NumPy nizovi.

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

U ovom slučaju, np_array je vektor sa 4 elementa. Prema tome, len(np_array) vraća 4, što je broj elemenata u nizu.

Matrica je dvodimenzionalni niz.

Pogledajmo sledeći primer. len(np_array) je 2, što je broj redova.

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

Da bismo razumeli, vratimo se na matricu. Imamo strukturu ugnježdenih lista gde spoljašnja lista sadrži dve ugnježđene liste. Funkcija len() vraća broj stavki u kontejneru (ovde su to dve liste):

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

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

Međutim, kada počnete da radite sa višedimenzionalnim nizovima, preporučuje se korišćenje atributa shape umesto len().

>>> np_array.shape
(2, 3)

Uobičajene zamke koje treba izbegavati pri korišćenju Python funkcije len().

Da bismo zaključili ovu diskusiju, osvrnućemo se na neke od uobičajenih zamki koje treba izbegavati kada koristimo funkciju len() u Pythonu.

Korišćenje len() sa neiterabilnim tipovima podataka

Znamo da funkcija len prihvata samo važeće iterabilne objekte kao argument. To znači da ako pozovemo funkciju len sa nevažećim tipom podataka – onim koji nije iterabilan – dobićemo grešku.

Takvi nevažeći tipovi podataka uključuju osnovne tipove podataka kao što su celi brojevi, brojevi sa pokretnim zarezom i boolean vrednosti:

>>> 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()

U Pythonu, generatori su memorijski efikasni izbori za primene koje zahtevaju generisanje sekvence. Objekat generatora vraća elemente niza – na zahtev – jedan po jedan. Ali objekti generatora nemaju dužinu.

Dakle, dobićete grešku ako pokušate da izračunate dužinu objekta generatora:

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

Korišćenje len() sa tuple-ima dužine jedan

Ako samo umetnete element u tuple, Python ga tumači kao jedan element, a ne kao tuple.

Evo primera:

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

Dakle, kada imate tuple sa samo jednim elementom, inicijalizujte ga u ovom obliku: tuple_name = (elt, ) kako bi se tumačio kao tuple:

>>> nums = (1,)
>>> len(nums)
1

Rezime

Evo kratkog pregleda onoga što smo obradili u ovom vodiču:

  • Broj stavki u bilo kom iterabilnom objektu možete saznati pomoću funkcije len() u Pythonu. Sintaksa za korišćenje funkcije dužine je: len(bilo_koji_važeći_iterabilni_objekat).
  • Ovo uključuje sekvence kao što su liste, tuple-i i stringovi, kao i druge kolekcije, poput rečnika i skupova.
  • Funkcija len() se često koristi u petljama i izrazima.
  • Takođe možete koristiti funkciju len() kao ključni parametar kada treba da prilagodite sortiranje prema dužini, na primer: sortiranje liste stringova na osnovu njihove dužine.

Zatim naučite kako koristiti Python-ovu funkciju sum().