Python 生成器

系统 1797 0

最近重新回忆了一下Python的生成器,下面给大家介绍一下

简单的说,生成器只有在调用的时候在会生成相应的数据,我们来看一个例子

            a =
            
               []

            
            
              for
            
             i 
            
              in
            
             range(10
            
              ):
    a.append(i)

            
            
              print
            
            (a)
          

运行结果如下:

 

其实,这么多行的代码我们可以使用列表生成式一行代码就可以搞定了如下:

            >>> [ i*2 
            
              for
            
             i 
            
              in
            
             range(10
            
              ) ]
[0, 
            
            2, 4, 6, 8, 10, 12, 14, 16, 18]
          

OK,那看到这,可能有人会问,有什么卵用呢?
好处当然是有滴,听我细说,首先列表生成器可以省内存
如果我们用一个列表存储很多数据,但我们可能用到的只是前面的一些数据,那么就会耗时耗力,那么对于有规律(后面的元素比前面的大一)的元素,就可以考虑列表生成式

            >>> ( i*2 
            
              for
            
             i 
            
              in
            
             range(10
            
              ) )

            
            
              
                 at 0x0000020DFC10B888>
              
            
          

当我把中括号改为小括号时发现,其实列表生成式返回的是一个内存地址,那么我给它赋值看一下效果

            >>> temp = ( i*2 
            
              for
            
             i 
            
              in
            
             range(10
            
              ) )

            
            >>> 
            
              for
            
             i 
            
              in
            
            
               temp:
...     
            
            
              print
            
            
               (i)
...
0

            
            2
4
6
8
10
12
14
16
18
>>>
          

如果循环的数特别大,我们在看下效果

            >>> temp = ( i*2 
            
              for
            
             i 
            
              in
            
             range(10000000
            
              ) )

            
            >>> 
            
              for
            
             i 
            
              in
            
            
               temp:
...     
            
            
              print
            
            
               (i)
...
0

            
            2
4
6
8
            
              
...

            
            5134
5136
5138
5140
            
              
Traceback (most recent call last):
  File 
            
            
              "
            
            
              
            
            
              "
            
            , line 2, 
            
              in
            
            
              
                
KeyboardInterrupt

              
              >>> temp[1000
              
                ]
Traceback (most recent call last):
  File 
              
              
                "
              
              
                
              
              
                "
              
              , line 1, 
              
                in
              
              
                
                  
TypeError: 
                
                
                  '
                
                
                  generator
                
                
                  '
                
                 object 
                
                  is
                
                
                  not
                
                 subscriptable
              
            
          

还没执行完,被我Ctrl+C中止了,中间省略了一些,然后我直接调用temp[1000],报错了,由此看出,生成器只有在调用的时候才生成,不调用的时候没有数据生成,那我怎么取数据呢?
只能调用__next__方法,如下:

            >>> temp.
            
              __next__
            
            
              ()

            
            5142
>>> temp.
            
              __next__
            
            
              ()

            
            5144
>>> temp.
            
              __next__
            
            
              ()

            
            5146
          

朋友们有没有发现一个问题,是接着我暂停的地方开始接着往下取的,那么问题来了,我能不能返回取上一个数据呢?答案是不行的,生成器只能不停的往下next
好的,相信你已经简单了解生成器了,但是这是有规律的表达式,要是没有规律的一些问题,例如,斐波那契数列问题,那可以使用函数实现

            
              def
            
            
               fib(temp):
    n, a, b 
            
            = 0, 0, 1
    
            
              while
            
             n <
            
               temp:
        
            
            
              print
            
            
              (b)
        a, b 
            
            = b, a +
            
               b
        n 
            
            = n + 1
            
              

fib(
            
            10)
          

此函数正常输出就是斐波那契数列的值,那现在我给他变成生成器

            
              def
            
            
               fib(temp):
    n, a, b 
            
            = 0, 0, 1
    
            
              while
            
             n <
            
               temp:
        
            
            
              yield
            
            
               b
        a, b 
            
            = b, a +
            
               b
        n 
            
            = n + 1


            
              print
            
            (fib(10))
          

返回值为 这样的内存地址,是不是很眼熟,这就是生成器了

 


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论