python——迭代器、列表解析、三元表示式
一.迭代器
1.迭代器協議和迭代器物件
(1)迭代器協議是指:
物件必須提供一個next方法,執行該方法要麼返回迭代中的下一項,要麼就引起一個Stoplteration異常,以終止迭代
(2)可迭代物件:
實現了迭代器協議的物件(如何實現:物件內部定義一個_iter_()方法)
(3)協議:
是一種約束,可迭代物件實現了迭代器協議,python的內部工具(如:for迴圈,sum,min函式等)使用迭代器協議訪問物件
2.標準的迭代器介面有兩個方法:
_iter_:返回self,以便在應該使用迭代器的地方使用迭代器,例如:for迴圈 _next_:返回下一個可用的元素,如果沒有元素了丟擲StopIteration異常
3.簡單來說:可迭代器
就是建立一個物件的類是否定義了_iter_()方法,如果定義了,那麼這個物件就是可迭代物件
4.可迭代物件和迭代器的區別:
可迭代物件有_iter_方法,每次都要例項化一個新的迭代器
迭代器要實現_next_和_iter_兩個方法,_next_用於獲取下一個元素,_iter_用於迭代器本身,所以迭代器可以迭代,但是可迭代物件不是迭代器
注:可迭代物件一定不能是自身的迭代器
案例:
list=[1,2,3,4,5] a_list=list.__iter__() #遵循迭代器協議,生成可迭代器 print(a_list.__next__()) #列印結果為1 print(a_list.__next__()) #列印結果為2 print(a_list.__next__()) #列印結果為3 print(a_list.__next__()) #列印結果為4 print(a_list.__next__()) #列印結果為5 print(a_list.__next__()) #報錯,超出了範圍 注:超出了list的範圍會報錯
二.生成器
1.理解生成器
可以理解為是一種資料型別,這種資料型別可以自動實現迭代器協議(其它的資料型別需要呼叫自己的內建的_iter_方法),所以生成器就是可迭代物件
2.生成器分類
(1)生成器函式:
常用函式定義,但是使用yield語句而不是return語句返回結果,yield語句一次返回一個結果,在每個結果中間,掛起函式的狀態,以便下次從它離開的地方繼續執行
(2)生成器表示式:
可以理解為列表推導的惰性版本,它的好處就是延時計算,不會直接構成列表,簡單來說就是一次返回一個結果,不是一次生成所有結果
3.生成器的優點:
使用生成器對延遲操作提供了支援。延遲操作是指需要的時候才產生結果,而不是立即產生結果,這就是生成器的好處
4.yield
概述:
yield關鍵字的核心用法,即逐個生成。在這裡獲取了兩個生成器產生的值,即0和1。分別由next函式和send()函式獲得
常用的三種方法:
生成器物件._next_() next(生成器物件) 生成器物件.send("從引數")
案例:
#使用yield特徵 def fun(): a = [1, 2, 3, 4] #定義一個a的列表 print("這是方法") yield a[2] #這裡我是通過下標來取得 text=fun() print(text) print(text.__next__()) #輸出結果為: #<generator object fun at 0x0000018795A7A200> #這是方法 #3
5.三元表示式
語法:
真值結果 if 判斷語法 else 假值結果
#案例:
name="lisi" name_list="名字正確" if name=="lisi" else "沒有這個人" #三元表示式,如果條件成立的情況下,這執行if前面的內容,如果條件不成立的,則執行else下的內容 print(name_list) #這裡結果為:“名字正確”
6.列表解析
案例:
#通過二元表示式來寫 list=["第%s次" %i for i in range(10)]#這是二元表示式 print(list) #結果為:['第0次', '第1次', '第2次', '第3次', '第4次', '第5次', '第6次', '第7次', '第8次', '第9次'] #通過三元表示式(第三元后面需要新增i>5的條件) list_s=["第%s次" %i for i in range(10) if i>5]#這是三元表示式,在第三元上新增i>5的條件 print(list_s) #結果為:['第6次', '第7次', '第8次', '第9次']
注:可以有二元表示式,沒有四元表示式
補充:
把列表解析的[]換成()得到的就是生成器表示式
列表解析與生成器表示式都是一種便利的程式設計方式,只不過生成器表示式更節約記憶體