1. 程式人生 > 實用技巧 >python——迭代器、列表解析、三元表示式

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次']

  

注:可以有二元表示式,沒有四元表示式

補充:
把列表解析的[]換成()得到的就是生成器表示式
列表解析與生成器表示式都是一種便利的程式設計方式,只不過生成器表示式更節約記憶體