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.
Na tej stronie

Przykład

#
Python
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)
Wynikzapisany wynik, możesz go sprawdzić
Ania
None

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

#
Składnia
next(iterator)
next(iterator, default)

Parametry

#
  • iterator

    iterator lub generator

    Obiekt, z którego pobierasz element. Listę zamień wcześniej przez iter().
  • default

    opcjonalny

    Wartość zwracana, gdy iterator jest wyczerpany. Bez niej zgłaszany jest StopIteration.

Więcej przykładów

#
Ręczne pobieranie i StopIteration
Python
levels = iter([1, 2])

print(next(levels))
print(next(levels))
print(next(levels, "koniec"))

try:
    next(levels)
except StopIteration:
    print("StopIteration")
Wynikzapisany wynik, możesz go sprawdzić
1
2
koniec
StopIteration
Pominięcie wiersza nagłówka
Python
lines = ["imie;punkty", "Ania;250", "Kuba;80"]
rows = iter(lines)

header = next(rows).split(";")
for line in rows:
    print(dict(zip(header, line.split(";"))))
Wynikzapisany wynik, możesz go sprawdzić
{'imie': 'Ania', 'punkty': '250'}
{'imie': 'Kuba', 'punkty': '80'}
Kolejne wartości z generatora
Python
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))
Wynikzapisany wynik, możesz go sprawdzić
PY-001
PY-002
PY-003

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łasza IndexError.
  • 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łosi TypeError, bo lista nie jest iteratorem. Najpierw użyj iter().

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.