Автор оригинала: FreeCodeCapm Team.
Radu RaiCea.
Генераторы были важной частью Python, поскольку они были введены с PEP 255 Отказ
Функции генератора позволяют объявлять функцию, которая ведет себя как итератор.
Они позволяют программистам сделать итератор быстрым, легким и чистым способом.
Какой итератор, вы можете спросить?
итератор это объект, который может быть итерацией (зацикливается). Используется для абстрактных контейнера данных, чтобы сделать его вести себя как итеративный объект. Вы, вероятно, уже используете несколько намеренных объектов каждый день: строки, списки и словари называть несколько.
Итератор определяется классом, который реализует Итераторский протокол Отказ Этот протокол ищет два метода в классе: __er____
и __Next__
Отказ
Вау, шаг назад. Почему вы даже хотите сделать итераторы?
Сохранение места памяти
Итераторы не вычисляют значение каждого элемента при создании. Они только вычисляют это, когда вы просите это. Это известно как Ленивая оценка Отказ
Ленивая оценка полезна, когда у вас есть очень большие данные, установленные для вычисления. Это позволяет немедленно начать использовать данные, а весь набор данных вычисляется.
Допустим, мы хотим получить все простые числа, которые меньше максимального числа.
Сначала определим функцию, которая проверяет, является ли число Prime:
def check_prime(number): for divisor in range(2, int(number ** 0.5) + 1): if number % divisor == 0: return False return True
Затем мы определяем класс итератора, который будет включать __er____
и __Next__
Методы:
class Primes: def __init__(self, max): self.max = max self.number = 1
def __iter__(self): return self
def __next__(self): self.number += 1 if self.number >= self.max: raise StopIteration elif check_prime(self.number): return self.number else: return self.__next__()
Пребывания
создается максимальным значением. Если следующий Prime больше или равен, чем Макс
, итератор поднимет Заставка
Исключение, которое заканчивается итератор.
Когда мы запрашиваем следующий элемент в итераторе, он будет увеличиваться Номер
на 1 и проверьте, является ли это простое число. Если это не так, это позвонит __Next__
снова до Номер
премьер. Как только это есть, итератор возвращает номер.
Используя итератор, мы не создаем список простых чисел в нашей памяти. Вместо этого мы создаем следующее простое число каждый раз, когда мы запрашиваем его.
Давайте попробуем:
primes = Primes(100000000000)
print(primes)
for x in primes: print(x)
---------
<__main__.Primes object at 0x1021834a8>235711...
Каждая итерация Пребывания
Объектные звонки __Next__
генерировать следующее простое число.
Итераторы могут быть переданы только один раз. Если вы попытаетесь итерации за пребывания
Опять же, никакое значение не будет возвращено. Он будет вести себя как пустой список.
Теперь, когда мы знаем, какие итераторы и как сделать один, мы перейдем к генераторам.
Генераторы
Напомним, что функции генератора позволяют нам создавать итераторы более простыми модами.
Генераторы вводят доходность
Заявление на Python. Это работает немного похоже на Возвращение
Потому что это возвращает значение.
Разница в том, что Это экономит государство функции. В следующий раз вызывается функция, выполнение продолжается от где он остановился , с Такие же вариабельные значения оно было до уступления.
Если мы преобразуем наши Пребывания
Итератор в генератор, это будет выглядеть так:
def Primes(max): number = 1 while number < max: number += 1 if check_prime(number): yield number
primes = Primes(100000000000)
print(primes)
for x in primes: print(x)
---------
235711...
Теперь это красивый питон! Можем ли мы сделать лучше?
Да! Мы можем использовать Выражения генератора , введен с PEP 289 Отказ
Это в списке понимание, эквивалентные генераторы. Работает точно так же, как понимание списка, но выражение окружено ()
в отличие от []
Отказ
Следующее выражение может заменить нашу функцию генератора выше:
primes = (i for i in range(2, 100000000000) if check_prime(i))
print(primes)
for x in primes: print(x)
---------
at 0x101868e08>235711...
Это красота генераторов в Python.
В итоге…
- Генераторы позволяют вам создавать итераторы в очень пиктонологическом порядке.
- Итераторы позволяют ленивому оценке, созданию только следующего элемента объекта ITERABLE, при запросе. Это полезно для очень больших наборов данных.
- Итераторы и генераторы могут быть переданы только один раз.
- Функции генератора лучше, чем итераторы.
- Разращивания генератора лучше, чем итераторы (только для простых случаев).
Вы также можете проверить мой Объяснение О том, как я использовал Python, чтобы найти интересных людей, чтобы следовать на среднем.
Для получения дополнительных обновлений следуйте за мной на Twitter Отказ