一、什麼是高階函數(shù)?
高階函數(shù)是在Python中一個(gè)非常有用的功能函數(shù),所謂高階函數(shù)就是一個(gè)函數(shù)可以用來(lái)接收另一個(gè)函數(shù)當(dāng)參數(shù),這樣的函數(shù)叫做高階函數(shù)。
透過(guò)案例程式碼分析,一步一步深入概念。
二、變數(shù)可以指向函數(shù)
以Python內(nèi)建的求絕對(duì)值的函數(shù)abs()為例。
呼叫函數(shù)以以下程式碼:
print(abs(-10))
執(zhí)行結(jié)果:
#但是,如果只寫(xiě)abs呢?
print(abs)
執(zhí)行結(jié)果:
可見(jiàn),abs(-10)是函數(shù)調(diào)用,而abs是函數(shù)本身。
要獲得函數(shù)調(diào)用結(jié)果,可以把結(jié)果賦值給變量:
x = abs(-10) print(x)
運(yùn)行結(jié)果:
但是,如果把函數(shù)本身賦值給變量呢?
f = abs print(f)
運(yùn)行結(jié)果:
結(jié)論:
函數(shù)本身也可以賦值給變量,即:變量可以指向函數(shù)。
如果一個(gè)變量指向了一個(gè)函數(shù),那么,可否通過(guò)該變量來(lái)調(diào)用這個(gè)函數(shù)?
代碼驗(yàn)證:
f = abs print(f(-10))
運(yùn)行結(jié)果:
結(jié)果相同,說(shuō)明變量f現(xiàn)在已經(jīng)指向了abs函數(shù)本身。直接調(diào)用abs()函數(shù)和調(diào)用變量f()完全相同。
三、函數(shù)名也是變量
那么函數(shù)名是什么呢?函數(shù)名其實(shí)就是指向函數(shù)的變量!對(duì)于abs()這個(gè)函數(shù),完全可以把函數(shù)名abs看成變量,它指向一個(gè)可以計(jì)算絕對(duì)值的函數(shù)!
把a(bǔ)bs指向其他對(duì)象,會(huì)有什么情況發(fā)生?
abs = 10 print(abs(-10))
運(yùn)行結(jié)果:
代碼解析:
把a(bǔ)bs指向10后,就無(wú)法通過(guò)abs(-10)調(diào)用該函數(shù)了!因?yàn)閍bs這個(gè)變量已經(jīng)不指向求絕對(duì)值函數(shù)而是指向一個(gè)整數(shù)10!
當(dāng)然實(shí)際代碼絕對(duì)不能這么寫(xiě),這里是為了說(shuō)明函數(shù)名也是變量。要恢復(fù)abs函數(shù),請(qǐng)重啟Python交互環(huán)境。
注:
由于abs函數(shù)實(shí)際上是定義在builtin模塊中的,所以要讓修改abs變量的指向在其它模塊也生效,要用builtin.abs = 10。
四、傳入函數(shù)
既然變量可以指向函數(shù),函數(shù)的參數(shù)能接收變量,那么一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù),這種函數(shù)就稱(chēng)之為高階函數(shù)。
一個(gè)最簡(jiǎn)單的高階函數(shù):
def add(x, y, f): return f(x) + f(y)
當(dāng)調(diào)用add(-5, 6, abs)時(shí),參數(shù)x,y和f分別接收-5,6和abs,根據(jù)函數(shù)定義,可以推導(dǎo)計(jì)算過(guò)程為:
x = -5 y = 6 f = abs f(x) + f(y) == abs(-5) + abs(6) == 11 return 11 print(add(-5, 6, abs))
用代碼驗(yàn)證一下:
print(add(-5, 6, abs))
注:
編寫(xiě)高階函數(shù),就是讓函數(shù)的參數(shù)能夠接收別的函數(shù)。
把函數(shù)當(dāng)作參數(shù)傳入,這樣的函數(shù)稱(chēng)為高階函數(shù),函數(shù)式程式就是指這種高度抽象的程式設(shè)計(jì)範(fàn)式。
五、總結(jié)
本文基於Python基礎(chǔ),介紹了Python函數(shù)中高階函數(shù)的使用。每一個(gè)板塊都經(jīng)過(guò)案例的分析,運(yùn)行效果圖的展示,讓讀者更好的理解。重點(diǎn)介紹了在實(shí)際操作中,函數(shù)的傳入時(shí)出現(xiàn)報(bào)錯(cuò)的問(wèn)題。
以上是一篇文章帶你了解Python高階函數(shù)的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

處理API認(rèn)證的關(guān)鍵在於理解並正確使用認(rèn)證方式。 1.APIKey是最簡(jiǎn)單的認(rèn)證方式,通常放在請(qǐng)求頭或URL參數(shù)中;2.BasicAuth使用用戶名和密碼進(jìn)行Base64編碼傳輸,適合內(nèi)部系統(tǒng);3.OAuth2需先通過(guò)client_id和client_secret獲取Token,再在請(qǐng)求頭中帶上BearerToken;4.為應(yīng)對(duì)Token過(guò)期,可封裝Token管理類(lèi)自動(dòng)刷新Token;總之,根據(jù)文檔選擇合適方式,並安全存儲(chǔ)密鑰信息是關(guān)鍵。

要測(cè)試API需使用Python的Requests庫(kù),步驟為安裝庫(kù)、發(fā)送請(qǐng)求、驗(yàn)證響應(yīng)、設(shè)置超時(shí)與重試。首先通過(guò)pipinstallrequests安裝庫(kù);接著用requests.get()或requests.post()等方法發(fā)送GET或POST請(qǐng)求;然後檢查response.status_code和response.json()確保返回結(jié)果符合預(yù)期;最後可添加timeout參數(shù)設(shè)置超時(shí)時(shí)間,並結(jié)合retrying庫(kù)實(shí)現(xiàn)自動(dòng)重試以增強(qiáng)穩(wěn)定性。

在Python中,函數(shù)內(nèi)部定義的變量是局部變量,僅在函數(shù)內(nèi)有效;外部定義的是全局變量,可在任何地方讀取。 1.局部變量隨函數(shù)執(zhí)行結(jié)束被銷(xiāo)毀;2.函數(shù)可訪問(wèn)全局變量但不能直接修改,需用global關(guān)鍵字;3.嵌套函數(shù)中若要修改外層函數(shù)變量,需使用nonlocal關(guān)鍵字;4.同名變量在不同作用域互不影響;5.修改全局變量時(shí)必須聲明global,否則會(huì)引發(fā)UnboundLocalError錯(cuò)誤。理解這些規(guī)則有助於避免bug並寫(xiě)出更可靠的函數(shù)。

要使用Python創(chuàng)建現(xiàn)代高效的API,推薦使用FastAPI;其基於標(biāo)準(zhǔn)Python類(lèi)型提示,可自動(dòng)生成文檔,性能優(yōu)越。安裝FastAPI和ASGI服務(wù)器uvicorn後,即可編寫(xiě)接口代碼。通過(guò)定義路由、編寫(xiě)處理函數(shù)並返回?cái)?shù)據(jù),可以快速構(gòu)建API。 FastAPI支持多種HTTP方法,並提供自動(dòng)生成的SwaggerUI和ReDoc文檔系統(tǒng)。 URL參數(shù)可通過(guò)路徑定義捕獲,查詢(xún)參數(shù)則通過(guò)函數(shù)參數(shù)設(shè)置默認(rèn)值實(shí)現(xiàn)。合理使用Pydantic模型有助於提升開(kāi)發(fā)效率和準(zhǔn)確性。

為Python的for循環(huán)添加超時(shí)控制,1.可結(jié)合time模塊記錄起始時(shí)間,在每次迭代中判斷是否超時(shí)並使用break跳出循環(huán);2.對(duì)於輪詢(xún)類(lèi)任務(wù),可用while循環(huán)配合時(shí)間判斷,並加入sleep避免CPU佔(zhàn)滿;3.進(jìn)階方法可考慮threading或signal實(shí)現(xiàn)更精確控制,但複雜度較高,不建議初學(xué)者首選;總結(jié)關(guān)鍵點(diǎn):手動(dòng)加入時(shí)間判斷是基本方案,while更適合限時(shí)等待類(lèi)任務(wù),sleep不可缺失,高級(jí)方法適用於特定場(chǎng)景。

如何在Python中高效處理大型JSON文件? 1.使用ijson庫(kù)流式處理,通過(guò)逐項(xiàng)解析避免內(nèi)存溢出;2.若為JSONLines格式,可逐行讀取並用json.loads()處理;3.或先將大文件拆分為小塊再分別處理。這些方法有效解決內(nèi)存限制問(wèn)題,適用於不同場(chǎng)景。

在Python中,用for循環(huán)遍曆元組的方法包括直接迭代元素、同時(shí)獲取索引和元素、以及處理嵌套元組。 1.直接使用for循環(huán)可依次訪問(wèn)每個(gè)元素,無(wú)需管理索引;2.使用enumerate()可同時(shí)獲取索引和值,默認(rèn)索引起始為0,也可指定start參數(shù);3.對(duì)嵌套元組可在循環(huán)中解包,但需確保子元組結(jié)構(gòu)一致,否則會(huì)引發(fā)解包錯(cuò)誤;此外,元組不可變,循環(huán)中不能修改內(nèi)容,可用\_忽略不需要的值,且建議遍歷前檢查元組是否為空以避免錯(cuò)誤。

Python默認(rèn)參數(shù)在函數(shù)定義時(shí)評(píng)估並固定值,可能導(dǎo)致意外問(wèn)題。使用可變對(duì)像如列表作為默認(rèn)參數(shù)會(huì)保留修改,建議用None代替;默認(rèn)參數(shù)作用域是定義時(shí)的環(huán)境變量,後續(xù)變量變化不影響其值;避免依賴(lài)默認(rèn)參數(shù)保存狀態(tài),應(yīng)使用類(lèi)封裝狀態(tài)以確保函數(shù)一致性。
