python學習筆記(三),python學習筆記
一. 切片
切片操作和java中的subList類似,就是擷取一個子列表
比如L=['zhangsan','lisi','wangwu'] 那麼L[0, 2]表示從索引0開始取,直到索引2(不含2), 正好2個元素。如果第一個索引為0, 還可以省略.
下面我們建立一個0-99的數列: L = range(100)
1. 擷取前10個數: L[:10]
2. 擷取後10個數: L[-10:] # 倒數第一個元素的索引是-1
3. 擷取前11-20個數: L[10:20]
4. 擷取前10個數,每兩個取一個: L[:10:2]
5. 所有數中,每5個取一個:L[: : 5]
tuple, 字串‘xxx’ 或 Unicode字串u'xxx'也可以使用切片操作
二. 迭代
python的for迴圈不僅可以用在list或tuple上,還可以作用在其他可迭代對象上
1. 迭代dict:
d = {'a': 1, 'b': 2, 'c': 3}for key in d: print keydict的儲存不是按照list的方式順序排列,所以,迭代出的結果順序很可能不一樣。
預設情況下,dict迭代的是key。如果要迭代value,可以用for value in d.itervalues(), 如果要同時迭代key和value,可以用for k, v in d.itervalues()
2. 判斷對象是否可迭代:(通過collections模組的iterable類型判斷)
from collections import Iterableprint isinstance('abc', Iterable) # str是否可迭代 (True)print isinstance([1,2,3], Iterable) # list是否可迭代 (True) print isinstance(123, Iterable) # 整數是否可迭代 (False)3. 迭代索引和元素本身:(通過enumerate函數把list變成索引-元素對)
>>> for i, value in enumerate(['A', 'B', 'C']):... print i, value...0 A1 B2 C
三. 列表產生式
1. 產生列表
>>> [x * x for x in range(1, 11)][1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
2. 帶條件的列表產生式:(篩選出僅偶數的平方)
>>> [x * x for x in range(1, 11) if x % 2 == 0][4, 16, 36, 64, 100]
3. 雙層迴圈產生全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ']['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
4. 多個變數的列表產生式
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }>>> for k, v in d.iteritems():... print k, '=', v... y = Bx = Az = C
四. 產生器
list不是一次性產生,而是在迴圈的過程中不斷推算出後續的元素,這種一邊迴圈一邊計算的機制稱為產生器。
L = [x * x for x in range(10)] # list - 中括弧g = (x * x for x in range(10)) # generator - 小括弧
定義generator的另一種方法:
如果一個函數定義中包含yield關鍵字,那麼這個函數就不再是一個普通函數,而是一個generator
generator函數在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
如:定義一個generator,依次返回數字1, 3, 5
def odd(): print 'step 1' yield 1 print 'step 2' yield 3 print 'step 3' yield 5o = odd()print o.next() # step1 1print o.next() # step2 2 print o.next() # step3 3