2015-09-26 4 views
0

По какой-то причине я чертовски время пытаюсь обернуть мою голову кругами с диапазонами.python for loop with range()

Код:

# inefficient way to compute primes with "filter" 
nums = range(2, 100) 
for i in range(2, 8): 
    """Sieve of Eratosthenes: 
     Leave the element in the list if it is equal to "i", 
     or if it leaves a non-zero remainder when divided by "i". 
     """ 
    # (x % i returns either zero or non-zero, 0 -> False, non-0 -> True) 
    nums = filter(lambda x: x == i or x % i != 0, nums) 

print nums 

Производство этот вывод (т.е. простых чисел до 100):

[ 
2, 3, 5, 7, 11, 13, 17, 
19, 23, 29, 31, 37, 41, 
43, 47, 53, 59, 61, 67, 
71, 73, 79, 83, 89, 97 
] 

Это второй вопрос относительно этого я спросил здесь, и я не могу за жизнь я выясняю, как это работает. Может кто-нибудь объяснить, шаг за шагом (желательно, чтобы его можно было визуализировать), что здесь происходит именно здесь. Например, почему 4 печатается как простое? Так как x == i (т. Е. 4 == 4) или x% i -> True of False равно True.

+1

Возможно, вы захотите попробовать что-то вроде http://www.pythontutor.com/visualize.html – jonrsharpe

ответ

3

Вам не хватает того, что nums фильтруется на каждой итерации. Итак, на первой итерации все числа, для которых x% 2 не является 0, который включает в себя 4, отфильтровываются.

Если вы добавите дополнительный print nums в цикл, после фильтра вы увидите это более четко.