调用过滤器返回 <filter object at ... > [重复]
Posted
技术标签:
【中文标题】调用过滤器返回 <filter object at ... > [重复]【英文标题】:Calling filter returns <filter object at ... > [duplicate] 【发布时间】:2012-09-01 09:23:55 【问题描述】:我正在学习 Python 中过滤器的概念。我正在运行这样一个简单的代码。
>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
但我收到的不是列表,而是这样的消息。
<filter object at 0x00FDC550>
这是什么意思?这是否意味着我的过滤对象(即要出来的列表)存储在该内存位置?如何获取我需要的列表?
【问题讨论】:
【参考方案1】:看起来您使用的是 python 3.x。在 python3 中,filter
、map
、zip
等返回一个可迭代的对象,但不是列表。换句话说,
filter(func,data) #python 2.x
相当于:
list(filter(func,data)) #python 3.x
我认为它已更改,因为您(经常)想要以一种懒惰的方式进行过滤——您不需要消耗所有内存来预先创建一个列表,只要迭代器返回相同的列表在迭代期间会发生的事情。
如果你熟悉列表推导和生成器表达式,上面的过滤器现在(几乎)等同于 python3.x 中的以下内容:
( x for x in data if func(x) )
相对于:
[ x for x in data if func(x) ]
在 python 2.x 中
【讨论】:
非常感谢。另外,请你告诉我这个数字是什么 0x00FDC550 这是对象的 ID。在 CPython 中,它是内存位置。 哇...有趣...我认为 [] snd list() 是等价的,但是 [filter(func, data)] 不一样 @Mr_and_Mrs_D 尝试将迭代器对象 itObj 放入 [] 中,您将得到 [itObj],而放入 list() 中,您将从像 [1, 4, 7] 这样的对象中获取值,假设 itObj有这些值。 @Bin -- 不。这是一个权衡。 3.x 版本在许多情况下更有效(例如,传递给any
允许短路)。我认为提高效率以及使用任意大小的生成器的能力被视为放弃简单的长度检查的足够好处。毕竟要恢复获取长度的能力,只需要调用len(list(filter(...)))
而不是len(filter(...))
。【参考方案2】:
这是filter 函数返回的iterator。
如果你想要一个列表,就去做
list(filter(f, range(2, 25)))
不过,您可以使用 for
循环遍历此对象。
for e in filter(f, range(2, 25)):
do_stuff(e)
【讨论】:
非常感谢。另外,请你告诉我这个数字是什么 0x00FDC550 是那个对象的内存地址。如果该对象的类没有用于控制输出的__repr__()
方法,则它是打印对象时的默认输出。以上是关于调用过滤器返回 <filter object at ... > [重复]的主要内容,如果未能解决你的问题,请参考以下文章