函式 (四) 迭代器和生成器

2022-07-04 04:27:08 字數 2575 閱讀 5840

#迭代器即迭代的工具,那什麼是迭代呢?

#迭代是乙個重複的過程,每次重複即一次迭代,並且每次迭代的結果都是下一次迭代的初始值

while true: #只是單純地重複,因而不是迭代

print('===>')

l=[1,2,3]

count=0

while count < len(l): #迭代

print(l[count])

count+=1

1

#1、為何要有迭代器?

2對於序列型別:字串、列表、元組,我們可以使用索引的方式迭代取出其包含的元素。但對於字典、集合、檔案等型別是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴於索引的迭代方式,這就是迭代器34

#2、什麼是可迭代物件?

5 可迭代物件指的是內建有__iter__方法的物件,即obj.__iter__

,如下6

'hello

'.__iter__

7 (1,2,3).__iter__

8 [1,2,3].__iter__

9 .__iter__

10 .__iter__

11 open('

a.txt

').__iter__

1213

#3、什麼是迭代器物件?

14 可迭代物件執行obj.__iter__

()得到的結果就是迭代器物件

15而迭代器物件指的是即內建有__iter__又內建有__next__方法的物件

1617

檔案型別是迭代器物件

18 open('

a.txt

').__iter__

()19 open('

a.txt

').__next__

()20

2122

#4、注意:

23 迭代器物件一定是可迭代物件,而可迭代物件不一定是迭代器物件

1 dic=

2 iter_dic=dic.__iter__() #

得到迭代器物件,迭代器物件即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身

3 iter_dic.__iter__() is iter_dic #

true45

print(iter_dic.__next__()) #

等同於next(iter_dic)

6print(iter_dic.__next__()) #

等同於next(iter_dic)

7print(iter_dic.__next__()) #

等同於next(iter_dic)8#

print(iter_dic.__next__()) #丟擲異常stopiteration,或者說結束標誌910

#有了迭代器,我們就可以不依賴索引迭代取值了

11 iter_dic=dic.__iter__

()12

while 1:

13try

:14 k=next(iter_dic)

15print

(dic[k])

16except

stopiteration:

17break

1819

#這麼寫太醜陋了,需要我們自己捕捉異常,控制next,python這麼牛逼,能不能幫我解決呢?能,請看for迴圈

#基於for迴圈,我們可以完全不再依賴索引去取值了

dic=

for k in dic:

print(dic[k])

#for迴圈的工作原理

#1:執行in後物件的dic.__iter__()方法,得到乙個迭代器物件iter_dic

#2: 執行next(iter_dic),將得到的值賦值給k,然後執行迴圈體**

#3: 重複過程2,直到捕捉到異常stopiteration,結束迴圈

#優點:

- 提供一種統一的、不依賴於索引的迭代方式

- 惰性計算,節省記憶體

#缺點:

- 無法獲取長度(只有在next完畢才知道到底有幾個值)

- 一次性的,只能往後走,不能往前退

#只要函式內部包含有yield關鍵字,那麼函式名()的到的結果就是生成器,並且不會執行函式內部**

def func():

print('====>first')

yield 1

print('====>second')

yield 2

print('====>third')

yield 3

print('====>end')

g=func()

print(g) #

g.__iter__

g.__next__

#2、所以生成器就是迭代器,因此可以這麼取值

res=next(g)

print(res)

函式 生成器 迭代器

1.函式 1 函式的好處就是能將固定功能的模組封裝起來,在需要多次實現這個功能的時候就呼叫函式避免 的重複書寫,過於冗長 2 傳參 依次往後放這是規定 num,args,a 2,kwargs 中間兩個交換位置不影響 位置引數 引數關鍵字引數 引數 3 返回值函式執行沒遇到return返回值一定為no...

生成器和迭代器

可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...

迭代器和生成器

1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...