詳解Python中的普通函數(shù)和高階函數(shù)
什么是函數(shù)
每個(gè)語(yǔ)言都有函數(shù),甚至大家用的Excel里面也有函數(shù),我們以前學(xué)習(xí)的數(shù)學(xué)也很多各種各樣的函數(shù)。
Python中的函數(shù)也是一樣的。
def f(x): print("參數(shù)為:",x) return x
這里的函數(shù) y = f(x), 在數(shù)學(xué)中表示為一條斜率為1的直線。
函數(shù)的嵌套調(diào)用
def z(x): pass def f(x): print("參數(shù)為:",x) return z(x)
像這樣,我們?cè)趂(x)中調(diào)用了z(x)函數(shù)(這里使用了pass關(guān)鍵字,實(shí)現(xiàn)先不寫(xiě),僅作展示目的)
我們能不能不定義z(x)就定義一個(gè)函數(shù)調(diào)用別的函數(shù)呢?
就像實(shí)現(xiàn)一個(gè)數(shù)的平方,函數(shù)的‘平方',大概這個(gè)意思。
高階函數(shù)
def f(z): return z()
這就是高階函數(shù),f函數(shù)需要外界提供一個(gè)參數(shù),這個(gè)參數(shù)必須是一個(gè)函數(shù)。
在使用f(z)的時(shí)候,我們不能給一個(gè)f(2), f(3)這樣的值?;蛘哂袀€(gè)函數(shù)如d(x)返回非函數(shù)值結(jié)果,我們不能這樣調(diào)用:f(d(1))。
學(xué)委準(zhǔn)備了下面的代碼,從簡(jiǎn)單函數(shù)逐步演化為高階函數(shù):
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/10/24 11:39 下午 # @Author : LeiXueWei # @CSDN/Juejin/Wechat: 雷學(xué)委 # @XueWeiTag: CodingDemo # @File : func_demo2.py # @Project : hello def f1(x): return x def f2(x, z=100): return x + z / 10 def f3(x, z=100, *dynamic_args): sum = 0 for arg in dynamic_args: sum += arg return x + z / 10 + sum / 10000.0 def dummy_sum(*args): return 0 def f4(x, z=100, sum_func=dummy_sum): return x + z / 10 + sum_func() / 10000.0 print(f1(100)) print(f2(100, z=50)) print(f3(100, 50, 4, 5, 6)) def sum_g(*dynamic_args): def sum_func(): sum = 0 for arg in dynamic_args: sum += arg return sum return sum_func print(f4(100, 50, sum_g(4, 5, 6)))
這里我們看到函數(shù)f1, f2, f3, f4。
補(bǔ)充一個(gè)知識(shí)點(diǎn): *dynamic_args 是一個(gè)動(dòng)態(tài)參數(shù),不定長(zhǎng)度的參數(shù)。
也就是f3明明聲明了3個(gè)參數(shù),最后我們給了5個(gè)參數(shù)。
這里f3認(rèn)為x=100, z=50, dynamic_args = [4, 5, 6]
我們先看看輸出結(jié)果:
f3 和f4 看起來(lái)結(jié)果一樣。
但是性質(zhì)完整不一樣,讀者可以思考十秒。
f4彈性非常大,因?yàn)榈谌齻€(gè)參數(shù)為函數(shù)。
高階函數(shù)可以幫助我們把計(jì)算‘降維'(三維變成二維,二維變一維)。
我們思考一下計(jì)算圓形和方形的面積
相信大家閉著眼都能寫(xiě)出下面兩個(gè)函數(shù):
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/10/24 11:39 下午 # @Author : LeiXueWei # @CSDN/Juejin/Wechat: 雷學(xué)委 # @XueWeiTag: CodingDemo # @File : func_demo2.py # @Project : hello import math def circle_area(r): return math.pi * r * r def rectangle_area(a, b): return a * b
這是圓形面積的數(shù)學(xué)公式:
f ( r ) = π ? r 2
這是矩形面積的數(shù)學(xué)公式:
f ( a , b ) = a ? b
我們看到這里有的有1個(gè)參數(shù)的,有的有兩個(gè)的怎么變成高階函數(shù)?
讀者可以思考一會(huì)。
下面是代碼:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/10/24 11:39 下午 # @Author : LeiXueWei # @CSDN/Juejin/Wechat: 雷學(xué)委 # @XueWeiTag: CodingDemo # @File : func_demo2.py # @Project : hello import math def circle_area(r): return math.pi * r * r def rectangle_area(a, b): return a * b def area(x, linear, factor): return x * linear(x, factor) def relation(x, factor): return x * factor a = 10 b = 20 print("長(zhǎng)方形面積:", rectangle_area(a, b)) print("圓形面積:", circle_area(a)) print("長(zhǎng)方形面積:", area(a, relation, factor=b / a)) print("圓形面積:", area(a, relation, factor=math.pi))
結(jié)果如下圖:
這只是一種解法。
從代碼可以看到,我們把圓形和矩形都看作某一個(gè)參照物(半徑/一條邊)的平方,再成乘以一個(gè)系數(shù)。
下面,我們把正方形面積計(jì)算加上:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/10/24 11:39 下午 # @Author : LeiXueWei # @CSDN/Juejin/Wechat: 雷學(xué)委 # @XueWeiTag: CodingDemo # @File : func_demo2.py # @Project : hello import math def circle_area(r): return math.pi * r * r def square_area(a): return a * a def rectangle_area(a, b): return a * b def area(x, linear, factor): return x * linear(x, factor) def relation(x, factor): return x * factor a = 10 b = 20 print("長(zhǎng)方形面積:", rectangle_area(a, b)) print("正方形面積:", square_area(a)) print("圓形面積:", circle_area(a)) print("長(zhǎng)方形面積:", area(a, relation, factor=b / a)) print("正方形面積:", area(a, relation, factor=1)) print("圓形面積:", area(a, relation, factor=math.pi))
上面的代碼執(zhí)行結(jié)果如下:
這就是高階函數(shù)的神奇之處,我們從正方形的角度思考。
只用一個(gè)area函數(shù)和relation函數(shù),這兩個(gè)函數(shù)都不必修改,只需要給一個(gè)factor(經(jīng)驗(yàn)因子),就能快速計(jì)算它的面積。
為何高階函數(shù)能夠降低維度
從上面距離的計(jì)算面積的函數(shù),我們可以看到計(jì)算圓形和長(zhǎng)方形,都能看成一個(gè)一維函數(shù)。
然后以正方形面積為參照物,快速估算出圓形和方形的面積。
當(dāng)然上面的計(jì)算圓形面積采用了半徑,還不夠直觀,讀者可以自行改為直徑,這樣factor = math.pi / 4。
這樣在感受上會(huì)更貼切。
總結(jié)
除了上面介紹的函數(shù),參數(shù),高階函數(shù)。我們還可以使用lambda函數(shù):
lambda 參數(shù)1, 參數(shù)2,。。。,第n個(gè)參數(shù) : 計(jì)算表達(dá)式
上面的函數(shù)relation函數(shù)可以省略不寫(xiě),最后調(diào)用改為:
print("長(zhǎng)方形面積:", area(a, lambda x, f: x * f, factor=b / a)) print("正方形面積:", area(a, lambda x, f: x * f, factor=1)) print("圓形面積:", area(a, lambda x, f: x * f, factor=math.pi))
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
python 實(shí)現(xiàn)docx與doc文件的互相轉(zhuǎn)換
這篇文章主要介紹了python 實(shí)現(xiàn)docx與doc文件的互相轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03一行Python代碼制作動(dòng)態(tài)二維碼的實(shí)現(xiàn)
這篇文章主要介紹了一行Python代碼制作動(dòng)態(tài)二維碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09python優(yōu)化數(shù)據(jù)預(yù)處理方法Pandas pipe詳解
在本文中,我們將重點(diǎn)討論一個(gè)將多個(gè)預(yù)處理操作組織成單個(gè)操作的特定函數(shù):pipe。我將通過(guò)示例方式來(lái)展示如何使用它,讓我們從數(shù)據(jù)創(chuàng)建數(shù)據(jù)幀開(kāi)始吧2021-11-11Python實(shí)現(xiàn)從log日志中提取ip的方法【正則提取】
這篇文章主要介紹了Python實(shí)現(xiàn)從log日志中提取ip的方法,涉及Python文件讀取、數(shù)據(jù)遍歷、正則匹配等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03用Python每天自動(dòng)給女友免費(fèi)發(fā)短信
大家好,本篇文章主要講的是用Python每天自動(dòng)給女友免費(fèi)發(fā)短信,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Python中列表、字典、元組、集合數(shù)據(jù)結(jié)構(gòu)整理
這篇文章主要介紹了Python中列表、字典、元組、集合數(shù)據(jù)結(jié)構(gòu)整理,較為詳細(xì)的分析了這幾類數(shù)據(jù)結(jié)構(gòu)的具體用法及相關(guān)技巧,需要的朋友可以參考下2014-11-11解決pip安裝tensorflow中出現(xiàn)的no module named tensorflow.python 問(wèn)題方法
這篇文章主要介紹了解決pip安裝tensorflow中出現(xiàn)的no module named tensorflow.python 問(wèn)題方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02django啟動(dòng)uwsgi報(bào)錯(cuò)的解決方法
這篇文章主要給大家介紹了關(guān)于django啟動(dòng)uwsgi報(bào)錯(cuò)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04