Python_生成器(generator)

generator与list比较

  • generator:算法实现下一个数据的输出,不调用下一个,就不执行下一个数据的运算
  • list:直接存储于内存,所有数据都同时存在
  • generator相较于list占用内存小

创建一个简单的generator

  • 简单的generator的创建:在列表生成式的基础上将[]改为()
    例如:
g=(x*x for x in range(10))
  • generator的调用
    • next调用:(直到报错结束)
    >>> g=(x*x for x in range(10))
    >>> g
     at 0x0610BC00>
    >>> next(g)
    0
    >>> 
    >>> next(g)
    1
    >>> next(g)
    4
    >>> next(g)
    9
    >>> next(g)
    16
    >>> next(g)
    25
    >>> next(g)
    36
    >>> next(g)
    49
    >>> next(g)
    64
    >>> next(g)
    81
    >>> next(g)
    Traceback (most recent call last):
      File "", line 1, in 
        next(g)
    StopIteration
    
    • for循环调用:
    >>> def g_get():
            for n in g:
                print(n)
    
    >>> g=(x*x for x in range(10))
    >>> g_get()
    0
    1
    4
    9
    16
    25
    36
    49
    64
    81
    

创建一个函数形式的generator

  • 函数型的generator的创建:
    与普通函数不同的是含有关键字yield,即含有yield的函数就是generator
 >>> def yhsj():
    L=[1]
    while True:
        yield L
        L=[1]+[L[i]+L[i+1] for i in range(len(L)-1)]+[1]

      
>>> def get_yhsj():
    for n in yhsj():
        print(n)

      
>>> get_yhsj()
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]
...

函数型的generator与普通函数的不同

  • 除了含有yield关键字外,还有就是执行顺序不同,普通函数的执行是按顺序的,而generator是执行到yield语句就停止,知道下一次调用,执行接下来的语句

你可能感兴趣的:(Python_生成器(generator))