单个方法中的顺序yield语句

时间:2016-03-22 14:05:34

标签: python generator

我知道它永远不会用来顺序写几个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吗?

4 个答案:

答案 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