1. 程式人生 > >(二)python高階特性

(二)python高階特性

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 A
1 B
2 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, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return '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: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done

5.迭代器:可以直接使用for進行迴圈的是Iterable,能使用next()是Iterator。

為啥使用iter()將list轉換為Iterator後得到的type是list_iterator,而且不能使用next()?