iter()
Zwraca iterator dla kolekcji, czyli obiekt podający jej elementy po jednym. Na tym mechanizmie opiera się pętla for.
- Zwraca
- Iterator.
Przykład
#lessons = ["Zmienne", "Pętle", "Funkcje"]
it = iter(lessons)
print(next(it))
print(next(it))
print(list(it))
print(list(it))Definicja i zastosowanie
#Funkcja iter(kolekcja) zwraca iterator: obiekt, który pamięta, dokąd doszło przechodzenie, i na żądanie podaje kolejny element. Kolejne elementy pobiera się funkcją next(), a gdy ich zabraknie, iterator zgłasza wyjątek StopIteration.
Pętla for robi to samo automatycznie: najpierw wywołuje iter() na kolekcji, a potem next() aż do StopIteration. Obiekt, z którego da się uzyskać iterator (lista, napis, słownik, plik, range), nazywa się obiektem iterowalnym. Sam iterator jest jednorazowy: raz wyczerpany zostaje pusty, a iter() wywołane na nim zwraca ten sam obiekt.
Druga forma, iter(funkcja, wartownik), wywołuje funkcję bez argumentów tak długo, aż zwróci ona wartość równą wartownikowi. Przydaje się przy czytaniu danych kawałkami, np. z pliku. Własna klasa stanie się iterowalna, gdy zdefiniujesz w niej metodę __iter__, najprościej jako generator z yield.
Składnia
#iter(iterable)
iter(callable, sentinel)Parametry
#iterable
obiekt iterowalny
Kolekcja albo inny obiekt, po którym da się przejść pętląfor.callable
funkcja bez argumentów
W drugiej formie: funkcja wywoływana przy każdym pobraniu elementu.sentinel
dowolna wartość
Wartownik. Gdycallablego zwróci, iterator się kończy, a sam wartownik nie jest zwracany.
Więcej przykładów
#scores = [72, 95, 64]
it = iter(scores)
while True:
try:
score = next(it)
except StopIteration:
break
print(score)
print(iter(it) is it)Pętla while wykonuje krok po kroku to samo, co krótki zapis for score in scores:.
import io
stream = io.StringIO("1_1;1_2;1_3;1_4")
for chunk in iter(lambda: stream.read(4), ""):
print(chunk)io.StringIO udaje tu plik. Z plikiem otwartym przez open() zapis wygląda tak samo, a pusty napis oznacza koniec danych.
class Course:
def __init__(self, title, lessons):
self.title = title
self.lessons = lessons
def __iter__(self):
for number, lesson in enumerate(self.lessons, start=1):
yield f"{number}. {lesson}"
python = Course("Python", ["Zmienne", "Pętle"])
for line in python:
print(line)
print(list(python))Dobre praktyki
#- Iterator można przejść tylko raz. Jeśli potrzebujesz danych kilka razy, zapisz je w liście albo utwórz nowy iterator.
- Przed pętlą
fornie musisz wywoływaćiter(). Przydaje się dopiero wtedy, gdy chcesz pobierać elementy ręcznie przeznext(), np. żeby pominąć nagłówek. - Metoda
__iter__napisana jako generator zwraca przy każdym wywołaniu nowy iterator, więc po takim obiekcie można przejść pętlą wiele razy.
Powiązane hasła
#- next()Pobiera następny element z iteratora. Po jego wyczerpaniu zwraca wartość domyślną albo zgłasza StopIteration.
- forPętla przechodząca po kolejnych elementach sekwencji lub innego obiektu iterowalnego.
- yieldTworzy generator: funkcję zwracającą kolejne wartości na żądanie.
- itertoolsNarzędzia do pracy z iteratorami: łączenie, grupowanie, kombinacje i nieskończone ciągi.
- enumerate()Dodaje licznik do elementów podczas przechodzenia pętlą.
Widzisz błąd albo brakuje przykładu? Napisz do nas.