【问题标题】:python: does `for i in obj.func()` re-run `func` every iteration?python:`for i in obj.func()` 每次迭代都会重新运行 func 吗?
【发布时间】:2011-04-11 10:51:07
【问题描述】:

假设我有以下代码:

for a in object.a_really_huge_function():
    print a

为了防止a_really_huge_function运行多次,其他语言我习惯这样做:

a_list = object.a_really_huge_function()
for a in a_list:
    print a

这在 Python 中有必要吗? in 之后的部分会在每个循环上运行吗?

【问题讨论】:

    标签: python optimization loops for-loop


    【解决方案1】:

    没必要。

    for a in object.a_really_huge_function():
    

    只调用一次a_really_huge_function

    将结果保存在变量中的唯一好处是,如果您在代码的其他地方调用相同的函数。

    如果函数返回一个列表,您可以通过让object.a_really_huge_function() 返回一个iterator 来在内存使用方面做得更好,否则就可以了。

    【讨论】:

      【解决方案2】:

      python 解释器是你的朋友。

      >>> def some_func():
      ...     print 'in some_func'
      ...     return [1, 2, 3, 10]
      ... 
      >>> for a in some_func():
      ...     print a
      ... 
      in some_func
      1
      2
      3
      10
      

      简而言之,不,它会被调用一次。

      【讨论】:

        【解决方案3】:

        您还可以使用生成器通过在算法的每个步骤之后放弃控制来避免返回巨大的结果,如下所示:

        def a_really_huge_fuction(huge_number):
            i = 0
            while i < huge_number:
                yield i   # Relinquishes control to caller, resume execution at next line
                i = i + 1
        

        在这种情况下,该函数被调用一次,但其执行分布在huge_number 不同的时间。有关详细信息,请参阅yield 文档。

        【讨论】:

        • 问题是a_really_huge_fuction 是否被多次调用。这个答案没有解决这个问题,那么为什么要投票呢?
        • 我已经澄清了而不是回答。在生成器的情况下,一旦分阶段执行 bu,就会调用该函数。
        猜你喜欢
        • 1970-01-01
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 2017-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多