Python(4)高階特性 總結
阿新 • • 發佈:2018-12-31
Python中很多常見語法可以使程式更加簡潔易讀,這裡我們介紹5個例子:切片、迭代、列表生成器、生成器、迭代器
1.切片(slice)
切片用於取list tuple中部分元素,通過下標索引,只需標出想得到的第一個元素下標和最後一個元素
- L[a:b] 從a開始取,到(b-1)為止,取(a-b)個元素
- 若a=0,則可以省略L[:b]
- 支援倒數切片。L[-a:-b],從倒數第a開始取,到倒輸(b+1)為止,取(a-b)個元素; L[-a:], 從倒數第a開始取,到最後一個元素為止,取a個元素
- L[:]複製原list或tuple
- 支援跳著取元素,例如前10個數,每兩個取一個:L[:10:2] ;所有數,每5個取一個:L[::5]
- 字串可以看作是list,也支援切片
- tuple不可變,切片後得到型別仍是tuple,但是是一個新的tuple,原tuple不變
2.迭代
迭代指通過for ... in遍歷整個list或tuple
- 任何可迭代物件都可以作用於
for
迴圈 - 可直接用for迴圈的有兩類:一類是集合資料型別,如
list
、tuple
、dict
、set
、str
等; 一類是generator
- dict的儲存不是按照list的方式順序排列,所以,迭代出的結果順序很可能不一樣。
- 預設情況下,dict迭代的是key。 迭代value : for value in d.values() 同時迭代key和value : for k,v in d.items()
- list可以通過enumerate函式變成索引-函式對 for i, value in enumerate(['A', 'B', 'C'])
- 可以用collections模組的Iterable型別判斷是否為可迭代物件 from collections import Iterable isinstance('abc' , Iterable)
- for 迴圈可以同時引用兩個變數
3.列表生成器
- list( range(1,11) )
- [x*x for x in range (1,11)]
- [x*x for x in range (1,11) if x%2 ==0]
- [m+n for m in 'abc' for n in '123']
4.生成器(generator)
列表裡的元素事先並不知道,需要通過迴圈不斷推算出後一個元素
- 與列表生成式相同用法,只需要把[]改成()即可,就從list變成generator
- 生成器計算到最後一個元素,沒有更多元素時丟擲StopIneration錯誤
- 一般用for迴圈得到後面元素,但是演算法複雜時也可以通過函式實現
- 函式定義中含有yield關鍵字即為generator
- generator函式遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行,即,generator函式一般在for迴圈中呼叫
- 如果想得到generator函式的返回值,,必須捕獲
StopIteration
錯誤,返回值包含在StopIteration
的value
5.迭代器(Iterator)
Iterator物件可以被next()
函式呼叫並不斷返回下一個資料,直到沒有資料時丟擲StopIteration
錯誤。可以把這個資料流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函式實現按需計算下一個資料,
- 可以直接作用於
for
迴圈的物件統稱為可迭代物件:Iterable
。可以使用isinstance()
判斷一個物件是否是Iterable
物件 - 可以被
next()
函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator。
可以使用isinstance()
判斷一個物件是否是Iterator
物件 - 生成器都是
Iterator
物件,但list
、dict
、str
雖然是Iterable
,卻不是Iterator
。 - 把
list
、dict
、str
等Iterable
變成Iterator
可以使用iter()
函式