今天的學習內容有:
迭代器、可迭代物件、迭代器物件
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) #生成器表示式
(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,它能返回乙個迭代物件切片...