当使用两个参数调用时,iter 接受一个可调用值和一个标记值。它的行为就像是这样实现的:
def iter2args(f, sentinel):
value = f()
while value != sentinel:
yield value
value = f()
作为f 传入的内容必须是可调用的,这意味着您可以像调用函数一样调用它。内置的 list 是一个 type 对象,您可以通过像函数一样调用它来创建新的列表实例:
>>> list('abcde')
['a', 'b', 'c', 'd', 'e']
你传入的列表l是一个已有的列表实例,不能像函数一样使用:
>>> l = [1,2,3,4,5,6]
>>> l(3)
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
l(3)
TypeError: 'list' object is not callable
因此,list 类型对象和列表实例之间存在巨大而重要的区别,当与 iter 一起使用时会显示出来。
要遍历列表直到到达哨兵,您可以使用itertools.takewhile:
import itertools
for val in itertools.takewhile(l, lambda x: x!= 4):
print(val)