程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python map/reduce/fliter/sorted 等高階函數的使用

編輯:Python

map()映射

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)))) #計算序列每個元素的平方

reduce()歸並

在迭代序列的過程中,首先把 前兩個元素(只能兩個)傳給 函數,函數加工後,然後把 得到的結果和第三個元素 作為兩個參數傳給函數參數, 函數加工後得到的結果又和第四個元素 作為兩個參數傳給函數參數,依次類推。

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)))

fliter()過濾器

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()排序

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']

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved