python for循环中的函数会被执行多次吗?

时间:2011-12-03 16:20:21

标签: python

假设我有一个返回列表的方法的以下类:

Class C():
  def f():
    return [1,2,3]

如果我按如下方式遍历此方法:

c=C()
for i in c.f():
  print i

在for循环中,c.f()会多次执行吗?如果是的话,为了得到它一次,我是否必须在循环之外做任务,或者有一些微不足道的方法?

6 个答案:

答案 0 :(得分:4)

In [395]: def tester():
     ...:     print "Tester Called!"
     ...:     return [1,2,3]

In [396]: for i in tester():
     ...:     pass
Tester Called!

似乎答案是否定的。

答案 1 :(得分:3)

c.f()不会多次执行。

你没有问,但你可能对generators感到好奇。

您作为生成器的示例如下:

Class C():
  def f():
    yield 1
    yield 2
    yield 3

迭代结果的循环将保持不变。

答案 2 :(得分:3)

来自python docs

  

for语句用于迭代序列的元素   (例如字符串,元组或列表)或其他可迭代对象:

for_stmt ::=  "for" target_list "in" expression_list ":" suite
             ["else" ":" suite] 
     

表达式列表评估一次;它应该产生一个可迭代的对象。

答案 3 :(得分:1)

不是执行一次

并且您的方法未正确定义。应该有一个self参数:

class C:
  def f(self):
    return [1,2,3]

答案 4 :(得分:1)

它只会被执行一次。但是代码中会出现语法错误:

class,而不是班级 def f(self),而不是def f()

答案 5 :(得分:1)

你自己尝试过测试吗?你的问题的答案是否定的。

以下是您应该如何测试它。此外,您的代码中存在许多缺陷。检查下面的自评注修改版本

>>> class C: #its class not Class and C not C()
    def f(self): #You were missing the self argument
        print "in f" #Simple Test to validate your query
        return [1,2,3]


>>> c=C()
>>> for i in c.f():
    print i


in f
1
2
3
>>> 

虽然这个例子很简单,但我仍然会以此为例来解释我们如何利用Python functional programming的强大功能。我将尝试解释的是lazy evaluation或生成器函数(http://docs.python.org/glossary.html#term-generator)。

考虑修改后的例子

>>> class C: #its class not Class and C not C()
    def f(self): #You were missing the self argument
        print "in f" #Simple Test to validate your query
        for i in [1,2,3]:
            yield i #Generates the next value when ever it is requsted
        return #Exits the Generator


>>> c=C()
>>> for i in c.f():
    print i


in f
1
2
3
>>> 

你能发现差异吗?