我通常尽可能地尝试使用yield,但是我不知道如何在这样的代码上使用yield:
numbers = [1,2,3,4,5,6,7,8,9,10]
def odd_and_even(numbers):
odd = []
even = []
for number in numbers:
if number % 2:
odd.append(number)
else:
even.append(number)
return (odd, even)
显然,在上面的例子中,我可以将它重写为两个不同的函数,但对于更复杂的东西,这可能在计算上非常昂贵,因为我的运行次数是我的两倍。
如何使用上述代码来使用yield?
答案 0 :(得分:3)
import itertools
def partition(items, predicate=bool):
a, b = itertools.tee((predicate(item), item) for item in items)
return ((item for pred, item in a if not pred),
(item for pred, item in b if pred))
odd, even = partition(numbers, lambda n: n % 2 == 0)
如果odd
,even
几乎不同步消耗,或者谓词不贵,那么您的列表版本(来自问题)应该更快。