Нужна помощь в создании генератора для распечатки чисел из функции isPrime - PullRequest
0 голосов
/ 24 июня 2019

Есть рабочая функция isPrime, которая принимает один аргумент и возвращает true, если число простое, и false, если иное.Как я могу создать генератор для распечатки всех простых чисел, которые проходят через функцию isPrime?

Это то, что я пытался, но я уверен, что это не работает.

primeGen = [var for var in isPrime(var) if isPrime(var)]
print(primeGen)

Любые указатели будут оценены!

Ответы [ 3 ]

0 голосов
/ 24 июня 2019

Самая большая проблема здесь в том, что вам нужен какой-то итератор, который начинается с 1 и идет до бесконечности. К счастью, itertools предоставляет один. Мы можем использовать его для создания генератора:

import itertools
...
primeGen = (n for n in itertools.count(start=2, step=1) if isPrime(n))
type(primeGen)  # <class 'generator'>
# do not do the following:
for i in primeGen:
    print(i)
    # this continues infinitely

, который будет последовательно выводить простые числа в последовательности.

Обратите внимание, что я использую () здесь вместо []. Нам нужен генератор, а не понимание списка - использование квадратных скобок заморозит программу, потому что она пытается построить список весь до его возвращения, и бесконечности нет конца. Использование () возвращает генератор вместо списка, что нормально.

0 голосов
/ 24 июня 2019

Мой подход будет

def primeGen(start=1):
    while True:
        if isPrime(start):
            yield start
        start += 1

Использование

pg = primeGen()
for i in range(10):
    print(next(pg))
0 голосов
/ 24 июня 2019

Прежде всего, я вижу из isPrime(var), что он возвращает истину или ложь, как вы можете использовать его в цикле for, это не имеет смысла. Сделайте что-то подобное, если вам нужен список для простого числа до n.

primeGen = [var for var in range(n) if isPrime(var)]
print(primeGen)
...