Generator - Python 生成器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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/

 

以上是关于Generator - Python 生成器的主要内容,如果未能解决你的问题,请参考以下文章

发现一个python generator生成器特殊例子,理解了好久

Python--列表生成式(List Comprehensions)del语句和生成器(generator)

Generator

Generator - Python 生成器

python学习--生成器Generator

python之生成器-generator