map()方法會將 一個函數 映射到序列的每一個元素上,生成新序列,包含所有函數返回值。
由於返回的序列是一個Iterator,Iterator是惰性序列,因此通過list()函數讓它把整個序列都計算出來並返回一個list。
def fun(x):
return x*x
r = map(fun,[1,2,3,4,5,6,7,8,9])
print(list(r))
#map()作為高階函數,事實上它把運算規則抽象了
print(list(map(str,[1,2,3,4,5,6,7,8,9]))) #將數字轉換為字符串
print(list(map(lambda x:x**2, range(1,10)))) #計算序列每個元素的平方
在迭代序列的過程中,首先把 前兩個元素(只能兩個)傳給 函數,函數加工後,然後把 得到的結果和第三個元素 作為兩個參數傳給函數參數, 函數加工後得到的結果又和第四個元素 作為兩個參數傳給函數參數,依次類推。
from functools import reduce
from tkinter import N
def fun_add(x,y):
return x+y
print(reduce(fun_add,[1,2,3,4,5,6,7,8,9]))
#或者
print(reduce(lambda x,y:x*10+y,range(1,10)))
Python內建的filter()函數用於過濾序列。他也是一個高階函數,將符合過濾函數的元素刪除。
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))
# 結果: ['A', 'B', 'C']
用filter求素數
用Python來實現這個算法,可以先構造一個從3開始的奇數序列:
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
然後定義一個篩選函數:
def _not_divisible(n):
return lambda x: x % n > 0
最後,定義一個生成器,不斷返回下一個素數:
def primes():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一個數
yield n
it = filter(_not_divisible(n), it) # 構造新序列
# 打印1000以內的素數:
for n in primes():
if n < 1000:
print(n)
else:
break
sorted()函數也是一個高階函數,它還可以接收一個key函數來實現自定義的排序,例如按絕對值大小排序:
print(sorted([36, 5, -12, 9, -21], key=abs))
#[5, 9, -12, -21, 36]
print(sorted(['bob', 'about', 'Zoo', 'Credit']))
#['Credit', 'Zoo', 'about', 'bob']
字符串排序
#忽略大小寫的排序
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower))
#['about', 'bob', 'Credit', 'Zoo']
#反向排序,不必改動key函數,可以傳入第三個參數reverse=True:
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True))
#['Zoo', 'Credit', 'bob', 'about']