生成器

概念

Generator 是一个用于创建迭代器的简单而强大的工具。

它们的写法类似标准的函数,但当它们要返回数据时会使用 yield 语句。

每次对生成器调用 next() 时,它会从上次离开位置恢复执行(它会记住上次执行语句时的所有数据值)。

例子

显示如何非常容易地创建生成器的示例如下:

  • yield_test.py
  [py]
1
2
3
4
5
6
def print_yeild(nums): for i in nums: yield "1" for num in print_yeild(range(5)): print(num)
  • 测试结果
  [plaintext]
1
2
3
4
5
6
> python .\yield_test.py 1 1 1 1 1

ps: 其实很简单,只是在我 for each 的时候,调用了 yeild 返回的值。

生成器表达式

概念

某些简单的生成器可以写成简洁的表达式代码,所用语法类似列表推导式,将外层为圆括号而非方括号。

这种表达式被设计用于生成器将立即被外层函数所使用的情况。

生成器表达式相比完整的生成器更紧凑但较不灵活,相比等效的列表推导式则更为节省内存。

例子

  [py]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> sum(i*i for i in range(10)) # sum of squares 285 >>> xvec = [10, 20, 30] >>> yvec = [7, 5, 3] >>> sum(x*y for x,y in zip(xvec, yvec)) # dot product 260 >>> from math import pi, sin >>> sine_table = {x: sin(x*pi/180) for x in range(0, 91)} >>> unique_words = set(word for line in page for word in line.split()) >>> valedictorian = max((student.gpa, student.name) for student in graduates) >>> data = 'golf' >>> list(data[i] for i in range(len(data)-1, -1, -1)) ['f', 'l', 'o', 'g']

参考资料

生成器

迭代器和生成器