next()
Pobiera następny element z iteratora. Po jego wyczerpaniu zwraca wartość domyślną albo zgłasza StopIteration.
- Zwraca
- Następny element iteratora albo
default.
Przykład
#students = [
{"name": "Kuba", "points": 80},
{"name": "Ania", "points": 250},
{"name": "Ola", "points": 310},
]
leader = next((s["name"] for s in students if s["points"] > 200), None)
print(leader)
nobody = next((s["name"] for s in students if s["points"] > 1000), None)
print(nobody)Definicja i zastosowanie
#Funkcja next(iterator) zwraca kolejny element iteratora i przesuwa go dalej. Działa na iteratorach i generatorach, ale nie bezpośrednio na liście czy napisie: z nich najpierw trzeba uzyskać iterator funkcją iter().
Gdy elementów zabraknie, next() zgłasza StopIteration. Jeśli podasz drugi argument, zostanie zwrócony zamiast wyjątku, więc zapis next(iterator, None) to bezpieczny sposób na pobranie elementu, którego może nie być.
Bardzo przydatne jest połączenie next() z wyrażeniem generatorowym albo z filter(): next((s for s in students if s["points"] > 200), None) zwraca pierwszy element spełniający warunek i kończy przeszukiwanie od razu po jego znalezieniu. Przed pętlą for wygodnie jest też pominąć przez next() pierwszy wiersz danych, np. nagłówek.
Składnia
#next(iterator)
next(iterator, default)Parametry
#iterator
iterator lub generator
Obiekt, z którego pobierasz element. Listę zamień wcześniej przeziter().default
opcjonalny
Wartość zwracana, gdy iterator jest wyczerpany. Bez niej zgłaszany jestStopIteration.
Więcej przykładów
#levels = iter([1, 2])
print(next(levels))
print(next(levels))
print(next(levels, "koniec"))
try:
next(levels)
except StopIteration:
print("StopIteration")lines = ["imie;punkty", "Ania;250", "Kuba;80"]
rows = iter(lines)
header = next(rows).split(";")
for line in rows:
print(dict(zip(header, line.split(";"))))def ticket_numbers(prefix):
number = 1
while True:
yield f"{prefix}-{number:03}"
number += 1
tickets = ticket_numbers("PY")
print(next(tickets))
print(next(tickets))
print(next(tickets))Dobre praktyki
#- Szukając pierwszego pasującego elementu, używaj
next(generator, None)zamiast budować całą listę i brać[0]. Przeszukiwanie kończy się na pierwszym trafieniu, a brak wyniku nie zgłaszaIndexError. - Gdy obok wyrażenia generatorowego podajesz drugi argument, otocz je nawiasami:
next((x for x in items), None). - Wywołanie
next()na liście zgłosiTypeError, bo lista nie jest iteratorem. Najpierw użyjiter().
Powiązane hasła
#- iter()Zwraca iterator dla kolekcji, czyli obiekt podający jej elementy po jednym. Na tym mechanizmie opiera się pętla for.
- yieldTworzy generator: funkcję zwracającą kolejne wartości na żądanie.
- forPętla przechodząca po kolejnych elementach sekwencji lub innego obiektu iterowalnego.
- filter()Zwraca iterator elementów, dla których funkcja zwraca prawdę.
- csvOdczyt i zapis plików CSV, czyli tabel zapisanych jako tekst, w których wartości oddziela przecinek lub średnik.
Widzisz błąd albo brakuje przykładu? Napisz do nas.