(二)python高階特性
阿新 • • 發佈:2019-01-05
1.切片:(名字起得牛逼一點而已)
l = [1,2,3,4,5]
print(l[2:4]) #輸出l中從下標2到小標4的資料
2.迭代:
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
print(key)
當我們使用
for
迴圈時,只要作用於一個可迭代物件,for
迴圈就可以正常執行,而我們不太關心該物件究竟是list還是其他資料型別。
(1)如何判斷一個物件是可迭代物件呢?方法是通過collections模組的Iterable型別判斷:
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整數是否可迭代
False
(2)可以在
for
迴圈中同時迭代索引和元素本身:
>>> for i, value in enumerate(['A', 'B', 'C']):... print(i, value)...0 A1 B2 C
3.列表生成式:可以使得很多程式碼在一行中完成
>>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 還可以使用兩層迴圈,可以生成全排列: >>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ'] 一行程式碼列出當前資料夾中的檔案: print([d for d in os.listdir('.')]
4.生成器(generator)
當建立一個巨大的list時,不必建立完整的list,在Python中這種一邊迴圈一邊計算的機制節省大量的空間。
(1)
>>> L = [x * x for x in range(10)]>>> L[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]>>> g = (x * x for x in range(10))>>> g<generator object <genexpr> at 0x1022ef630>建立L和g的區別僅在於最外層的[]和(),L是一個list,而g是一個generator。
(2)
通過next()函式獲得generator的下一個返回值:generator儲存的是演算法,每次呼叫next(g),就計算出g的下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,丟擲StopIteration的錯誤。當然為了方便使用for迴圈讀取g的每個元素:>>> for n in g:print(n)(3)
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'以上是一個計算斐波那契數列的函式,其實這個函式是定義了斐波那契數列的演算法,於是可以將其轉化為generator。只需要將函式中的print(b) 換為 yield b即可。
def fib(max):n, a, b = 0, 0, 1while n < max:yield ba, b = b, a + bn = n + 1return 'done'這就是定義generator的另一種方法。如果一個函式定義中包含yield關鍵字,那麼這個函式就不再是一個普通函式,而是一個generator。
generator,在執行過程中,遇到yield就中斷,下次執行next()又在中斷處往後繼續執行。 使用for迴圈呼叫拿不到return語句,若想拿return必須捕獲StopIteration錯誤.
>>> g = fib(6)>>> while True:... try:... x = next(g)... print('g:', x)... except StopIteration as e:... print('Generator return value:', e.value)... break...g: 1g: 1g: 2g: 3g: 5g: 8Generator return value: done
5.迭代器:可以直接使用for進行迴圈的是Iterable,能使用next()是Iterator。
為啥使用iter()將list轉換為Iterator後得到的type是list_iterator,而且不能使用next()?