【发布时间】:2016-01-17 20:13:59
【问题描述】:
为了了解 lambda,我关注了这个 tutorial,并遇到了这个关于计算素数的示例(python 2.x):
nums = range(2,50)
for i in range(2,8):
nums = filter(lambda x: x == i or x % i, nums)
print (list(nums))
打印
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
但是,在 python 3.4 中尝试此操作时,它产生了意外行为:
nums = range(2,50)
for i in range(2,8):
nums = filter(lambda x: x == i or x % i , nums)
print(list(nums))
打印
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48]
我不明白为什么会有差异。我知道 filter 在 python 3 中返回一个过滤器对象(而不是一个列表),但据我所知,这不应该影响结果。
删除 for 循环会产生正确的结果:
>>> nums = range(2,50)
>>> nums = filter(lambda x: x == 2 or x % 2, nums)
>>> nums = filter(lambda x: x == 3 or x % 3, nums)
>>> nums = filter(lambda x: x == 4 or x % 4, nums)
>>> nums = filter(lambda x: x == 5 or x % 5, nums)
>>> nums = filter(lambda x: x == 6 or x % 6, nums)
>>> nums = filter(lambda x: x == 7 or x % 7, nums)
>>> print(list(nums))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
我希望有人能启发我,因为我很好奇发生了什么。
【问题讨论】:
-
range和filter在 Py3 中返回对象,而在 python2 中返回列表。 -
@BhargavRao:这距离解释这种行为还有很长的路要走。
-
@BrenBarn 简单的改变,
filter(lambda x: x == i or x % i , list(nums))将在 python 3 中工作 :) 但我相信你可以更好地解释。 -
@BhargavRao:这距离解释行为还有很长的路要走。
-
是的,我正在懒惰地评估 cmets 中的答案 :)