Как этот код простого генератора работает в первом цикле цикла, когда n=2?

#python #generator #primes

Вопрос:

Я изучаю генераторы на python. Я следую коду из https://jakevdp.github.io/WhirlwindTourOfPython/12-generators.html но совершенно сбитая с толку программой , когда n=2 , в чем именно заключается результат all(n % p > 0 for p in primes) ? Насколько я понимаю, первый раунд цикла primes пуст. Так почему же выражение истинно и добавляется 2 к набору?

 def gen_primes(N):
    """Generate primes up to N"""
    primes = set()
    for n in range(2, N):
        if all(n % p > 0 for p in primes):
            primes.add(n)
            yield n

print(*gen_primes(100))
 

Ответ №1:

Из документации all() :

Возвращает True , если все элементы итерируемого значения являются истинными (или если итерируемое значение пусто).

Поэтому, когда primes пусто, n % p > 0 for p in primes пусто, потому что нечего повторять. Поэтому all() возвращается True и n добавляется primes .

Комментарии:

1. В чем же результат 2 % p >0 ?

2. 2 % p это остаток, когда 2 делится на p . Если 2 кратно p , то остаток равен 0 , в противном случае он больше, чем 0 . Таким образом, это говорит вам, кратно ли 2 p .

3. Простое число-это число, которое не кратно никаким другим простым числам.

4. Чего я не понимаю, так это в чем ценность p ? Набор пуст, поэтому p предполагается, что это не число, выражение в первом цикле 2`%None или что?

5. Когда набор пуст, его нет p .