Python學習筆記——高階特性
繼續之前的學習,下面是一些高階特性。
1. 切片
取指定索引範圍的操作,可以通過切片(slice)來實現。
如L[0:3]表示從列表索引0開始,到索引3(但不包含)的子集。
如果第一個索引是0,可以省略,如L[:3]。
Python也支援倒數切片,如L[-2:],L[-2:-1]。
切片還有第三個引數,表示每隔xx個取一個,如L[::5]表示每5個取一個。
如果都省略,則可以複製一個列表出來,如L[:]。
tuple同樣也可以進行切片操作,不過結果是tuple。
字串也可以進行切片操作,結果是字串。
2. 迭代
Python可以通過for...in來迭代可迭代的物件。
對於dict,預設是遍歷key,如果要遍歷value,可以用for value in dict.values();如果要同時遍歷,可以用for key, value in dict.items()。
可通過collections模組的Iterable型別來判斷是否可以迭代,使用方法如下:
from collections import Iterable
isinstance('abc', Iterable)
如果想像Java那樣對list按下標進行遍歷,可以使用enumerate函式,如下:
for i, value in enumerate(['a', 'b', 'c']):
print(i, value)
3. 列表生成式
寫列表生成式式,把要生成的元素放前面,後面跟for迴圈,還可以加上if判斷,甚至多層for迴圈。
比如下面的例子:
[x * x for x in range(1, 11)] # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] [x * x for x in range(1, 11) if x % 2 == 0] # [4, 16, 36, 64, 100] [m + n for m in 'ABC' for n in 'XYZ'] # ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
有了列表生成式,程式碼可以寫的很簡潔,比如輸出當前目錄下的所有檔案和目錄名:
import os
[d for d in os.listdir('.')]
4. 生成器
一邊迴圈一邊計算的機制。
第一種方法:把列表生成式的[]改成()。
g = (x * x for x in range(1, 11))
第二種方法:使用yield關鍵字。
生成器和函式的執行流程不一樣,生成器在每次呼叫next()時執行,遇到yield語句返回,再次執行時從上次返回的yield語句處再次執行。
def odd(): yield 1 yield 3 yield 5 o = odd() next(o) # 1 next(o) # 3 next(o) # 5
使用for迴圈呼叫生成器時,是拿不到返回值的。如果想拿到返回值,必須捕獲StopIteration錯誤,返回值包含在StopIteration的value中,如下:
while True:
try:
next(g)
except StopIteration as e:
print(e.value)
break
楊輝三角的實現方式:
def triangle():
L = [1]
while True:
yield L
L = [1] + [L[m] + L[m+1] for m in range(0, len(L)-1)] + [1]
n = 0
for t in triangles():
print(t)
n = n + 1
if n == 10:
break
# 輸出
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
5. 迭代器
可以直接作用於for迴圈的物件稱為可迭代物件:Iterable,可以使用isinstance()判斷一個物件是否是Iterable物件。
from collections import Iterable
isinstance('a', Iterable)
# True
可以被next()函式呼叫並不斷返回下一個值得物件稱為迭代器:Iterator,可以使用isinstance()判斷一個物件是否是Iterator物件。
from collections import Iterator
isinstance('a', Iterator)
# False
將list、dict、str等Iterable變為Iterator可以使用iter()。
Iterator的計算是惰性的,只有在需要返回下一個資料的時候才進行計算。