iter
Функция iter() возвращает итератор для переданного объекта. Итератор позволяет поочередно перебирать элементы объекта, например, списка, строки или другого итерируемого объекта.
Синтаксис
iter(object[, sentinel])
Аргументы
- object:
- Что означает: Итерируемый объект, из которого нужно получить итератор.
- Возможные значения: Любой объект, поддерживающий протокол итерируемости (имеющий метод __iter__ или __getitem__).
- sentinel (необязательный):
- Что означает: Специальное значение, которое завершает итерацию.
- Возможные значения: Любое значение. Используется только при передаче вызываемого объекта в качестве первого аргумента.
Возвращаемое значение
Итератор, который можно использовать для последовательного доступа к элементам объекта. Если указан sentinel, итерация будет завершаться при достижении этого значения.
Примеры использования
# Создание итератора из списка
numbers = [1, 2, 3]
numbers_iter = iter(numbers)
print(next(numbers_iter)) # 1
print(next(numbers_iter)) # 2
print(next(numbers_iter)) # 3
# Итерация строки
string_iter = iter("abc")
print(next(string_iter)) # 'a'
print(next(string_iter)) # 'b'
print(next(string_iter)) # 'c'
# Использование iter() с sentinel
def read_line():
return input("Введите строку: ")
sentinel_iter = iter(read_line, "stop")
for line in sentinel_iter:
print(f"Вы ввели: {line}")
Частые ошибки
Передача неитерируемого объекта:
obj = 42 iterator = iter(obj) # Ошибка: TypeError
Как исправить: Убедитесь, что объект поддерживает протокол итерируемости (например, является списком, строкой или генератором).
Попытка продолжить итерацию после её завершения:
numbers = [1, 2] it = iter(numbers) print(next(it)) # 1 print(next(it)) # 2 print(next(it)) # Ошибка: StopIteration
Как исправить: Используйте цикл for, чтобы автоматически обрабатывать исключение StopIteration:
for num in numbers: print(num)
Неправильное использование sentinel:
obj = [1, 2, 3] iterator = iter(obj, 2) # Ошибка: TypeError
Как исправить: sentinel можно использовать только с вызываемыми объектами, например, функциями.
Часто задаваемые вопросы
Что произойдет, если объект уже является итератором? Если переданный объект уже является итератором, iter() просто вернет его:
iterator = iter([1, 2, 3]) print(iter(iterator) is iterator) # True
Как работает iter() с пользовательскими объектами? Пользовательский объект должен реализовывать метод __iter__ или __getitem__:
class CustomIterable: def __init__(self, data): self.data = data def __iter__(self): return iter(self.data) obj = CustomIterable([1, 2, 3]) for item in obj: print(item)
Что делает iter() с sentinel? Если передан sentinel, iter() создает итератор, который вызывает переданную функцию до тех пор, пока её результат не станет равен sentinel:
from random import randint random_numbers = iter(lambda: randint(1, 10), 5) for num in random_numbers: print(num)