迭代器 可迭代物件 迭代器物件

2022-08-23 07:51:12 字數 3915 閱讀 5946

今天的學習內容有:

迭代器、可迭代物件、迭代器物件

for迴圈內部原理

生成器和生成器表示式

面向過程程式設計

迭代就是指更新換代的過程,要重複進行,而且每次的迭代都必須基於上一次的結果。

我們使用for迴圈的時候就是把元素從容器裡乙個個取出來,這種過程其實就是迭代。

迭代器:迭代取值的工具。

迭代器的作用是提供給你一種不依賴索引取值的方式。

需要迭代取值的資料型別有:字串、列表、元組、字典、集合

內建有__iter__方法的都可以叫可迭代物件

基本型別中是可迭代物件的有str、list、tuple、dict、set、檔案物件

檔案物件本身就是迭代器物件(所以檔案物件執行內建的__iter__之後還是本身,沒有任何變化)

s = '

hello

'l = [1,2,34,]

t = (1,2,34)

s1 =

d =

res = s.__iter__

()res1=l.__iter__

()res2=t.__iter__

()res3=s1.__iter__

()res4=d.__iter__()

可迭代物件執行內建的__iter__方法得到就是該物件的迭代器物件。

1.內建有__iter__方法

2.內建有__next__方法

補充:迭代器一定是可迭代物件,可迭代物件不一定是迭代器。

l=[1,2,3,4]

iter_l=l.__iter__() # 用__iter__將可迭代物件轉換成乙個迭代器物件

print(iter_l.__next__()) # 迭代器取值,呼叫__next__

print(iter_l.__next__()) # 呼叫一次取乙個

print(iter_l.__next__())

print(iter_l.__next__())

print(iter_l.__next__()) # 如果取完了直接報錯stopiteration

迭代器物件無論執行多少次__iter__方法得到的還是迭代器物件本身。

關於異常處理機制

d = 

iter_d = d.__iter__() # 將字典變成迭代器物件

while true:

try:

print(iter_d.__next__()) # 迴圈取值

except stopiteration: # 異常處理,當出現的異常和你在except後面寫的一樣時則繼續執行下面的**

print('取完了'

break

迭代器取值的特點:只能依次向後取,不能後退。

d = 

for i in d:

print(i)

# for 迴圈後面的in跟的是乙個可迭代物件

for迴圈內部的本質:

1、將in後面的物件呼叫__iter__轉換成迭代器

2、呼叫__next__迭代取值

3、內部有異常捕獲stopiteration,當__next__報這個錯,自動迴圈結束

問:__iter__方法就是用來幫我們生成迭代器物件,而檔案物件本身就是迭代器物件,為什麼還內建有__iter__方法???

#總結#

可迭代物件:內建有__iter__方法的

#迭代器物件:既內建有__iter__也內建有__next__方法

#優點:1、不依賴索引取值

#2、記憶體中永遠只佔乙份空間,不會導致記憶體溢位

#缺點:1、不能獲取指定的元素

#2、取完之後會報stopiteration錯

本質就是迭代器,是使用者自定義的迭代器

def func():

print('first')

yield 666 # yield後面跟的值就是呼叫迭代器__next__方法你能得到的值

print('second')

yield 777,888,999 # yield既可以返回乙個值也可以返回多個值 並且多個值也是按照元組的形式返回

yield

# 函式內如果有yield關鍵字,那麼加括號執行函式的時候並不會觸發函式體**的執行

g=func() # 生成器初始化:將函式變成迭代器

print(g.__next__()) # 輸出為666

print(g.__next__()) # 輸出為(777, 888, 999)

print(g.__next__()) # 輸出為none

當函式內有yield關鍵字的時候,呼叫該函式不會執行函式體**,而是將函式變成生成器。

生成器函式:常規函式定義,但是,使用yield語句,而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,是掛起函式的狀態,也就是下次可以接著這裡執行。

#

yield

#1.幫你提供了一種自定義生成器方式

#2.會幫你將函式的執行狀態暫停住

#3.可以返回值

#與return之間異同點

#相同點:都可以返回值,並且都可以返回多個

#不同點:

#yield可以返回多次值,而return只能返回一次函式立即結束

#yield還可以接受外部傳入的值

#

yield支援外界為其傳參

defdog(name):

print('

%s 準備開吃

'%name)

while

true:

food = yield

print('

%s 吃了 %s

'%(name,food))

g = dog('

egon')

g.__next__() #

必須先將**執行至yield 才能夠為其傳值

g.send('

狗不理包子

') #

給yield左邊的變數傳參 觸發了__next__方法

g.send('餃子'

)>>>:egon 準備開吃

egon 吃了 狗不理包子

egon 吃了 餃子

res = (i for i in range(1,10) if i != 4)  #

生成器表示式

print

(res)

print(res.__next__

())print(res.__next__

())print(res.__next__

())print(res.__next__

())#

#把列表解析的換成()得到的就是生成器表示式

不呼叫__next__方法 生成器內部**一句都不會執行

生成器表示式通常用在獲取較大容器型別資料的時候

#

自定義range功能

def my_range(start, end, step=1):

while start yield

start

start += step

面向過程程式設計:就類似於設計一條流水線

好處:將複雜的問題流程化 從而簡單化

壞處:可擴充套件性較差 一旦需要修改 整體都會受到影響

物件 可迭代物件 迭代器

本節是對可迭代物件和迭代器的簡單總結,希望對大家有幫助。對於乙個初級選手而言,了解即可,不過這對大家以後高階可能會有一定的幫助。悅分享,越快樂。我們一起成長。哈啊哈哈。物件,乙個實實在在存在的值 可迭代 更新迭代,迴圈的乙個過程,每乙個內容都是新的 可迭代物件 可以進行迴圈更新的乙個實實在在的值。專...

可迭代物件 迭代器

一 可以直接作用於for迴圈的資料型別 1.可迭代物件 iterable 1 整合資料型別 list tuple dict set str 2 生成器 generator 3 帶yield的generator函式 2.迭代器 iterator 可以被next 函式呼叫並不斷返回下乙個值的物件。二 如...

可迭代物件與迭代器物件

li 1,4,5,2 for x in li print x s zxcvb for x in s print x 確保in後面是乙個可迭代物件,可通過python 內建函式iter 得到乙個迭代器物件。用可迭代物件得到迭代器 使用標準庫下的itertools.islice,它能返回乙個迭代物件切片...