filter函數(shù)
filter(function, iterable)
filter函數(shù)是python中的高階函數(shù), 第一個(gè)參數(shù)是一個(gè)篩選函數(shù), 第二個(gè)參數(shù)是一個(gè)可迭代對(duì)象, 返回的是一個(gè)生成器類型, 可以通過next獲取值. 這里大致講述下原理, filter()把傳入的function依次作用于iterable的每個(gè)元素, 滿足條件的返回true, 不滿足條件的返回false, 通過true還是false決定將該元素丟棄還是保留.
下面是簡(jiǎn)單的操作, 直接上代碼
- 處理list
# 列表(list)
a = [1, 2, 3, 4, 5]
list(filter(lambda x: x > 3, a))
# [4, 5]
- 處理dict
# 字典(dict)
d = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
for i in filter(lambda x: x[0] > 3, d.items()):
print(i)
# (4, 'd')
# (5, 'e')
這里使用d.items(), 所以返回的元素為元組, 下面代碼可以做個(gè)對(duì)比
d = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
for i in filter(lambda x: x[0] > 3, d):
# 4
# 5
這里的iterable對(duì)象是字典本身d, 這里filter默認(rèn)使用鍵值來篩選, 下面用法也可以進(jìn)行一下, 方便理解
d = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
for i in d:
print(i)
# 依次輸出 1 2 3 4 5
這里直接遍歷字典, 不使用d.items(), 默認(rèn)遍歷的是鍵值
d = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
2 in d
# True
'a' in d
# False
'a' in d.values()
# True
以上代碼判斷2是否存在字典d中, 直接使用2 in d, 默認(rèn)在keys中去尋找, 如果要在values中去找, 則需要使用'a' in d.values()
好了- -, 這里一不小心扯得有點(diǎn)多, 跑題了......回歸正題, 看代碼
a = [1, 2, 3, 4, 5]
filter(lambda x: x > 3, a)
# <filter at 0x25d4f2ae518>
f = _
list(f)
# [4, 5]
list(f)
# []
這里有點(diǎn)意思, 我在這里進(jìn)行了兩次list(f)的操作, 第一次可以輸出正確的值, 第二次就是空值了. 試過好幾次都是這樣, 是不是很神奇...之前我看過一篇文章, 不過忘了是在哪看過的了, 有討論過filter返回的生成器的問題, filter返回的是一個(gè)生成器, 開篇已經(jīng)闡述過了, 但是這個(gè)生成器有點(diǎn)特殊, 只會(huì)存在一次, 對(duì), 只會(huì)存在一次, 本人感覺這是一種優(yōu)化(內(nèi)存優(yōu)化?). 首先返回的是一個(gè)生成器就很優(yōu)化了, 還加了一個(gè)只存在一次的設(shè)定, 感覺這很pythonic啊/哭笑, 但是這也是一個(gè)極難發(fā)現(xiàn)的坑- -!
繼續(xù)折騰, 如果filter會(huì)有這種設(shè)定, 那map這種同樣身為高階函數(shù)的是不是也有相同的設(shè)定呢!!!
a = [1, 2, 3, 4, 5, 6]
map(lambda x: x + 1, a)
# <map at 0x25d4f27a6a0>
m = _
list(m)
# [2, 3, 4, 5, 6, 7]
list(m)
# []
果然, 同為高階的map也存在相同的設(shè)定
好了, 先折騰到這兒了- -