def coffee_filter(beans):
for bean in beans:
if bean.type == 'coffee':
yield bean
for bean in coffee_filter(beans):
print "coffee from %s" % bean.country
List comprehensions很整洁。即使更整洁,通常也不需要生成一个完整的列表—只需要一个迭代器,该迭代器为您提供列表将包含的值。这是一个生成器,可以通过生成器表达式简洁地表达它们。它们的编写方式与列表理解相同,只是方括号变为paren(如果它是函数调用中的唯一参数,则可以省略它们),例如'\n'.join(str(bean) for bean in beans if bean.type == 'coffee')。优点是提到的懒惰,也就是说,在真正需要(请求)价值观之前,你永远不会产生价值观,也不会同时将所有价值观都保存在内存中(当然,除非消费者这样做)。
您可以使用itertools.chain将多个iterable(包括列表)链接到一个iterable,或者如果您无法更改正在获取列表列表的事实,则可以使用(x for list in lists for x in list)。对于涉及简单深度嵌套的广义解决方案,需要使用递归的完整函数。
一行代码使用列表或生成器理解,见布莱尔的答案。
对当前代码的改编将适合于yield关键字,该关键字允许您构造如下生成器函数:
由于python允许您在几乎任何地方定义函数,因此这非常有用。
List comprehensions很整洁。即使更整洁,通常也不需要生成一个完整的列表—只需要一个迭代器,该迭代器为您提供列表将包含的值。这是一个生成器,可以通过生成器表达式简洁地表达它们。它们的编写方式与列表理解相同,只是方括号变为paren(如果它是函数调用中的唯一参数,则可以省略它们),例如
'\n'.join(str(bean) for bean in beans if bean.type == 'coffee')
。优点是提到的懒惰,也就是说,在真正需要(请求)价值观之前,你永远不会产生价值观,也不会同时将所有价值观都保存在内存中(当然,除非消费者这样做)。您可以使用
itertools.chain
将多个iterable(包括列表)链接到一个iterable,或者如果您无法更改正在获取列表列表的事实,则可以使用(x for list in lists for x in list)
。对于涉及简单深度嵌套的广义解决方案,需要使用递归的完整函数。相关问题 更多 >
编程相关推荐