加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python 2与Python 3 – 过滤器行为的差异

发布时间:2020-12-16 23:07:09 所属栏目:Python 来源:网络整理
导读:有人可以帮助我理解为什么实现“Eratosthenes筛”的以下代码在 Python 2和 Python 3中表现不同. l = range(2,20)for i in range(2,6): l = filter(lambda x: x == i or x % i != 0,l)print(tuple(l)) 使用Python 2.7: python filter.py(2,3,5,7,11,13,17,19
有人可以帮助我理解为什么实现“Eratosthenes筛”的以下代码在 Python 2和 Python 3中表现不同.
l = range(2,20)
for i in range(2,6):
    l = filter(lambda x: x == i or x % i != 0,l)
print(tuple(l))

使用Python 2.7:

> python filter.py
(2,3,5,7,11,13,17,19)

使用Python 3.6:

> python filter.py
(2,4,6,8,9,12,14,16,18,19)

我知道Python3的过滤器返回一个过滤器对象,但无法解释最终结果. (代码来自这个lambdas教程1).

解决方法

这里有两个部分发挥作用:

>在python-3.x中,过滤器用作生成器:过滤是懒惰的;和
> lambda x中的i:…更新以及for循环中的i进行更新.

所以最后你所构建的是:

l = filter(lambda x: x == 5 or x % 5 != 0,filter(lambda x: x == 5 or x % 5 != 0,l)
            )
        )
    )

请注意,所有过滤都像我一直是5一样完成.所以现在你调用元组(..),实际的过滤将被完成,正如你所看到的,只有五个不是五个自身的多个被过滤掉了.

一个简单的解决方法是在循环中使用list,以便主动完成过滤:

l = range(2,6):
    l = list(filter(lambda x: x == i or x % i != 0,l))
print(tuple(l))

在python中运行它返回:

>>> l = range(2,20)
>>> for i in range(2,6):
...     l = list(filter(lambda x: x == i or x % i != 0,l))
... 
>>> print(l)
[2,19]

请注意,虽然python-2.7和python-3.x看起来完全相同,但实际上这些“不同”的语言彼此不兼容:运行在一个中的代码并不总是在另一个中起作用,反之亦然.

另一个注释(@ShadowRanger的信用)是一个实际上可以绑定你的lambda.您可以通过创建“高阶lambda”来完成此操作.而不是写:

lambda x : x == i or x % i != 0

你写:

(lambda j : (lambda x : x == j or x % j != 0))(i)

会发生什么是定义一个函数,该函数将实际取值为i的j作为输入.通过立即调用它,j绑定到i的值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读