在 Python 中,iter()函数有两个核心用途,一是从可迭代对象中获取迭代器,二是基于可调用对象动态生成迭代器。

函数语法

iter(iterable)
iter(callable, sentinel)

iter()有两种用法,如果只有一个参数,则:

  • iterable:一个可迭代的对象;

返回这个可迭代对象的迭代器。

如果一个对象是可迭代的,那么它就实现了__iter__()方法,这个方法返回一个迭代器。迭代器则通过__next__()方法逐个返回元素,并在耗尽时抛出StopIteration异常。

如果存在两个参数,则:

  • callable:一个函数或可调用对象;
  • sentinel:当可调用对象返回此值时停止迭代;

存在两个参数时,iter()会创建一个新的迭代器,当迭代器调用__next__()方法时调用callable(),并判断callable()的返回值是否为sentinel,是则触发StopIteration,不是则返回这个值。

iter() 函数示例

这个示例展示迭代器的工作原理:

class MyRange:
    def __init__(self, start, stop):
        self.current = start
        self.stop = stop

    def __iter__(self):
        return self
    
    def __next__(self):

        if self.current >= self.stop:
            raise StopIteration

        value = self.current
        self.current += 1

        return value

# 使用 for 来迭代
for num in MyRange(1, 5):
    print(num)

iter()函数的简单用法:

# 定义一个列表
my_list = [1, 2, 3]

# 获取 my_list 的迭代器
# 实际调用了 my_list.__iter__()
my_iterator = iter(my_list)

# 依次获取迭代器中的下一个值
# 实际调用了 my_iterator.__next__()
print(next(my_iterator))  # 输出:1
print(next(my_iterator))  # 输出:2
print(next(my_iterator))  # 输出:3

# 再次获取下一个值会抛出 StopIteration 异常
print(next(my_iterator))  # 抛出 StopIteration 异常

for循环内部实际上使用了iter()

lst = [1, 2, 3]

for item in lst:
    print(item)

# 等价于
lst_iter = iter(lst)
while True:
    try:
        item = next(lst_iter)
        print(item)
    except StopIteration:
        break

使用iter(callable, sentinel)这种形式:

import random

# 返回一个 0 ~ 100 的随机数
def get_number():
    return random.randint(0,100)

# 创建一个迭代器
# 每次迭代的值由 get_number 生成
# 生成的值为 0 时停止迭代
num_iter = iter(get_number, 0)

for num in num_iter:
    print(num)