參考:
用過python的閉包,裝飾器,map,reduce,filter等函式,也知道可以把乙個函式作為乙個變數進行賦值,傳遞;但是還不知道這些都屬於函式式程式設計的範疇,也一直以為這些都是理所當然的,當然,去區分我們寫的程式是函式式程式設計的範疇還是過程式程式設計的範疇並不重要,而是理解它的思想,把這種思想運用到平時的專案中去。最近讀了陳皓老師的部落格,看了廖雪峰老師的python高階教程,將一些python的函式式程式設計做乙個總結。後續專案中如果有更深的體會,再更新。
目錄
一.python的函式式程式設計的特點
二.高階函式
三.python內建的高階函式
1.map函式
2.reduce函式
3.filter函式
4.sorted函式,自定義排序
四.函式作為返回值&閉包
1.函式作為乙個函式的返回值
2.閉包
五.匿名函式
六.裝飾器
1.不是純函式式程式設計,允許有變數
2.支援高階函式,函式可以作為變數傳入乙個函式
3.支援閉包,函式可以作為另乙個函式的返回值
4.支援匿名函式
1.變數可以指向乙個函式
# 變數可以指向乙個函式
f = abs # 此時f指向python的內建函式abs
print(f(-3)) # 輸出3
2.函式名其實是指向函式的乙個變數,函式名和普通的變數沒有什麼區別
# 函式名其實是指向函式的乙個變數
abs = len # abs指向len函式
print(abs([1, 2, 3, 4])) # 輸出4
print(abs(-3)) # 程式報錯
3.高階函式是指可以接收函式作為引數的函式
# 高階函式是指可以接收函式作為引數的函式
def add(x, y, f):
return f(x) + f(y)
print(add(1, -3, abs)) #輸出4
原理:map函式接收乙個函式f,和乙個可迭代的資料型別如list,將函式f依次作用在list中的每個元素,最終得到乙個新的list迭代器並返回,但是不改變原list
舉例:將列表中每個人名的首字母大寫,其他小寫
def transer_name(s):
'''姓名轉換函式'''
return s[0].upper() + s[1:].lower()
namelist = ['aya', 'adam', 'imp'] # 原姓名列表
new_name = map(transer_name, namelist) # 新姓名列表迭代器
for name in new_name:
print(name) # 列印結果:aya adam imp
原理,reduce函式接收乙個函式f,和乙個可迭代的資料型別如list,
函式f必須接收兩個引數,每次接收list中的兩個元素,並將返回值作為下一次傳參的第乙個引數,返回最終的結果。
如計算乙個列表的元素之和
# 如計算乙個列表的元素之和 兩個引數
from functools import reduce # python3中reduce需要從functools中匯入
def add(x, y):
return x + y
alist = [1, 2, 3, 4, 5]
print(reduce(add, alist)) # 輸出15
函式f也可以接收三個引數,第乙個引數是函式f,第二個引數是乙個可迭代的物件,第三個物件是計算的初始值,對於上述例子,如果將計算的初始值設為100,那麼輸出結果為115
# 如計算乙個列表的元素之和 三個引數
from functools import reduce # python3中reduce需要從functools中匯入
def add(x, y):
return x + y
alist = [1, 2, 3, 4, 5]
print(reduce(add, alist, 100)) # 輸出115
原理:filter函式接收乙個函式f,和乙個可迭代的資料型別如list,函式f作用於list的每乙個元素,並對結果進行true or false的判斷,若結果false,則過濾掉list中的該元素,返回乙個新的list。
舉例:從乙個列表中過濾出偶數
# 從乙個列表中過濾出偶數
def filter_ov(num):
return num % 2 == 0
alist = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 舊list
new_list = filter(filter_ov, alist) # 新list迭代器[2,4,6,8]
for num in new_list:
print(num)
原理:sorted函式排序預設按照從小到大的順序排序,若要實現倒序排序,可以接收乙個reversed引數,reversed引數預設為fasle,若傳入true,表示倒序排序。sorted函式可以接收乙個key引數,key引數可以是乙個函式,表示排序規則,如下所示:
# 按照字典的值正序排序
adict =
print(sorted(adict.items(), key=lambda x: x[1])) # 輸出[(1, 'abc'), (3, 'kjdq'), (2, 'qcnkve')]
# 按照字典的鍵倒序排序
print(sorted(adict.items(), key=lambda x: x[0], reverse=true)) #輸出[(3, 'kjdq'), (2, 'qcnkve'), (1, 'abc')]
python的函式不僅可以返回int,str等常用的資料型別,還可以返回函式;但是需要注意的是,返回函式時返回的是函式名inner,而不是inner(),這兩者是完全不一樣的。返回函式可以把一些計算延遲
# 函式作為乙個函式的返回值
def out():
def inner():
print('inner')
return inner
f = out()
print(f) # 輸出:.inner at 0x0000021dd8f647b8>
f() # 輸出:inner
閉包是【函式作為返回值】的一種特殊情況,閉包中內函式引用了外函式的變數,然後返回內函式。要正確使用閉包,需確保引用的外層函式區域性變數再函式返回後不會在變化。
舉例:一次返回三個函式,分別計算1*1,2*2,3*3
# 一次返回三個函式,分別計算1*1,2*2,3*3
def out():
f_list =
for i in range(1, 4):
def inner(j):
def g():
return j * j
return g
r = inner(i)
return f_list
f1, f2, f3 = out()
print(f1()) # 1
print(f2()) # 4
print(f3()) # 9
零基礎入門Python3 函式式程式設計(1)
函式式程式設計和函式程式設計是不一樣的。函式是對一段 進行封裝,使得函式達到某個功能或者結果。函式式程式設計,簡言之就是進行數字運算的乙個過程。函式可以作為引數傳入另外的函式,其返回結果也可以是函式。一 高階函式 1 什麼是高階函式?就是把函式作為引數傳入函式中。例項1,我們看看函式的特性,變數可以...
python3介面程式設計 Python3程式設計技巧
in 1 fromrandom import randint in 2 data randint 10,10 for in range 10 in 3 data out 3 3,4,3,4,7,2,4,1,7,9 過濾列表中的負數 in 9 list filter lambda x x 0,data...
python3函式語法 Python3
python3 degrees 函式 描述degrees 將弧度轉換為角度。語法以下是 degrees 方法的語法 import math math.degrees x 注意 degrees 是不能直接訪問的,需要匯入 math 模組,然後通過 math 靜態物件呼叫該方法。引數x 乙個數值。返回值...