iter()

Zwraca iterator dla kolekcji, czyli obiekt podający jej elementy po jednym. Na tym mechanizmie opiera się pętla for.

Zwraca
Iterator.
Na tej stronie

Przykład

#
Python
lessons = ["Zmienne", "Pętle", "Funkcje"]
it = iter(lessons)

print(next(it))
print(next(it))
print(list(it))
print(list(it))
Wynikzapisany wynik, możesz go sprawdzić
Zmienne
Pętle
['Funkcje']
[]

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

#
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. Gdy callable go zwróci, iterator się kończy, a sam wartownik nie jest zwracany.

Więcej przykładów

#
Tak działa pętla for
Python
scores = [72, 95, 64]
it = iter(scores)

while True:
    try:
        score = next(it)
    except StopIteration:
        break
    print(score)

print(iter(it) is it)
Wynikzapisany wynik, możesz go sprawdzić
72
95
64
True

Pętla while wykonuje krok po kroku to samo, co krótki zapis for score in scores:.

Czytanie kawałkami z wartownikiem
Python
import io

stream = io.StringIO("1_1;1_2;1_3;1_4")
for chunk in iter(lambda: stream.read(4), ""):
    print(chunk)
Wynikzapisany wynik, możesz go sprawdzić
1_1;
1_2;
1_3;
1_4

io.StringIO udaje tu plik. Z plikiem otwartym przez open() zapis wygląda tak samo, a pusty napis oznacza koniec danych.

Własna klasa w pętli for
Python
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))
Wynikzapisany wynik, możesz go sprawdzić
1. Zmienne
2. Pętle
['1. Zmienne', '2. Pętle']

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ą for nie musisz wywoływać iter(). Przydaje się dopiero wtedy, gdy chcesz pobierać elementy ręcznie przez next(), 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

#

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