簡體   English   中英

從Python中刪除生成器中的重復代碼

[英]Remove duplicated codes from a generator in Python

def generator():
    for i in range(10):
        yield "foo" + "baz"

    for i in range(10):
        yield "bar" + "baz"

我想制作這樣的代碼:

def baz(s):
    for i in range(10):
        yield s + "baz"

def generator():
    baz("foo")
    baz("bar")

但是,此代碼的行為有所不同。

如何擺脫重復代碼,包括生成器中的yield

PS我發現了yield from 這正是我想要的,但我的項目是在Python 2.7中。

您可以重新編碼以使用itertools ,如下所示:

from itertools import repeat, chain

def generator():
    for i in chain(repeat('foobaz', 10), repeat('barbaz', 10)):
        yield i

for x in generator():
    print x

給你:

foobaz
foobaz
foobaz
foobaz
foobaz
foobaz
foobaz
foobaz
foobaz
foobaz
barbaz
barbaz
barbaz
barbaz
barbaz
barbaz
barbaz
barbaz
barbaz
barbaz

或者作為一個簡單的列表:

from itertools import repeat, chain

def generator():
    return list(chain(repeat('foobaz', 10), repeat('barbaz', 10)))

print generator()

贈送:

['foobaz', 'foobaz', 'foobaz', 'foobaz', 'foobaz', 'foobaz', 'foobaz', 'foobaz', 'foobaz', 'foobaz', 'barbaz', 'barbaz', 'barbaz', 'barbaz', 'barbaz', 'barbaz', 'barbaz', 'barbaz', 'barbaz', 'barbaz']

你可以像這樣重寫它:

def baz(s):
    for i in range(10):
        yield s + "baz"

def generator():
    for s in ["foo", "baz"]:
        for b in baz(s):
            yield b

Martin的答案, https//stackoverflow.com/a/35286012/901925可以被視為:

def baz(s):
    for i in range(4):yield s+'baz'

def g2():
    return itertools.chain(baz('foo'),baz('bar'))

In [411]: list(g2())
Out[411]: 
['foobaz',
 'foobaz',
 'foobaz',
 'foobaz',
 'barbaz',
 'barbaz',
 'barbaz',
 'barbaz']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM