【发布时间】:2011-06-07 09:10:04
【问题描述】:
所以我从 for 循环中堆叠的一些过滤器中得到了一些有趣的行为。 我将从演示开始:
>>> x = range(100)
>>> x = filter(lambda n: n % 2 == 0, x)
>>> x = filter(lambda n: n % 3 == 0, x)
>>> list(x)
[0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96]
这里我们得到了预期的输出。我们在过滤器中的过滤器中有一个范围,并且过滤器条件按照我们想要的方式堆叠。现在我的问题来了。
我写了一个函数来计算一个数的相对素数。它看起来像这样:
def relative_primes(num):
'''Returns a list of relative primes, relative to the given number.'''
if num == 1:
return []
elif is_prime(num):
return list(range(1, num))
result = range(1, num)
for factor in prime_factors(num):
# Why aren't these filters stacking properly?
result = filter(lambda n: n % factor != 0, result)
return list(result)
无论出于何种原因,过滤器仅应用于从 prime_factors() 获取的列表中的最后一个因子。示例:
>>> prime_factors(30)
[2, 3, 5]
>>> relative_primes(30)
[1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28, 29]
我们可以看到没有从列表中删除 2 或 3 的倍数。为什么会这样?为什么上面的例子有效,而 for 循环中的过滤器却无效?
【问题讨论】: