Generator

  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/
原文地址:https://www.cnblogs.com/zzyzz/p/7662712.html