Помогите, пожалуйста, понять, что конкретно делает этот код

def iprimes_upto(limit):

    is_prime = [True] * limit
    for n in range(2, limit):
        if is_prime[n]:
            yield n
            for i in range(n*n, limit, n):
                is_prime[i] = False
primes = list(iprimes_upto(2000000))

print(sum(primes))

Данный код в конце выдает сумму простых чисел до двух миллионов. Я просто не понимаю что происходит построчно именно в самой функции и как генерируется список.


Ответы (1 шт):

Автор решения: rew

Чтобы код правильно работал нужно исправить 6 строчку

def iprimes_upto(limit):  # Реализация алгоритма решето эратосфена
    is_prime = [True] * limit
    for n in range(2, limit):  # идем по всем числам из заданного промежутка
        if is_prime[n]:  # если число простое
            yield n  # возвращаем простое число но не заканчиваем функцию
            for i in range(n*2, limit, n):  # теперь все числа, которые могут получится умножением n на какоето число помечаем как непростые
                is_prime[i] = False


print(sum(iprimes_upto(10)))
→ Ссылка