我试图了解itertools.ifilter()和itertools.islice()函数的重要性,以了解生成器的所有内容。
import itertools
def is_even(x):
print('is_even called for {}'.format(x))
return (x%2 == 0)
def even():
return filter(is_even,range(20))
def even_ex():
return itertools.ifilter(is_even,range(20))
#return filter(is_even,range(20))
unlazy_even = even()[:4]
lazy_even = even_ex()
first_four = itertools.islice(lazy_even,0,4)
print('unlazy even {} lazy even {}'.format(unlazy_even,lazy_even))
for item in first_four:
print(item)
问题是我真的想使用python 3.5。但是函数itertools.ifilter在python 3.5中不存在。此外,过滤器返回filter object
而不是python 3.5中的列表。如何将上述程序转换为Python 3.5。
答案 0 :(得分:1)
在3.0中,返回列表的2.x filter
函数被itertools.ifilter
替换,后者返回迭代器。因此,将itertools.ifilter
替换为filter
。我相信这是2to3转换器程序完成的替换之一。要保持even
非惰性,请将filter(...)
替换为list(filter(...))
。这是另一个2to3替换。