欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python生成器和列表解析

系統 1619 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元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 免费观看性欧美大片无片 | 亚洲人成一区二区三区 | 毛片在线观看视频 | 精品久| 在线欧美一区 | 色呦呦在线观看视频 | 久久视频这里只要精品 | 亚洲十欧美十日韩十国产 | 国产激情偷乱视频一区二区三区 | 日本免费一级视频 | 久久99精品国产麻豆婷婷洗澡 | 五月天欧美激情午夜情 | 我和我的祖国电影在线观看免费版高清 | 国产乱肥老妇国产一区二 | 欧美视频网站在线观看 | 福利视频99 | 日日摸日日| 亚洲视频在线网站 | 亚洲免费看片网站 | 欧美久久视频 | 91亚洲精品在线观看 | a视频在线播放 | 欧美黄色大片免费观看 | 天天骑夜夜操 | 一级做a爰片性色毛片中国 日本黄色免费片 | 成人久久 | 国产aaaaa一级毛片 | 久久久久久综合 | 日韩一区二区免费看 | 天天爽夜夜 | 色综合婷婷| 日韩欧美在线视频不卡免费视频 | 99国内精品 | 成人久久精品一区二区三区 | 夜夜操免费视频 | 一级黄色毛片播放 | 午夜精品在线播放 | 国产精品综合色区在线观看 | 26uuu最新地址 | 成人嘿嘿视频网站在线 | 鲁丝片一区二区三区免费 |