itertools ifilter和islice函数和生成器

时间:2015-12-05 03:31:43

标签: python python-2.7 python-3.x

我试图了解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。

1 个答案:

答案 0 :(得分:1)

在3.0中,返回列表的2.x filter函数被itertools.ifilter替换,后者返回迭代器。因此,将itertools.ifilter替换为filter。我相信这是2to3转换器程序完成的替换之一。要保持even非惰性,请将filter(...)替换为list(filter(...))。这是另一个2to3替换。