我知道它永远不会用来顺序写几个return
语句,而第二个语句将无法访问,例如:
def return_something():
return 2
return "Kolia" # unreachable
但是如果有顺序写几个yield
语句有用吗?
def yield_something():
yield 3
yield 4
print(next(yield_something()))
print(next(yield_something()))
>>> 3
>>> 3
对我来说,我已经看到了使用顺序yield
的某处,而我的IDE并没有突出显示它。任何人都可以让我使用顺序yield
吗?
答案 0 :(得分:4)
顺序产量可以替代或替换为产生常量元组中的值。
for i in (1,7,3,20):
yield i
# versus
yield 1; yield 7; yield 3; yield 20
或者,代码中可能有多个yield
,执行不同的操作。我不会将这些顺序产量视为一个更大函数的两个部分:
def unzip_dict(d):
for k in d.keys():
yield k
for v in d.values():
yield v
答案 1 :(得分:3)
使用yield_something()
时,您始终会创建新的生成器。您应该创建一个生成器a = yield_something()
,然后在那个生成器上调用next(a)
:
def yield_something():
yield 3
yield 4
a = yield_something() # Generator
print(next(a)) # 3
print(next(a)) # 4
但通常你会在生成器中定义一个生成yields
:
def yield_something():
for i in (3,4):
yield i
或者如果可以计算它们,那么生成器非常强大,因为它不需要在内存中保留值列表:
def yield_something():
i = 3
while i < 5:
yield i
i += 1
答案 2 :(得分:2)
以下公开了示例中顺序产量的使用:
def yield_something():
yield 3
yield 4
a = yield_something()
print(next(a))
print(next(a))
<强>输出强>
3
4
在您的示例中,每次调用yield_something()
时,都会创建一个新生成器。使用a = yield_something()
创建生成器,然后在每次要next()
时使用yield
。
答案 3 :(得分:2)
是的,甚至还有真正的单词示例。如果你看一下this prime sieve implementation here on StackOverflow,你会看到它使用顺序产量。虽然这是真的,但它仅用作优化。
以下代码来自tzot的回答:
import itertools as it
def erat3( ):
D = { 9: 3, 25: 5 }
yield 2
yield 3
yield 5
MASK= 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0,
MODULOS= frozenset( (1, 7, 11, 13, 17, 19, 23, 29) )
for q in it.compress(
it.islice(it.count(7), 0, None, 2),
it.cycle(MASK)):
p = D.pop(q, None)
if p is None:
D[q*q] = q
yield q
else:
x = q + 2*p
while x in D or (x%30) not in MODULOS:
x += 2*p
D[x] = p