如何在函数中使用iter(v,w)?
我在研究iter()这个函数,在它的官方文档里说可以用iter(v,w)的方式,这样iter()会一直调用v,直到它返回值w为止,然后就停止了。
但是我试了半个小时,还是没能写出一个能返回多个结果的函数。
这是我的代码,我希望它能返回1,2,3,4,5:
def x():
for i in range(10):
return i
a = iter(x, 5)
a.next()
我知道当我返回i的时候,其实是退出了这个函数。
也许一个函数不可能多次返回结果。
那么我该怎么用一个函数才能让iter(x,5)正常工作呢?
3 个回答
你还可以使用生成器函数,这个函数通过 yield
关键字来生成值。举个例子:
def x():
for i in range(10):
yield i
在看到@Martjin Pieters的回答后,我明白了这个思路。
这是我写的代码,可以正确使用iter(v,w):
import random
def x():
return random.randrange(1,10)
a = iter(x,5)
while True:
print a.next()
在这段代码中,a.next()会从x()中获取值,直到x()返回5为止,然后就会停止。
iter()
每次调用函数的时候都会执行一次。你的函数在每次调用时返回相同的值(比如在 range(10)
列表中的第一个数字)。
你可以修改这个函数,使用一个全局变量来说明 iter()
如何在有两个参数的情况下工作:
i = 0
def f():
global i
i += 1
return i
for x in iter(f, 5):
print x
现在每次调用 f()
时,都会返回一个新的数字。你也可以使用默认参数,或者创建一个有状态的实例,并在这个实例上定义一个方法。只要函数在被调用多次时返回的东西不同,就可以满足 iter(a, b)
的用法。
通常情况下,带有两个参数的 iter()
是和一个方法一起使用的,这样每次调用时实例的状态都会改变。比如,文件对象上的 .readline()
方法:
for line in iter(fileobject.readline, ''):
这就像直接遍历 fileobject
可迭代对象一样工作,只是它不会使用内部的文件迭代缓冲区。有时候这可能是一个要求(更多信息请查看 file.next()
方法,了解文件迭代缓冲区)。
当然,你也可以传入一个 lambda
函数:
for chunk in iter(lambda: fileobject.read(2048), ''):
现在我们是以每次最多 2048 字节的块来读取文件对象,而不是逐行读取。