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}")

Частые ошибки

  1. Передача неитерируемого объекта:

    obj = 42
    iterator = iter(obj)  # Ошибка: TypeError
    

    Как исправить: Убедитесь, что объект поддерживает протокол итерируемости (например, является списком, строкой или генератором).

  2. Попытка продолжить итерацию после её завершения:

    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)
    
  3. Неправильное использование sentinel:

    obj = [1, 2, 3]
    iterator = iter(obj, 2)  # Ошибка: TypeError
    

    Как исправить: sentinel можно использовать только с вызываемыми объектами, например, функциями.

Часто задаваемые вопросы

  1. Что произойдет, если объект уже является итератором? Если переданный объект уже является итератором, iter() просто вернет его:

    iterator = iter([1, 2, 3])
    print(iter(iterator) is iterator)  # True
    
  2. Как работает 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)
    
  3. Что делает iter() с sentinel? Если передан sentinel, iter() создает итератор, который вызывает переданную функцию до тех пор, пока её результат не станет равен sentinel:

    from random import randint
    
    random_numbers = iter(lambda: randint(1, 10), 5)
    for num in random_numbers:
        print(num)