我有一个for循环来检查一系列条件。在每次迭代时,它应仅为其中一个条件产生输出。如果没有条件为真,则最终产量是默认值。在每个收益率块之后我是否必须继续?
def function():
for ii in aa:
if condition1(ii):
yield something1
yield something2
yield something3
continue
if condition2(ii):
yield something4
continue
#default
yield something5
continue
答案 0 :(得分:17)
我建议使用continue
和elif
声明,而不是使用else
声明:
def function():
for ii in aa:
if condition1(ii):
yield something1
yield something2
yield something3
elif condition2(ii):
yield something4
else: #default
yield something5
这对我来说似乎更具可读性
答案 1 :(得分:15)
不,产量并不意味着继续,它只是从下一行开始,下次。一个简单的例子证明了
def f():
for i in range(3):
yield i
print i,
list(f())
这会打印0,1,2,但如果产量继续,则不会
答案 2 :(得分:12)
yield
停止执行并返回值。再次调用迭代器时,它会在yield
语句后直接继续执行。例如,一个生成器定义为:
def function():
yield 1
yield 2
会依次返回1
然后2
。换句话说,continue
是必需的。但是,在这种情况下,描述为flashk的elif
和else
绝对是正确的工具。
答案 3 :(得分:3)
continue
跳过剩余的代码块,但在生成器上再次调用yield
时执行next()
之后的代码块。 yield
就像在某个时刻暂停执行一样。
答案 4 :(得分:2)
这样更清晰,希望对您有所帮助,也感谢Anurag Uniyal。
style-loader!css-loader!sass-loader?modules&localIdentName=[name]---[local]---[hash:base64:5]
-----------运行后------------
def f():
for i in range(3):
yield i
print(i+10)
list(f())
答案 5 :(得分:0)
如果某些东西是简单的值并且条件是检查相等,我宁愿做这个“案例结构”字典查找:
ii_dict={'a':('somethinga1','somethinga2','somethinga3'),'b':('somethingb1',)}
ii_default = ('somethingdefault',)
aa='abeabbacd'
def function():
return (value
for ii in aa
for value in (ii_dict[ii] if ii in ii_dict else ii_default))
for something in function(): print something