python生成器和列表解析

系统 1598 0

什么是生成器?

可以理解为一种数据类型,这种数据自动实现了迭代器协议(其他数据类型需要调用自己内置的 _iter_ 方法),所以生成器就是可迭代对象

python提供生成器的两种表现形式:

1.生成器函数:

常规函数的定义,但是,使用 yield 语句而不是 return 语句返回结果。 yield 语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行。**函数里有yiled,执行函数就是一个生成器,不管yield位置在哪。采集函数创建生成器时,如果函数中含有return,则不会通过return得到任凭结果,return中止当前生成器,如果执行next()会报错。**简单示例如下:

            
              
                def
              
              
                test
              
              
                (
              
              
                )
              
              
                :
              
              
                global
              
               callback
    callback
              
                =
              
              
                yield
              
              
                2
              
              
                print
              
              
                (
              
              callback
              
                )
              
              
    callback2
              
                =
              
              
                yield
              
              
                1
              
              
                print
              
              
                (
              
              callback2
              
                )
              
              
                yield
              
              
                3
              
              
g
              
                =
              
              test
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              g
              
                )
              
              
                print
              
              
                (
              
              g
              
                .
              
              __next__
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              g
              
                .
              
              send
              
                (
              
              
                "这是传到生成器里面的值"
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              g
              
                .
              
              send
              
                (
              
              
                "这是传到生成器2里面的值"
              
              
                )
              
              
                )
              
            
          

结果:

            
              
                <
              
              generator 
              
                object
              
               test at 
              
                0x000000000260A5C8
              
              
                >
              
              
                2
              
              
这是传到生成器里面的值

              
                1
              
              
这是传到生成器
              
                2
              
              里面的值

              
                3
              
            
          

return的问题上面说过,就不实例了
这里说下next和send:
首先:要执行send之前,必须要先至少执行一个next
两者效果大体相同,只是send在执行是可以给生成器里的当前执行到的yield(这也是为什么要先next,不然生成器函数没开始执行,没到yield)一个返回值。

2.生成器表达式:

类似于列表推导,但是生成器返回按需要产生的一个对象,而不是一次构建一个结果列表

补充一个列表解析

            
              "SB" if name=="alex" else "shuaige"

            
          

用法:

            
              name="alex"
res="SB" if name=="alex" else "shuaige"
print(res)
name="yueshouhu"
res="SB" if name=="alex" else "shuaige"
print(res)

            
          

结果是:

            
              SB
shuaige

            
          

。。。。。。。。。。。。。。。。。。。。。。。。。。

            
              
number_list=[ i for i in range(10)]
print(number_list)

            
          
            
            
          

传统代码

            
              number_list=[]
for i in range(10):
    number_list.append(i)
print(number_list)

 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

            
          

列表解析:

            
              number_list=[ i for i in range(10) if i>5]
print(number_list)

[6, 7, 8, 9]

            
          

用列表解析的好处是相较于传统代码更便利,但是列表解析是直接生成一个完整列表放到内存中,很占内存,并且影响运行效率。
如执行 number_list=[ i for i in range(10000000000000000000000000000)] ,电脑将会直接卡死,只能重启,故需要使用生成器表达式

生成器表达式

            
              number_list=(i for i in range(1000000000000000000))

            
          

将原有列表解析的[ ] 改成()

            
              number_list=(i for i in range(1000000000000000000)if i>10)
print(number_list)
print(number_list.__next__())
print(number_list.__next__())

            
          

结果:

            
              
                
                   at 0x00000000026D6468>
11
12


                
              
            
          

综上,生成器的好处:

使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生所有结果放到内存里。

生成器小结;

1.是可迭代对象
2.实现了延迟操作,省内存
3.生成器和其他数据类型本质一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其他的可迭代对象可没有这点好处


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

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

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

【本文对您有帮助就好】

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

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