1、迭代器簡介
python中很多物件都是迭代器,例如列表、元組、字串、檔案、對映、集合。
所有可迭代的類必須實現__iter__()函式,得到迭代器物件,通常返回自身(即自身就是迭代器物件);
所有的迭代器類都實現了next()函式,當然迭代器類也需要實現__iter__()函式;3.0中是__next__()函式。
2、迭代器常見用法
用法1: for 變數 in 可迭代物件
用法2:if 變數 in 可迭代物件
用法3(較少使用):變數 = iter(可迭代物件),然後迴圈iter.next()得到每個值,直到stopiteration異常出現。
如果想重新迴圈,沒有回到開頭的函式,可以重新得到迭代器變數,例如:it = iter(mylist) it2 = iter(it)
3、列表推導式的三種形式
基本形式: [結果表示式 for 變數 in 可迭代物件] 其中結果表示式包含迴圈變數
例如:[x**2 for x in range(10)]
擴充套件形式(增加條件):[結果表示式 for 變數 in 可迭代物件 if 條件表示式] 其中條件表示式對迴圈變數進行檢查
例如:[x**2 for x in range(10) if x > 10]
擴充套件形式(多重迴圈): [結果表示式 for 變數 in 可迭代物件 for 變數2 in 可迭代物件2 ]
多重迴圈中還可以包含 if 條件表示式,對前一迴圈變數等進行過濾判斷。
例如:[(x,y) for x in range(10) for y in range(10, 20)]
[max(x,y) for x in range(10) for y in range(10, 20)]
[max(x,y) for x in range(10) for y in range(10, 20) for z in range(20, 30)]
4、map/reduce/filter
map(function, 可迭代物件): 對可迭代物件的每乙個元素,代入單引數的函式,得到的結果依次放入列表,最後得到列表。
reduce(function, 可迭代物件 [,可選的初始值]):從可迭代物件中先取兩個元素,代入這個雙引數的函式,得到乙個結果值,然後再取出下乙個值,將結果值和下乙個值傳入函式,再將結果與下乙個值進行計算,最後得到乙個列表。如果指定了可選的初始值,則第一次從可迭代物件中只取乙個元素,將初始值和第乙個元素代入函式。
舉例: map(x**2 for x in [1,3,5]) 等效於 [x**2 for x in [1,3,5]]
map(string.lower, ['4a', 'df']) 得到 ['4a', 'df'])
map/reduce/filter 常與lambda函式式結合起來用。
5、lambda 匿名函式
格式: lambda 變數列表: 單一表示式
例如: f = lambda x: x**2 assert( f(2) == 4 ) map(f, [3, 5])
也可直接: map(lambda x: x**2, [3, 5])
兩個引數的例子: reduce(lambda x,y: x+y, [1, 3, 5])
6、lambda 遞迴函式
f = lambda n: n > 2 and f(n-1)+f(n-2) or 1
map(f, range(1,10))
得到:[1, 1, 2, 3, 5, 8, 13, 21, 34]
提示1:表示式中可以有函式變數名
提示2:通過 and 和 or 表達條件和多語句的效果
7、三元表示式
從lambda 遞迴函式順帶說明三元表示式: a if b else c ,等效於c++的 「b ? a : c」
8、簡單生成器表示式
如果元素很多,才用列表會一次性載入所有元素,此時可以使用生成器表示式,即將中括號改為小括號()。
例如 [ x**2 for x in range(10000) ] 會一次性分配10000個元素的乙個列表,而「 x**2 for x in range(10000) 」則只是乙個表示式,此時並沒有分配元素空間。
例如 for v in (x**2 for x in range(10000))
傳入函式中時不需要加兩個小括號,例如 sum(x**2 for x in range(10000))
迭代器 推導式 函式式程式設計學習筆記
1 迭代器簡介 python中很多物件都是迭代器,例如列表 元組 字串 檔案 對映 集合。所有可迭代的類必須實現 iter 函式,得到迭代器物件,通常返回自身 即自身就是迭代器物件 所有的迭代器類都實現了next 函式,當然迭代器類也需要實現 iter 函式 3.0中是 next 函式。2 迭代器常...
談談函式式程式設計與推導式程式設計
lambda 返回函式 f lambda x,y x y f 3,5 8 推導式 out x 2 for x in range 4 也可多新增 x,y for x in range 4 for y in rannge x 還可以增加判斷語句 x,y for x in range 4 for y in...
Python學習筆記 函式式程式設計 裝飾器
根據廖雪峰python教程整理 由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2013 12 25 f now f 2013 12 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now...