Generator - Python 生成器
1 Generator, python 生成器, 2 3 先熟悉一下儿相关定义, 4 generator function 生成器函数, 5 生成器函数是一个在定义体中存有 'yield' 关键字的函数. 6 当生成器函数被调用的时候, 函数反返回一个 generator. 7 8 A function that has the yield keyword in 9 its body. When invoked, a generator func‐ 10 tion returns a generator. 11 12 generator 生成器, 13 生成器 generator 的本质是 迭代器 iterator, 由 生成器函数 或 生成器表达式 构建得到, 14 可不通过对 集合 collection 迭代'生产'出集合中的值. 15 典型的用法 斐波那契序列. 因为 Fibonacci series 是无穷的, 所因无法将其放到一个集合中. 16 generator 一词,有时候也用来描述 一个 generator function. 17 18 An iterator built with a generator function 19 or a generator expression that may produce 20 values without necessarily iterating over a 21 collection; the canonical example is a gen‐ 22 erator to produce the Fibonacci series 23 which, because it is infinite, would never fit 24 in a collection. The term is sometimes used 25 to describe a generator function, besides the 26 object that results from calling it. 27 28 generator expression 生成器表达式, 29 generator expression 是一个放在括号里面的,语法与列表推导 list comprehensive 一样, 30 但是返回的是一个 generator 而不是 list. 31 生成器表达式 generator expression 可以被看成是一个 惰性求值 lazy 版本的 list comprehensive. 32 33 An expression enclosed in parenthesis us‐ 34 ing the same syntax of a list comprehen‐ 35 sion, but returning a generator instead of a 36 list. A generator expression can be under‐ 37 stood as a lazy version of a list comprehen‐ 38 sion. See lazy. 39 40 lazy 惰性求值, 41 惰性求值 lazy 指的是一个'按需'产出元素的可迭代对象 iterable object 42 An iterable object which produces items on 43 demand. In Python, generators are lazy. 44 Contrast eager. 45 46 47 48 例子 Fibonacci series, 49 def fib(): 50 a, b = 0, 1 51 while 1: 52 yield b # 生成器函数定义体中 yield 关键字 53 a, b = b, a+b 54 f = fib() 55 print(f) 56 cof = 8 57 while cof: 58 print(f.__next__()) # 生成器是可迭代的 generator is iterable -> generator iterators 59 cof -= 1 60 61 output, 62 <generator object fib at 0x02E692D0> # 生成器函数 '生成' generator 63 1 64 1 65 2 66 3 67 5 68 8 69 13 70 21 71 72 generator object, 73 python 通过生成器对象实现 generator iterators. 74 generator 通常由生成器函数创建(定义体中有 yield 关键字的函数), 75 而不是直接通过调用 PyGen_New() 或 PyGen_NewWithQualName(). 76 77 PyGenObject, 78 generator object C 结构体. 79 80 typedef struct { 81 /* The gi_ prefix is intended to remind of generator-iterator. */ 82 _PyGenObject_HEAD(gi) 83 } PyGenObject; 84 85 #define _PyGenObject_HEAD(prefix) \ 86 PyObject_HEAD \ 87 /* Note: gi_frame can be NULL if the generator is "finished" */ \ 88 struct _frame *prefix##_frame; \ 89 /* True if generator is being executed. */ \ 90 char prefix##_running; \ 91 /* The code object backing the generator */ \ 92 PyObject *prefix##_code; \ 93 /* List of weak reference. */ \ 94 PyObject *prefix##_weakreflist; \ 95 /* Name of the generator. */ \ 96 PyObject *prefix##_name; \ 97 /* Qualified name of the generator. */ \ 98 PyObject *prefix##_qualname; 99 100 PyTypeObject PyGen_Type 101 generator object 的 python 类型对象 102 103 int PyGen_Check(PyObject *ob) 104 若 ob 是 生成器对象 generator object, 返回 true, 105 注, ob 不能为 Null 对象. 106 107 int PyGen_CheckExact(PyObject *ob) 108 若 ob 的类型是 PyGen_Type, 返回 true, 109 注, ob 不能为 Null 对象. 110 111 PyObject* PyGen_New(PyFrameObject *frame) 112 Return value: New reference. 113 创建并返回一个新的基于 PyFrameObject *frame 的 generator object. 114 注, *frame 不可以为 Null 对象. 115 116 PyObject* PyGen_NewWithQualName(PyFrameObject *frame, PyObject *name, PyObject *qualname) 117 Return value: New reference. 118 创建并返回一个新的基于 PyFrameObject *frame 的 generator object, __name__ 属性为 *name , 119 __qualname__ 属性为 *qualname. 120 注, *frame 不可以为 Null 对象. 121 122 References, 123 124 https://docs.python.org/3/c-api/gen.html?highlight=generator 125 https://www.python.org/dev/peps/pep-0255/