Python檔案袋(生成器 迭代器 佇列

2022-01-09 21:30:05 字數 2952 閱讀 3294

簡單的生成器實現:

1

#生成器,將for迴圈的變數傳遞到前面的式子進行處理2#

生成的並不是乙個列表,而是乙個存在算數規則的物件3#

不能通過下標直接取值,必須乙個乙個從頭到尾取

4 va=(i*2 for i in range(10))

5print

(va)67

#呼叫下乙個,只記住當前位置,相當於有乙個游標,只能向下

8print(va.__next__()) #

輸出:0

9print(va.__next__()) #

輸出:2

1011

#變數生成器

12for i in

va:13

print(i) #

輸出:#4 6 8 10 12 14 16 18

生成器高階:

1

deffunx1(max):

2 m,x,y=0,0,1

3while mprint(y) #1 1 2 3 5 8 13 21 34 55

5yield y #

生成器輸出,使用for迴圈或者next方法才會輸出

6 x,y=y,(x+y)

7 m+=189

#普通呼叫10#

funx1(10)

1112

#生成器呼叫

13 funx=funx1(10)

14print(funx.__next__

())15

print("

----- 可輸出 ------")

16print("

取值方法1:

",funx.__next__

())17

print("

取值方法2:

",next(funx))

生成器傳送資料:

1

deffunx1():

2while true: #

如果不寫則啟動就結束了,不能繼續發資料

3 res=yield

4print("

獲取的結果:

",res)56

#生成器呼叫

7 funx=funx1()

8 funx.send(none) #

必須先啟動生成器,無輸出,也可以使用funx.__next__()

9 funx.send("

------

") #

傳送資料,輸出:獲取的結果: ------

10 funx.send("

******

") #

輸出:獲取的結果: ******

表示乙個資料流,可以無限大

可使用for迴圈的物件都是可迭代物件,如字串、列表、字典等,可使用next(物件)的物件都是迭代器物件

可迭代物件可以通過iter方法變成迭代器物件

1 strx="

abcdefghigk"2

3#轉換為迭代器

4 va=iter(strx)56

print(next(va)) #

輸出:a

7print(next(va)) #

輸出:b

可自定義先入先出還是後人先出,資料一經取出就在佇列裡自動去除

1

import

queue23

#先進先出4#

qlistx=queue.queue(maxsize=5) #生成例項,引數maxsize表示最大數量,超過則阻塞,等待頭取出5#

qlistx=queue.queue() #生成例項67

#後進先出

8 qlistx=queue.lifoqueue() #

生成例項910

11#設定資料方法一12#

佇列滿則阻塞等待

13 qlistx.put("

1111111")

14 qlistx.put("

2222222")

1516

#設定資料方法二17#

超時則報異常

18 qlistx.put("

333333

",timeout=1)

1920

print(qlistx.qsize()) #

輸出列表大小

2122

#取資料方法一23#

如果取到最後沒有資料,將會一直處於阻塞

24print

(qlistx.get())

25print

(qlistx.get())

2627

#取值方法二28#

設定超時時間,超時則報異常

29print(qlistx.get(timeout=1))

303132#

取資料方法三33#

無資料不進行阻塞,如果無資料則報異常34#

print(qlistx.get_nowait())

優先順序訪問值:

值越小則優先順序越高,實現高優先順序最先取出

import

queue

qlistx=queue.priorityqueue() #

生成例項

qlistx.put((1,"

1111111"))

qlistx.put((-1,"

2222222"))

qlistx.put((100,"

99999999"))

print(qlistx.get()) #

輸出:(-1, '2222222')

print(qlistx.get()) #

輸出:(1, '1111111')

Python 迭代器 生成器

可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...

python 迭代器,生成器

什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...

python 迭代器 生成器

知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...