迭代器
迭代器協議是指:對象必須提供一個next方法,執行該方法要麼返回迭代中的下一項,要麼就引發一個Stoplteration異常,以終止迭代(只能日後走不能往前退)javascript
實現了迭代器協議的對象(對象內部定義了一個__iter__()方法)java
python中的內部工具(如for循環,sum,min,max函數等)基於迭代器協議訪問對象。python

1 #基於迭代器協議 2 li = [1,2,3] 3 diedai_l = li.__iter__() 4 print(diedai_l.__next__()) 5 print(diedai_l.__next__()) 6 print(diedai_l.__next__()) 7 # print(diedai_l.__next__()) # 超出邊界報錯 8 9 #下標 10 print(li[0]) 11 print(li[1]) 12 print(li[2]) 13 # print(li[3]) # 超出邊境報錯 14 15 # 用while循環模擬for循環機制 16 diedai_l = li.__iter__() 17 while True: 18 try: 19 print(diedai_l.__next__()) 20 except StopIteration: 21 print("迭代完畢,循環終止") 22 break 23 24 # for循環訪問方式 25 # for循環本質就是遵循迭代器協議的訪問方式,先調用diedai_l=li.__iter__方法 26 # 或者直接diedai_l=iter(l),而後依次執行diedai_l.__next__(),直到捕捉到 27 # StopItearation終止循環 28 # for循環全部的對象的本質都是同樣的原理
生成器
能夠理解爲一種數據類型,自動實現迭代器協議ide
在調用生成器運行的過程當中,每次遇到yield時函數會暫停並保存當前全部的運行信息,返回yield的值。並在下一次執行next()方法時從當前位置繼續運行函數
表現形式工具
一、生成器函數 帶yield的函數(一、返回值 二、保留函數的運行狀態) post
next(t) t.__next__ t.send(能夠給上一層的yield傳值)this
# 用生成器函數 # yield 至關於return控制的是函數的返回值 # x=yield的另一個特性,接收send傳過來的值,賦值給x def test(): print("開始啦") first = yield # return 1 first = None print("第一次",first) yield 2 print("第二次") t = test() print(test().__next__()) res = t.__next__() # next(t) print(res) res = t.send("函數停留在first那個位置,我就是給first賦值的") print(res) 輸出結果 開始啦 None 開始啦 None 第一次 函數停留在first那個位置,我就是給first賦值的 2
二、生成器表達式 spa
print(sum(i for i in range(10000))) # 表達式通常用for循環 (i for i in range(10000))
# 做用 節省內存,在內部已經實現了__iter__的方法
列表解析(生成了一個列表)
1 print([i for i in range(10)]) # 生成一個列表
三元表達式(沒有四元表達式,能夠有二元)
1
2
3
4
5
6
7
|
name
=
"alex"
print
(
"sb"
if
name
=
=
"alex"
else
"帥哥"
)
# if name == "alex"爲一元 "sb" 爲二元 else "帥哥"爲三元
輸出
sb
|