Странное поведение вызовов stacked filter ()

Итак, я получаю интересное поведение от некоторых фильтров, объединенных в цикл 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 - нет?

5
задан Colin Woodbury 7 June 2011 в 09:10
поделиться