中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合99久久_国产亚洲精品日韩综合网

當(dāng)前位置: 首頁 / 技術(shù)干貨 / 正文
好程序員Python培訓(xùn)分享Python生成器與迭代器

2020-10-28

Python培訓(xùn)

  好程序員Python培訓(xùn)分享Python生成器與迭代器,Python生成器與迭代器對于喜歡Python開發(fā)的小伙伴們來說應(yīng)該是不陌生的,不了解的小伙伴也沒有關(guān)系,本篇文章好程序員Python培訓(xùn)小編就給小伙伴們詳解一下Python生成器與迭代器,感興趣的小伙伴就隨小編來了解一下吧。

 

列表生成式:

例一:

a = [i+1 for i in range(10)]

print(a)

輸出:

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

例二:

L = [1, 2, 3, 4, 5]

print([i*i for i in L if i>3])

好程序員

輸出:

[16, 25]

例三:

L = [1, 2, 3, 4, 5]

I = [6, 7, 8, 9, 10]

print([i*a for i in L for a in I if i > 2 if a < 8])

輸出:

[18, 21, 24, 28, 30, 35]

生成器:

通過列表生成式,我們可以直接創(chuàng)建一個列表。但是,受到內(nèi)存限制,列表容量肯定是有限的。而且,創(chuàng)建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那后面絕大多數(shù)元素占用的空間都白白浪費(fèi)了。

所以,如果列表元素可以按照某種算法推算出來,這樣就不必創(chuàng)建完整的list,從而節(jié)省大量的空間。在Python中,這種一邊循環(huán)一邊計算的機(jī)制,稱為生成器:generator

要創(chuàng)建一個generator,有很多種方法。diyi種方法很簡單,只要把一個列表生成式的[]改成(),就創(chuàng)建了一個generator

示例:

L = [1, 2, 3, 4, 5]

I = [6, 7, 8, 9, 10]

g = (i*a for i in L for a in I )

print(g)

輸出:

<generator object <genexpr> at 0x00000276586C1F48>

創(chuàng)建Lg的區(qū)別僅在于最外層的[]()L是一個list,而g是一個generator

我們可以直接打印出list的每一個元素,可以通過generatornext()方法

next(g)

例一:

L = [1, 2, 3, 4, 5]

I = [6, 7, 8, 9, 10]

g = (i*a for i in L for a in I )

print(next(g))

print(next(g))

print(next(g))

輸出:

6

7

8

例二:

L = [1, 2, 3, 4, 5]

I = [6, 7, 8, 9, 10]

g = (i*a for i in L for a in I if i > 2 if a < 8)

print(next(g))

print(next(g))

print(next(g))

輸出:

18

21

24

因?yàn)?/font>generator保存的是算法,每次調(diào)用next(g)就計算出g的下一個元素的值,直到計算到最后一個元素,沒有更多的元素時,拋出StopIteration的錯誤。正確的方法是使用for循環(huán),因?yàn)?/font>generator也是可迭代對象:

例三:

g = (i*i for i in range(0, 5))

for i in g:

    print(i)

當(dāng)我們創(chuàng)建了一個generator后,基本上永遠(yuǎn)不會調(diào)用next()方法,而是通過for循環(huán)來迭代它。

generator非常強(qiáng)大。如果推算的算法比較復(fù)雜,用類似列表生成式的for循環(huán)無法實(shí)現(xiàn)的時候,還可以用函數(shù)來實(shí)現(xiàn)。

比如,著名的斐波拉契數(shù)列(Fibonacci),除diyi個和第二個數(shù)外,任意一個數(shù)都可由前兩個數(shù)相加得到:

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

斐波拉契數(shù)列用列表生成式寫不出來,但是,用函數(shù)把它打印出來卻很容易:

def fib(max):

    n, a, b = 0, 0, 1

    while n < max:

        print b

        a, b = b, a + b

        n = n + 1

上面的函數(shù)可以輸出斐波那契數(shù)列的前N個數(shù):

>>> fib(6)

1

1

2

3

5

8

仔細(xì)觀察,可以看出,fib函數(shù)實(shí)際上是定義了斐波拉契數(shù)列的推算規(guī)則,可以從diyi個元素開始,推算出后續(xù)任意的元素,這種邏輯其實(shí)非常類似generator

也就是說,上面的函數(shù)和generator僅一步之遙。要把fib函數(shù)變成generator,只需要把print(b)改為yield b就可以了:

def fib(max):

  n,a,b = 0,0,1

  while n < max:

    #print(b)

    yield b

    a,b = b,a+b

    n += 1

  return 'done'

這就是定義generator的另一種方法。如果一個函數(shù)定義中包含yield關(guān)鍵字,那么這個函數(shù)就不再是一個普通函數(shù),而是一個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'

print(fib(5))

輸出:

<generator object fib at 0x0000023DC66C1F48>

調(diào)用方法:   ##但是用for循環(huán)調(diào)用generator時,\

            ##發(fā)現(xiàn)拿不到generatorreturn語句\

            ##的返回值。如果想要拿到返回值,必須捕獲StopIteration錯誤,返回值包含在StopIterationvalue中:

for i in fib(5):

    print(i)

輸出:

1

1

2

3

5

或者:

date = fib(5)

print(date.__next__())

print(date.__next__())

print(date.__next__())

print('test')

print(date.__next__())

print(date.__next__())

輸出:

1

1

2

test

3

5

send方法有一個參數(shù),該參數(shù)指定的是上一次被掛起的yield語句的返回值

還可通過yield實(shí)現(xiàn)在單線程的情況下實(shí)現(xiàn)并發(fā)運(yùn)算的效果

#_*_coding:utf-8_*_

__author__ = 'Alex Li'

import time

def consumer(name):

  print("%s 準(zhǔn)備吃包子啦!" %name)

  while True:

    baozi = yield

    print("包子[%s]來了,[%s]吃了!" %(baozi,name))

def producer(name):

  c = consumer('A')

  c2 = consumer('B')

  c.__next__()

  c2.__next__()

  print("老子開始準(zhǔn)備做包子啦!")

  for i in range(10):

    time.sleep(1)

    print("做了2個包子!")

    c.send(i)

    c2.send(i)

producer("alex")

通過生成器實(shí)現(xiàn)協(xié)程并行運(yùn)算

迭代器:

可以直接作用于for循環(huán)的數(shù)據(jù)類型有以下幾種:

一類是集合數(shù)據(jù)類型,如listtupledictsetstr等;

一類是generator,包括生成器和帶yieldgenerator function

這些可以直接作用于for循環(huán)的對象統(tǒng)稱為可迭代對象:Iterable

可以使用isinstance()判斷一個對象是否是Iterable對象:

>>> from collections import Iterable

>>> isinstance([], Iterable)

True

>>> isinstance({}, Iterable)

True

>>> isinstance('abc', Iterable)

True

>>> isinstance((x for x in range(10)), Iterable)

True

>>> isinstance(100, Iterable)

False

而生成器不但可以作用于for循環(huán),還可以被next()函數(shù)不斷調(diào)用并返回下一個值,直到最后拋出StopIteration錯誤表示無法繼續(xù)返回下一個值了。

*可以被next()函數(shù)調(diào)用并不斷返回下一個值的對象稱為迭代器:Iterator

可以使用isinstance()判斷一個對象是否是Iterator對象:

>>> from collections import Iterator

>>> isinstance((x for x in range(10)), Iterator)

True

>>> isinstance([], Iterator)

False

>>> isinstance({}, Iterator)

False

>>> isinstance('abc', Iterator)

False

生成器都是Iterator對象,但listdictstr雖然是Iterable,卻不是Iterator

listdictstrIterable變成Iterator可以使用iter()函數(shù):

>>> isinstance(iter([]), Iterator)

True

>>> isinstance(iter('abc'), Iterator)

True

為什么listdictstr等數(shù)據(jù)類型不是Iterator

這是因?yàn)?/font>PythonIterator對象表示的是一個數(shù)據(jù)流,Iterator對象可以被next()函數(shù)調(diào)用并不斷返回下一個數(shù)據(jù),直到?jīng)]有數(shù)據(jù)時拋出StopIteration錯誤。可以把這個數(shù)據(jù)流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數(shù)實(shí)現(xiàn)按需計算下一個數(shù)據(jù),所以Iterator的計算是惰性的,只有在需要返回下一個數(shù)據(jù)時它才會計算。

Iterator甚至可以表示一個無限大的數(shù)據(jù)流,例如全體自然數(shù)。而使用list是永遠(yuǎn)不可能存儲全體自然數(shù)的。

小結(jié):

凡是可作用于for循環(huán)的對象都是Iterable類型;

凡是可作用于next()函數(shù)的對象都是Iterator類型,它們表示一個惰性計算的序列;

集合數(shù)據(jù)類型如listdictstr等是Iterable但不是Iterator,不過可以通過iter()函數(shù)獲得一個Iterator對象。

Python3for循環(huán)本質(zhì)上就是通過不斷調(diào)用next()函數(shù)實(shí)現(xiàn)的,例如:

for x in [1, 2, 3, 4, 5]:

    pass

實(shí)際上完全等價于:

# 首先獲得Iterator對象:

it = iter([1, 2, 3, 4, 5])

# 循環(huán):

while True:

    try:

        # 獲得下一個值:

        x = next(it)

    except StopIteration:

        # 遇到StopIteration就退出循環(huán)

        break

最后想要了解更多關(guān)于Python和人工智能方面內(nèi)容的小伙伴,請關(guān)注好程序員Python培訓(xùn)官網(wǎng)、微信等平臺

好程序員公眾號

  • · 剖析行業(yè)發(fā)展趨勢
  • · 匯聚企業(yè)項(xiàng)目源碼

好程序員開班動態(tài)

More+
  • HTML5大前端 <高端班>

    開班時間:2021-04-12(深圳)

    開班盛況

    開班時間:2021-05-17(北京)

    開班盛況
  • 大數(shù)據(jù)+人工智能 <高端班>

    開班時間:2021-03-22(杭州)

    開班盛況

    開班時間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發(fā) <高端班>

    開班時間:2021-05-10(北京)

    開班盛況

    開班時間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數(shù)據(jù)分析 <高端班>

    開班時間:2021-07-12(北京)

    預(yù)約報名

    開班時間:2020-09-21(上海)

    開班盛況
  • 云計算開發(fā) <高端班>

    開班時間:2021-07-12(北京)

    預(yù)約報名

    開班時間:2019-07-22(北京)

    開班盛況

Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號-5 京公網(wǎng)安備 11010802035720號

中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合99久久_国产亚洲精品日韩综合网

            无码av免费一区二区三区试看 | 精品国产乱码久久久久久久久| 黄页网站大全一区二区| 国产精品美女久久久久av爽李琼| 91官网在线观看| 精品亚洲成a人| 一区二区三区在线免费| 精品女同一区二区| 欧美一区二区美女| 成人免费视频一区二区| 午夜精品久久久| 久久日一线二线三线suv| 91久久精品日日躁夜夜躁欧美| 精东粉嫩av免费一区二区三区| 亚洲丝袜自拍清纯另类| 精品伦理精品一区| 欧美日韩一级黄| 成人激情视频网站| 美女视频黄久久| 夜夜嗨av一区二区三区中文字幕| 26uuu亚洲综合色| 欧美日韩成人综合| 97se狠狠狠综合亚洲狠狠| 精品系列免费在线观看| 一区二区三区中文字幕电影 | 国产精品素人一区二区| 91精品国产色综合久久不卡蜜臀| 成人国产精品免费观看| 国产一区二区三区在线看麻豆 | 久久不见久久见免费视频1| 一区二区三区中文免费| 日本一区二区综合亚洲| 日韩欧美自拍偷拍| 884aa四虎影成人精品一区| 日本韩国一区二区三区视频| 国产不卡在线一区| 国产在线观看一区二区| 久久99深爱久久99精品| 日韩二区在线观看| 亚洲va欧美va人人爽| 亚洲精品视频自拍| ...xxx性欧美| 国产精品久久久久久亚洲毛片| 久久亚洲综合色| 精品国产人成亚洲区| 日韩欧美国产麻豆| 91精品在线免费| 91精品国模一区二区三区| 欧美乱妇一区二区三区不卡视频 | 欧美一级欧美三级在线观看| 国产精品久久久久毛片软件| 久久综合色天天久久综合图片| 日韩网站在线看片你懂的| 欧美一区二区三区色| 91精品久久久久久久99蜜桃| 在线播放日韩导航| 欧美一二区视频| 精品少妇一区二区三区在线视频| 欧美一级夜夜爽| 精品少妇一区二区三区| 久久嫩草精品久久久精品一| 精品国产露脸精彩对白| 国产欧美日韩在线看| 国产精品护士白丝一区av| 亚洲品质自拍视频| 亚洲综合小说图片| 婷婷开心久久网| 久久99在线观看| 国产精品1024| 91亚洲国产成人精品一区二区三| 色综合中文字幕国产| 欧美日韩国产一二三| 日韩精品综合一本久道在线视频| 久久香蕉国产线看观看99| 国产精品国产三级国产aⅴ原创 | 国产成人免费高清| 91在线高清观看| 欧美精三区欧美精三区| 337p日本欧洲亚洲大胆精品| 国产精品久久综合| 亚洲成人福利片| 紧缚捆绑精品一区二区| 99久免费精品视频在线观看| 欧美影片第一页| 欧美成人官网二区| 国产精品久久久久一区二区三区共| 亚洲精品国产一区二区三区四区在线| 午夜不卡在线视频| 久久精品国产精品亚洲综合| 国产成人无遮挡在线视频| 欧美影视一区二区三区| 久久综合久久99| 亚洲精品视频一区| 国内精品写真在线观看| 色狠狠桃花综合| 欧美电视剧在线看免费| 亚洲视频在线一区| 久久99久久精品欧美| 91欧美一区二区| 精品久久人人做人人爱| 一区二区三区精品在线| 久久电影网电视剧免费观看| 日本高清成人免费播放| 久久综合国产精品| 亚洲综合免费观看高清完整版| 国产一区二区精品在线观看| 精品视频123区在线观看| 欧美国产精品一区二区| 色婷婷久久久综合中文字幕| 26uuu亚洲| 午夜欧美电影在线观看| 91麻豆免费视频| 久久久影视传媒| 男女性色大片免费观看一区二区| 99精品国产91久久久久久| 精品国产精品一区二区夜夜嗨| 亚洲国产成人精品视频| av高清久久久| 国产亚洲精品中文字幕| 热久久久久久久| 欧美三级中文字幕| 亚洲欧美另类在线| 大尺度一区二区| 久久久久久99久久久精品网站| 琪琪久久久久日韩精品| 欧美视频一区二区| 一区二区视频在线看| 91在线国产观看| 欧美激情一区二区三区不卡| 国产综合成人久久大片91| 欧美一区二区三区人| 日韩精品欧美精品| 欧美日本在线播放| 午夜精品aaa| 欧美日韩国产一级二级| 亚洲国产一区二区视频| 欧美在线影院一区二区| 一级中文字幕一区二区| 日本高清视频一区二区| 一区二区久久久久| 日本道在线观看一区二区| 亚洲欧美另类在线| 欧美最新大片在线看| 悠悠色在线精品| 色狠狠综合天天综合综合| 亚洲精品一二三| 欧美系列一区二区| 亚洲地区一二三色| 欧美肥妇free| 蜜臀久久99精品久久久久宅男 | 欧美一区二区三区系列电影| 视频一区二区欧美| 日韩午夜激情视频| 国内精品视频一区二区三区八戒| 精品国产污网站| 国产成人av影院| 1区2区3区欧美| 欧美三级欧美一级| 天天综合网 天天综合色| 欧美一级黄色片| 国模一区二区三区白浆| 中文字幕精品在线不卡| 99国内精品久久| 亚洲第一主播视频| 精品国产污网站| av电影一区二区| 亚洲一区电影777| 日韩一级免费一区| 国产精品一级黄| 亚洲免费观看高清| 欧美一区二区三区喷汁尤物| 极品少妇xxxx精品少妇偷拍| 国产精品国产三级国产普通话蜜臀 | 欧美浪妇xxxx高跟鞋交| 另类欧美日韩国产在线| 国产日产欧产精品推荐色| 91美女在线看| 日本不卡高清视频| 国产精品乱码妇女bbbb| 欧美图片一区二区三区| 69久久99精品久久久久婷婷 | 国产精品高清亚洲| 欧美性做爰猛烈叫床潮| 精品制服美女久久| 亚洲天堂成人网| 欧美日本乱大交xxxxx| 国产激情视频一区二区三区欧美| 亚洲色图欧美在线| 精品区一区二区| 色综合久久综合网欧美综合网| 美腿丝袜一区二区三区| 国产精品每日更新在线播放网址| 欧美日韩在线播放三区| 国产高清成人在线| 日韩黄色小视频| 国产精品国产三级国产aⅴ原创| 91精品国产欧美一区二区成人 | 亚洲电影视频在线| 亚洲国产精品t66y| 日韩精品一区二区在线|