zoukankan      html  css  js  c++  java
  • python——生成器

    生成器

    1.  生成器(generator):一边循环一边计算的机制。用生成器不必创建一个完整的list,这样就可以节省大量的空间。

    2.  创建一个生成器有很多种方法。

    第一种:把一个列表生成式的【】改为(),即可创建一个生成器

    >>> L=[x*x for x in range(1,11)]
    >>> L
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    >>> g=(x*x for x in range(1,11))
    >>> g
    <generator object <genexpr> at 0x000001F191BC15F0>
    

      

    如果要将生成器中的元素一个一个的打印出来,可以用 next()函数获得 generator 的下一个返回值

    >>> 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)
    100
    >>> next(g)
    Traceback (most recent call last):
      File "<pyshell#16>", line 1, in <module>
        next(g)
    StopIteration
    

      

    因为 generator 是可迭代对象,也可以用迭代的方法将其中的元素打印出来

    >>> g=(x*x for x in range(1,11))
    >>> for n in g:
    	print(n)
    
    	
    1
    4
    9
    16
    25
    36
    49
    64
    81
    100
    

      

    第二种:用函数来创建,例如,斐波那契数列,1,1,2,3,5,8,13,,,,

    用函数实现:

    >>> def fib(max):
    	n,a,b=0,0,1#这里n=0,a=0,b=1
    	while n<max:
    		print(b)
    		a,b=b,a+b#这里a=b,b=a+b
    		n=n+1
    	return 'done'
    
    >>> fib(6)
    1
    1
    2
    3
    5
    8
    'done'
    

      

    将上述函数中的 print(b)改为 yield b,就可实现 generator的定义了

    >>> def fib(max):
    	n,a,b=0,0,1
    	while n<max:
    		yield b
    		a,b=b,a+b
    		n=n+1
    	return 'done'
    
    >>> f=fib(6)
    >>> f
    <generator object fib at 0x000001F191BC15F0>
    

    可以用迭代的方法打印:

    >>> for n in fib(6):
    	print(n)
    
    	
    1
    1
    2
    3
    5
    8
    

    也可以用 next()函数一个一个的打印:

    >>> f=fib(5)
    >>> f
    <generator object fib at 0x000001F191C2EF90>
    >>> next(f)
    1
    >>> next(f)
    1
    >>> next(f)
    2
    >>> next(f)
    3
    >>> next(f)
    5
    >>> next(f)
         
    SyntaxError: invalid character in identifier
    

      

    函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用 next() 的时候执行,遇到 yield 语句返回,再次执行时从上次返回的 yield 语句处继续执行

    3.  generator的工作原理,它是在 for 循环的过程中不断计算出下一个元素,并在适当的条件结束 for 循环。对于函数改成的  generator 来说,遇到 return 语句或者执行到函数体最后一行语句,就是结束generator的指令, for 循环随之结束。

  • 相关阅读:
    echarts动态设置主体颜色
    spring security session
    Spark RDD函数:
    MapReduce TOP n
    feign 使用示例
    trie树
    动态修改注解(annotation)值
    golang插件
    Kafka Streams Example
    tcp并发(c18w)
  • 原文地址:https://www.cnblogs.com/canneddream/p/14191709.html
Copyright © 2011-2022 走看看