我正在写一个生成器函数。我想知道是否有一个更好的(阅读:更多pythonic,理想情况下具有列表理解)方式来实现这样的事情:
generator = gen()
captures = []
for _ in xrange(x):
foo = next(generator)
directories.append(foo['name'])
yield foo
这里的关键是我不想捕获整个产量 - gen()
返回的字典很大,这就是我使用生成器的原因。不过,我确实需要捕捉所有'名字'。我觉得有一种方法可以通过列表理解来实现这一点,但我只是没有看到它。想法?
答案 0 :(得分:6)
还有另一种/更短的方法可以做到这一点,但我不会称之为Pythonic:
generator = gen()
directories = []
generator_wrapper = (directories.append(foo['name']) or foo
for foo in generator)
这利用了这样一个事实:append
与Python中的所有变异方法一样,始终返回None
,因此.append(...) or foo
将始终评估为foo
。
这样整个字典仍然是生成器表达式的结果,你仍然得到延迟评估,但名称仍然保存到directories
列表。
您也可以在显式for
循环中使用此方法:
for foo in generator:
yield directories.append(foo['name']) or foo
或者甚至只是简化你的循环:
for foo in generator:
directories.append(foo['name'])
yield foo
因为没有理由使用xrange
来迭代生成器(除非你实际上只想迭代一些已知数量的步骤)。
答案 1 :(得分:0)
您想要生成器的第一个x
个元素吗?使用itertools.islice
:
directories = [item['name'] for item in itertools.islice(gen(), x)]