天天看點

Python随筆(六)

Python進階特性:

切片:取一個list或tuple的部分元素

l = [1,2,3,4,5,6,7,8,9,10]
print(l[:3])      # 輸出從0-2,三個元素
>>>[1,2,3]

print(l[-1])      #取倒數第一個元素
>>>[10]

print(l[-2:])     #取倒數兩個元素
>>>[9,10]

print(l[:6:2])     #取前六個元素,每兩個選一個
>>>[1,3,5]

print(l[::3])       #取全部元素,每三個選一個
>>>[1,4,7,10]

print(l[:])        #可以原樣複制一個list
>>>[1,2,3,4,5,6,7,8,9,10]
           

疊代:通過for循環來周遊這個list或tuple,這種周遊叫做疊代

如果要對list或者tuple實作類似java那樣的下标循環,可以使用Python内置的enumerate函數,可以把一個list程式設計索引-元素對:

for i,vaule in enumerate(['A','B','C']):
    print(1,vaule)

>>> 0 A
>>> 1 B
>>> 2 C
           

清單生成器:

l = [x*x for x in range(1,11)]
print(l)
>>> [1,4,9,16,25,36,49,64,81,100]

l = [x*x for x in range(1,11) if x%2 == 0]
print(l)
>>> [4,16,36,64,100]

l = [m + n for m in 'ABC' for n in 'XYZ']
print(l)
>>> ['AX','AY','AZ','BX','BY','BZ','CX','CY','CZ']

#列出目前目錄下所有檔案和目錄名
import os #導入os子產品
l = [d for d in os.listdir('.')]  #os.listdir 可以列出所有檔案名和目錄

#如果要在清單生成式中使用if...else模式(不是隻有if判斷時):
l = [x if x%2 == 0 else -x for x in range(1,11)]
print(l)
[-1,2,-3,4,-5,6,-7,8,-9,10]


           

生成器:generator,一邊循環一邊計算的機制,最簡單的方式是把清單生成器的[ ]換成( ),可解決清單生成器,建立清單過大導緻的資源浪費。

g = (x*x for x in range(10))
print(g)
#傳回的是generator的記憶體位址。

#如果要列印内容,使用next()
print(next(g))

#吐過一個函數定義中包含yield關鍵字,那麼這個函數就是不再是一個普通函數,而是一個generator生成器

def test(max):
    n,a,b = 0,0,1
    while n<max:
        yield b
        a,b = b,a+b
        n = n + 1
    return 'end'

#函數是順序執行,遇到return語句或者最後一行函數語句就傳回。而變成generator的函數,在每次調用next()的時候執行,遇到yield語句傳回,再次執行時從上次傳回的yield語句處繼續執行,而不是從頭執行。
#一般使用for循環來疊代
#如果要拿到最後的傳回值,可修改為
g = test(6)
while True:
    try:
        x = next(g)
        print('g:',x)
    except StopIteration as e:
        print('Generator trturn value:',e.value)
        break
#最後會輸出 Generator trturn value: end
           

疊代器:可以直接作用于for循環的對象統稱為疊代器。