首頁 後端開發 Python教學 Python中回呼的含義詳解

Python中回呼的含義詳解

Nov 30, 2019 pm 01:18 PM
python 回調

Python中回呼的含義詳解

回呼函數的最初需求背景

回呼函數我能想到的最古老的場景就是系統程式設計會用到。

程式設計分為兩類:

● 系統程式設計(system programming)

● 應用程式設計(application programming)

(建議學習:Python影片教學  )

什麼是系統程式設計:

所謂系統編程,簡單來說,就是寫各種各樣的功能庫。例如Windows裡面的win32、gdi32函式庫,win32就能呼叫主機硬體和系統層的功能,gdi32能用來繪製圖形相關。這些函式庫就等著那些做應用的人來呼叫就行。

什麼是應用程式設計:

而應用程式設計就是利用已經寫好的各種系統功能庫、語言功能庫來編寫具某種業務功能用的程序,就是應用。例如一個基礎的爬蟲程序,可以利用python語言和requests函式庫來完成,一個基礎的網頁網站可以利用Java語言和Java Servlet函式庫來完成。

系統程式設計和回呼的關係

系統程式設計師會給自己寫的函式庫留下一些接口,即API,以供應用程式設計師使用。所以在抽象層的圖示裡,庫位於應用程式的底下。當程式跑起來時,一般情況下,應用程式會時常透過API呼叫庫裡所預先備好的函數。但是有些函式庫函數卻要求應用先傳給它一個函數,好在適當的時候調用,以完成目標任務。這個被傳入的、後又被呼叫的函數就稱為回呼函數

如果你看文字看得比較懵,那麼你看我畫的圖(下面是圖1):

Python中回呼的含義詳解

理解回調前,先理解同步調用

同步調用是以一種阻塞式調用,簡單來說就是從上往下,按照順序去執行。而回呼就是一種非同步呼叫式順序。

同步式調用的具體案例,可以聯想到古代的烽火台。古代長城的烽火傳遞的機制就和同步調用差不多,現在我們假設每個烽火只能看到相鄰的烽火狀態,每個烽火的狀態只有亮(點火狀態)和暗(不點火狀態)。

現在有A、B、C、D四個烽火台,A先點亮,B看到A的烽火亮了,立刻去點火,花了2秒點亮。但這時候負責C烽火的人在睡覺,可是這時候所有人都在等待C點亮,終於C睡了2個小時候看到了B點亮,然後去點亮。 D由於長期沒有點亮,導致烽火出現問題,因此整個過程都在等待D的完成。 (由此也引發一些思考,同步呼叫有時也容易掉鍊子,如果上一步掉鍊子了,下一步之後的操作都完蛋了。)

同步呼叫的案例代碼:

print("start.")
print(123)
print(456)
a = 7
if a > 6:
    print(789)
print(91011)
print("end.")
登入後複製

回呼需要解決的問題

常見的系統都會發展出很多函式庫,裡面有很多函數。而有些函數,則需要呼叫者根據自己的需求來寫入要呼叫的函數。因為這個在寫函式庫的時候沒法預測,只能由呼叫者輸入,所以就需要回呼機制。

回呼機制是用來完善同步呼叫機制的一種方式,用來完善同步呼叫機制的還有非同步呼叫機制。 (後面會寫文章介紹這種更重要的非同步)

回呼函數怎麼解決實際問題的案例

回呼就是透過以下方式來解決上面說的問題。

● 函數能變成參數

● 靈活、自訂的方式呼叫

函數變參數案例

def doubel(x):
    return 2*x
def quadruple(x):
    return 4*x
# mind function
def getAddNumber(k, getEventNumber):
    return 1 + getEventNumber(k)
def main():
    k=1
    i=getAddNumber(k,double)
    print(i)
    i=getAddNumber(k,quadruple)
    print(i)
# call main
main()
登入後複製

輸出結果:

3
5
登入後複製

靈活、自訂的方式呼叫(飯店叫醒旅客)案例

這個案例真是回調的靈魂所在了,假設你是飯店的前台小姐姐,你不可能知道今晚入住的旅客需不需要明天要不要叫醒服務、需要什麼樣的叫醒服務。

def call_you_phone(times):
    """
    叫醒方式: 给你打电话
    :param times: 打几次电话
    :return: None
    """
    print('已经给旅客拨打了电话的次数:', str(times))
def knock_you_door(times):
    """
    叫醒方式: 去敲你房间门
    :param times: 敲几次门
    :return: None
    """
    print('已经给旅客敲门的次数:', str(times))
def no_service(times):
    """
    叫醒方式: 无叫醒服务. (默认旅客是选无叫醒服务)
    :param times: 敲几次门
    :return: None
    """
    print('顾客选择无服务.不要打扰他的好梦。')
def front_desk(times, function_name=no_service()):
    """
    这个相当于酒店的前台,你去酒店之后,你要啥叫醒方式都得在前台说
    这里是实现回调函数的核心,相当于一个中转中心。
    :param times:次数
    :param function_name:回调函数名
    :return:调用的函数结果
    """
    return function_name(times)
if __name__ == '__main__':
    front_desk(100, call_you_phone)  # 意味着给你打100次电话,把你叫醒
登入後複製

輸出:

已经给旅客拨打了电话的次数:100
登入後複製

實際應用(Python的requests庫自帶的事件鉤子)

這個案例就很好解決原本程式是同步機制執行的,但是透過鉤子事件,就可以優先去執行一些先行步驟。而這個鉤子事件的原理就是函數回呼。

import requests
def env_hooks(response, *args, **kwargs):
    print(response.headers['Content-Type'])
def main():
    result = requests.get("https://api.github.com", hooks=dict(response=env_hooks))
    print(result.text)
if __name__ == '__main__':
    main()
登入後複製

輸出:

application/json; charset=utf-8
{"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"...省略"}
登入後複製

本文來自 python教學 欄位,歡迎學習!  

以上是Python中回呼的含義詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

vs code 可以在 Windows 8 中運行嗎 vs code 可以在 Windows 8 中運行嗎 Apr 15, 2025 pm 07:24 PM

VS Code可以在Windows 8上運行,但體驗可能不佳。首先確保系統已更新到最新補丁,然後下載與系統架構匹配的VS Code安裝包,按照提示安裝。安裝後,注意某些擴展程序可能與Windows 8不兼容,需要尋找替代擴展或在虛擬機中使用更新的Windows系統。安裝必要的擴展,檢查是否正常工作。儘管VS Code在Windows 8上可行,但建議升級到更新的Windows系統以獲得更好的開發體驗和安全保障。

visual studio code 可以用於 python 嗎 visual studio code 可以用於 python 嗎 Apr 15, 2025 pm 08:18 PM

VS Code 可用於編寫 Python,並提供許多功能,使其成為開發 Python 應用程序的理想工具。它允許用戶:安裝 Python 擴展,以獲得代碼補全、語法高亮和調試等功能。使用調試器逐步跟踪代碼,查找和修復錯誤。集成 Git,進行版本控制。使用代碼格式化工具,保持代碼一致性。使用 Linting 工具,提前發現潛在問題。

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

vscode 擴展是否是惡意的 vscode 擴展是否是惡意的 Apr 15, 2025 pm 07:57 PM

VS Code 擴展存在惡意風險,例如隱藏惡意代碼、利用漏洞、偽裝成合法擴展。識別惡意擴展的方法包括:檢查發布者、閱讀評論、檢查代碼、謹慎安裝。安全措施還包括:安全意識、良好習慣、定期更新和殺毒軟件。

See all articles