假设我有一个返回列表的方法的以下类:
Class C():
def f():
return [1,2,3]
如果我按如下方式遍历此方法:
c=C()
for i in c.f():
print i
在for循环中,c.f()会多次执行吗?如果是的话,为了得到它一次,我是否必须在循环之外做任务,或者有一些微不足道的方法?
答案 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
>>>
你能发现差异吗?