Python 生成器

原文: https://thepythonguru.com/python-generators/


于 2020 年 1 月 7 日更新


生成器是用于创建迭代器的函数,因此可以在for循环中使用它。

创建生成器


生成器的定义类似于函数,但只有一个区别,我们使用yield关键字返回用于for循环的每次迭代的值。 让我们看一个示例,其中我们试图克隆 python 的内置range()函数。

  1. def my_range(start, stop, step = 1):
  2. if stop <= start:
  3. raise RuntimeError("start must be smaller than stop")
  4. i = start
  5. while i < stop:
  6. yield i
  7. i += step
  8. try:
  9. for k in my_range(10, 50, 3):
  10. print(k)
  11. except RuntimeError as ex:
  12. print(ex)
  13. except:
  14. print("Unknown error occurred")

预期输出

  1. 10
  2. 13
  3. 16
  4. 19
  5. 22
  6. 25
  7. 28
  8. 31
  9. 34
  10. 37
  11. 40
  12. 43
  13. 46
  14. 49
  1. def my_range(start, stop, step = 1):
  2. if stop <= start:
  3. raise RuntimeError("start must be smaller than stop")
  4. i = start
  5. while i < stop:
  6. yield i
  7. i += step
  8. try:
  9. for k in my_range(10, 50, 3):
  10. print(k)
  11. except RuntimeError as ex:
  12. print(ex)
  13. except:
  14. print("Unknown error occurred")

my_range()的工作方式如下:

for循环中,调用my_range()函数,它将初始化三个参数(startstopstep)的值,并检查stop是否小于或等于starti被分配了start的值。 此时,i10,因此while条件的值为True,而while循环开始执行。 在下一个语句yield中,将控制转移到for循环,并将i的当前值分配给变量k,在for循环打印语句中执行该语句,然后该控件再次传递到函数my_range()内的第 7 行 i递增。 此过程一直重复进行,直到i < stop为止。