在Python中删除生成器中的重复代码

2024-03-29 04:54:25 发布

您现在位置: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的重复代码?你知道吗

我发现了yield from。这正是我想要的,但是我的项目是在python2.7中。你知道吗


Tags: 项目代码infromforfoodefbar
3条回答

你可以这样重写:

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

您可以重新编码以使用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']

马丁的回答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']

相关问题 更多 >