8.5 Generator Experssion——生成器表达式

8.5 Generator Experssion——生成器表达式

generator是一个用于创建iterator的简单并强大的工具。生成器表达式就像函数一样,但它不是一个函数,它使用yield语句返回数据,而不是用return。

使用yield的斐波那契数列:

def fab(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        # print b
        a, b = b, a + b
        n = n + 1
简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

>>> unique_characters = {'E', 'D', 'M', 'O', 'N', 'S', 'R', 'Y'}
>>> gen = (ord(c) for c in unique_characters)  ①
>>> gen                       ②
<generator object <genexpr> at 0x00BADC10>
>>> next(gen)                   ③
69
>>> next(gen)
68
>>> tuple(ord(c) for c in unique_characters)   ④
(69, 68, 77, 79, 78, 83, 82, 89)

  1. 生成器表达式就像一个匿名的函数,它生成(yield)一个值。表达式它自己看起来就像一个list comprehension,但是它被封装到圆括号里而不是方括号。
  2. 生成器表达式返回一个迭代器(iterator)
  3. 调用next(gen)从迭代器返回下一个值。
  4. 只要你喜欢,你能迭代任可一个可以的值,并通过tuple()、list()或set()返回一个元组、列表或集合。在们这个例子中不需要额外的括号只要输入ord(c) for c in unique_characters到tuple()函数中,python就能计算出它是一个生成器表达式。
  5. ord(c)函数可以返回一个整数,这个整数是该字符的Unicode code point。

小提示:使用生成器表达式代替list comprehension可以节省CPU和RAM。

发表评论