Generator - Python 生成器
阿新 • • 發佈:2017-10-13
結構體 lin value 定義 div 創建 lazy 求值 dev
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 function19 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 issometimes 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/
Generator - Python 生成器