在列表理解中捕获并产生

Luc*_*iel 4 python iteration list-comprehension generator

我正在写一个生成器函数.我想知道是否有一个更好的(阅读:更多pythonic,理想情况下具有列表理解)方式来实现这样的事情:

generator = gen()
captures = []
for _ in xrange(x):
    foo = next(generator)
    directories.append(foo['name'])
    yield foo
Run Code Online (Sandbox Code Playgroud)

这里的关键是我不想捕获整个产量 - 返回的字典gen()很大,这就是我使用生成器的原因.不过,我确实需要捕捉所有'名字'.我觉得有一种方法可以通过列表理解来实现这一点,但我只是没有看到它.思考?

agf*_*agf 6

有另一种/更短的方法可以做到这一点,但我不会称之为Pythonic:

generator = gen()
directories = []
generator_wrapper = (directories.append(foo['name']) or foo 
                         for foo in generator)
Run Code Online (Sandbox Code Playgroud)

这利用了这样的事实append,就像Python中的所有变异方法一样,它总是返回,None所以.append(...) or foo总是会求值foo.

这样整个字典仍然是生成器表达式的结果,并且您仍然得到延迟评估,但名称仍然保存到directories列表中.

您还可以在显式for循环中使用此方法:

for foo in generator:
    yield directories.append(foo['name']) or foo
Run Code Online (Sandbox Code Playgroud)

或者甚至只是简化你的循环:

for foo in generator:
    directories.append(foo['name'])
    yield foo
Run Code Online (Sandbox Code Playgroud)

因为没有理由使用xrangejust来迭代生成器(除非你实际上只想迭代一些已知数量的步骤).