ins*_*get 25 python module function built-in
我试图更熟悉itertools模块,并找到了一个名为的函数ifilter.
根据我的理解,它基于给定的函数进行过滤和迭代,并在包含函数计算结果的iterable元素的列表上返回一个迭代器True.
问题1:到目前为止我的理解是否正确?
问题2:除了返回和迭代器之外,它与内置filter函数有什么不同?
问题3哪个更快?
据我所知,事实并非如此.我错过了什么吗?(我跑了下面的测试)
>>> itertools.ifilter(lambda x: x%2, range(5))
<itertools.ifilter object at 0x7fb1a101b210>
>>> for i in itertools.ifilter(lambda x: x%2, range(5)): print i
...
1
3
>>> filter(lambda x: x%2, range(5))
[1, 3]
>>> function = lambda x: x%2
>>> [item for item in range(5) if function(item)]
[1,3]
Run Code Online (Sandbox Code Playgroud)
Rik*_*ggi 19
你的理解是正确的:唯一的区别是ifilter返回一个迭代器,而使用filter就像调用:
list(ifilter(...))
Run Code Online (Sandbox Code Playgroud)
您可能也对PEP 289关于过滤器和ifilter的说法感兴趣:
列表理解大大减少了对
filter()和的需求map().同样,生成器表达式可以最大限度地减少对itertools.ifilter()和的需求itertools.imap().[...]
还要注意,ifilter成为filter在Python-3(因此从itertools删除).
tob*_*ych 16
下面的示例包括一个数字生成器,它在产生数字之前立即打印消息,显示filter()首先构建列表的方式,然后运行并过滤它.尽管itertools.ifilter过滤器,但从不建立列表.如果您要过滤500,000个重要事项ifilter,那么您就不需要构建列表.
import itertools
def number_generator():
for i in range(0, 3):
print "yield", i
yield i
print "stopping"
function = lambda x: x > 0
numbers = number_generator()
print "itertools.ifilter:"
for n in itertools.ifilter(function, numbers):
print n
print "\nfilter:"
numbers = number_generator()
for n in filter(function, numbers):
print n
Run Code Online (Sandbox Code Playgroud)
输出:
itertools.ifilter: yield 0 yield 1 1 yield 2 2 stopping filter: yield 0 yield 1 yield 2 stopping 1 2