[英]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.