Get started learning Python with DataCamp's free Intro to Python tutorial. Learn Data Science by completing interactive coding challenges and watching videos by expert instructors. Start Now!

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join 11 million other learners and get started learning Python for data science today!

Good news! You can save 25% off your Datacamp annual subscription with the code LEARNPYTHON23ALE25 - Click here to redeem your discount

Генераторы


Генераторы очень легко реализовать, но немного сложно понять.

Генераторы используются для создания итераторов, но с другим подходом. Генераторы — это простые функции, которые возвращают итерируемый набор элементов, по одному за раз, особым образом.

Когда итерация по набору элементов начинается с использованием оператора for, запускается генератор. Как только код функции генератора достигает оператора "yield", генератор передает выполнение обратно в цикл for, возвращая новое значение из набора. Функция генератора может генерировать столько значений (возможно, бесконечно), сколько захочет, передавая их по одному за раз.

Вот простой пример функции генератора, которая возвращает 7 случайных целых чисел:

  import random

  def lottery():
      # возвращает 6 чисел от 1 до 40
      for i in range(6):
          yield random.randint(1, 40)

      # возвращает 7-е число от 1 до 15
      yield random.randint(1, 15)

  for random_number in lottery():
         print("И следующий номер... %d!" %(random_number))

Эта функция самостоятельно решает, как генерировать случайные числа, и выполняет операторы yield один за другим, приостанавливаясь между вызовами, чтобы вернуть выполнение в основной цикл for.

Упражнение

Напишите функцию-генератор, которая возвращает ряд Фибоначчи. Они вычисляются по следующей формуле: первые два числа ряда всегда равны 1, а каждое последующее число равно сумме двух предыдущих чисел. Подсказка: можете ли вы использовать только две переменные в функции-генераторе? Помните, что присваивания можно выполнять одновременно. Код

a = 1
b = 2
a, b = b, a
print(a, b)

одновременно поменяет значения a и b местами.

# fill in this function def fib(): pass #this is a null statement which does nothing when executed, useful as a placeholder. # testing code import types if type(fib()) == types.GeneratorType: print("Good, The fib function is a generator.") counter = 0 for n in fib(): print(n) counter += 1 if counter == 10: break # fill in this function def fib(): a, b = 1, 1 while 1: yield a a, b = b, a + b # testing code import types if type(fib()) == types.GeneratorType: print("Good, The fib function is a generator.") counter = 0 for n in fib(): print(n) counter += 1 if counter == 10: break test_output_contains("Good, The fib function is a generator.") success_msg('Good work!')

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join over a million other learners and get started learning Python for data science today!

Previous Tutorial Next Tutorial Take the Test
Copyright © learnpython.org. Read our Terms of Use and Privacy Policy