如何在函数中使用iter(v,w)?

2 投票
3 回答
534 浏览
提问于 2025-04-18 01:18

我在研究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 个回答

0

你还可以使用生成器函数,这个函数通过 yield 关键字来生成值。举个例子:

def x():
    for i in range(10):
        yield i
1

在看到@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为止,然后就会停止。

6

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 字节的块来读取文件对象,而不是逐行读取。

撰写回答