zoukankan      html  css  js  c++  java
  • 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/
  • 相关阅读:
    【alpha】Scrum站立会议第2次....10.17
    【alpha】Scrum站立会议第1次····10.16
    【week4】技术随笔psp
    【week4】课堂Scrum站立会议
    【week3】psp (技术随笔)
    【week3】四则运算 单元测试
    【week3】词频统计 单元测试
    Oracle Split字符串

    指针函数与指针数组
  • 原文地址:https://www.cnblogs.com/zzyzz/p/7662712.html
Copyright © 2011-2022 走看看