【问题标题】:How to use iter(v,w) with a function?如何将 iter(v,w) 与函数一起使用?
【发布时间】:2014-04-04 06:49:48
【问题描述】:

我正在研究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) 正常工作?

【问题讨论】:

    标签: python iterator


    【解决方案1】:

    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() method)。

    当然你也可以传入lambda 函数:

    for chunk in iter(lambda: fileobject.read(2048), ''):
    

    现在我们正在读取的文件对象是最多 2048 字节的块,而不是逐行读取。

    【讨论】:

    • 我不知道iter() 的两个参数形式是这样工作的。 (+1)
    • 我想知道用可调用的 object 而不是函数来展示一个示例是否具有指导意义,这可能表明它可能是避免全局状态的好方法。
    • @NPE:我试图提供尽可能最短和最简单的示例。不过,一般用例是将其与实例一起使用,如后半部分所述。我想我会让它站起来。
    • 很公平。 :) 在不相关的注释中,我不确定您所说的 它不会使用内部文件迭代缓冲区 是什么意思。不过可能只有我……
    【解决方案2】:

    在@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() 将返回 a 从 x() 中获取的值,直到 x() 返回 5,然后才会停止。

    【讨论】:

      【解决方案3】:

      您还可以通过 yield 关键字使用生成器函数。示例:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-30
        • 2018-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        相关资源
        最近更新 更多