在 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)