Иногда мы хотим создавать коллекции элементов, которые очень дороги для расчета. Первый вариант состоит в том, чтобы создать список и подождать, пока все элементы будут рассчитаны, прежде чем мы его используем. Хотя это работает, это не очень эффективно. Чтобы сделать его немного более эффективным, современные языки предоставляют способ создания пользовательских итераторов, чтобы каждый элемент рассчитывал только при необходимости (это также называется ленивой инициализацией). Кроме того, итераторы позволяют нам создавать бесконечные коллекции!
У Python, на мой взгляд, один из самых краскожников и элегантных способов объявить итераторы: Генераторы Отказ
Без дальнейшего ADO, давайте попробуем создать бесконечный список простых чисел.
Первое, что нам нужно, это способ обнаружить, если число простое:
from math import sqrt def is_prime(n): if (n <= 1): return False if (n == 2): return True if (n % 2 == 0): return False i = 3 while i <= sqrt(n): if n % i == 0: return False i = i + 2 return True
Теперь, используя наши IS_PRIME
Функция мы можем сделать:
def prime_generator(): n = 1 while True: n += 1 if is_prime(n): yield n
И это все! Просто позвоните в функцию и получите элементы из него:
generator = prime_generator() for i in range(10): print(next(generator))
Или создать список первых N простых чисел:
from itertools import islice array = [x for x in islice(prime_generator(), 10)]
Как вы могли видеть, определение итератора является одним из кратчайших и простейших среди всех языков.
Оригинал: “https://dev.to/alebian/infinite-list-of-prime-numbers-using-python-generators-5fdc”