迭代器,生成器

2021-10-14 10:19:27 字數 3979 閱讀 7028

# 什麼是迭代器

指的是迭代取值的工具,迭代是乙個重複的過程,每次重複取值都是基於上一次的結果繼續的,單純的重複並不是迭代

while

true

:# 只是單純的循壞

for x in

range(5

):# 迭代

# 為何要有迭代器

可以迭代取值任意的值

1.字典不可以索引取值,但是可以for取值(無循序)

2.列表可以索引取值,常見的都是可以通過索引取值(有順序)

3.基礎資料型別的有序無序,python直譯器提供一種迭代器取值

#如何使用迭代器

1.只要內建有__iter__,都可以迭代是物件

str=

'sun'

str.__iter__(

)# 可迭代物件

lis =[1

,2]lis.__iter__(

)tu =(1

,2,3

)tu.__iter__(

)dic =

dic.__iter__(

)set

=set

.__iter__(

)with

open

(r'a.txt'

,mode=

'rt'

,encoding=

'utf-8'

)as f:

f.__iter__(

)# 呼叫迭代物件__iter__可生成乙個迭代器

dic =

new = dic.__iter__(

)print

(new.__next__())

print

(new.__next__())

print

(new.__next__())

abc# 可迭代物件(__iter__()):字串,列表,元組,字典,集合,檔案物件

#迭代器物件(__next__()):檔案物件

# 'aaa'.__len__() == len('aaa')

# g.__iter__() == iter(g)

# g.__next__() == next(g)

# 總結

優點: 1

.提供了一種不靠索引取值的通用迭代取值的方法

2.惰性計算,節省記憶體

缺點: 1

.取值麻煩

2.無法**值的長度

3.一次性

# 迭代器對同乙個物件取值,如果第一次被取完,那麼第二次就直接跳stopiteration,取不到值

dic =

d = dic.__iter__(

)while

true

:try

:print

(d.__next__())

except stopiteration

break

print

('******************************'

)while

true

:try

:print

(d.__next__())

except stopiteration

break12

3======

====

====

====

====

====

====

====

=# 第一次迭代完,第二次就娶不到字典中的key值

# for 也叫迭代迴圈

d =1.d.__iter__(

)得到乙個迭代器物件

2.迭代器物件.__next__(

)拿到乙個返回值,然後將該返回值賦值給k

3.迴圈往復步驟2,知道丟擲stopiteration異常,for迴圈會捕捉異常然後結束迴圈

for k in d:

print

(k)

# 生成器----》自定義迭代器

# 如何得到自定義的迭代器 yield

# 在函式內一旦存在yield關鍵字,呼叫函式並不會執行函式體**

# 返回乙個生成器物件,生成器即自定義迭代器

deffunc()

:print

('第一次'

)yield

1print

('第二次'

)yield

2print

('第三次'

)yield

3print

('第四次'

)g = func(

)# 生成器就是迭代器

# g.__iter__()

# g.__next__()

res1 =

next

(g)# 會觸發函式體**的執行,然後遇到yield停下來,將yield後的值當作本次呼叫的返回值返回結果

print(res1)

# yield 就是g.send()送來的變數值

defdog

(name)

:print

('{}準備吃食物啦'

.format

(name)

)while

true

: x =

yield

# x = '雞腿'

print

('{}吃了{}'

.format

(name, x)

)g = dog(

'egon'

)g.send(

none

)# 第一次執行生成器必須傳值,不然報錯 或者 輸入 next(g)

g.send(

'雞腿'

) g.close(

)# 關閉生成器以後不能使用了

# yield + 返回值 + 傳參

defdog

(name)

: new_list =

print

('{}準備吃食物啦'

.format

(name)

)while

true

: x =

yield new_list # x = '雞腿' res = new_list

print

('{}吃了{}'

.format

(name, x)

)return new_list

g = dog(

'egon'

)g.send(

none

)res = g.send(

'雞腿'

)print

(res)

# 無窮給值的迭代器

deffunc

(start, stop, step=1)

:while

true

:print

('start.....'

)if start < stop:

start += step

yield start

print

('end......'

)

g = func(1,

20)res1 = g.__next__(

)print

(res1)

res2 = g.__next__(

)print

(res2)

start...

..2end...

...start...

..3

# 生成器生成的倆種方式

1. 函式 +

yield

2.res =

(x for x in

range(10

))

生成器 迭代器

最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...

迭代器,生成器

迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...

迭代器 生成器

迭代器 iter 可迭代物件 下乙個元素的值 next 可迭代物件 類中實現 iter 方法 提供迭代器 實現迭代器 import time class mylistiter object 迭代器類 def init self,data self.data data self.index 0 def...