搜尋
首頁後端開發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刪除
Python中的合併列表:選擇正確的方法Python中的合併列表:選擇正確的方法May 14, 2025 am 12:11 AM

Tomergelistsinpython,YouCanusethe操作員,estextMethod,ListComprehension,Oritertools

如何在Python 3中加入兩個列表?如何在Python 3中加入兩個列表?May 14, 2025 am 12:09 AM

在Python3中,可以通過多種方法連接兩個列表:1)使用 運算符,適用於小列表,但對大列表效率低;2)使用extend方法,適用於大列表,內存效率高,但會修改原列表;3)使用*運算符,適用於合併多個列表,不修改原列表;4)使用itertools.chain,適用於大數據集,內存效率高。

Python串聯列表字符串Python串聯列表字符串May 14, 2025 am 12:08 AM

使用join()方法是Python中從列表連接字符串最有效的方法。 1)使用join()方法高效且易讀。 2)循環使用 運算符對大列表效率低。 3)列表推導式與join()結合適用於需要轉換的場景。 4)reduce()方法適用於其他類型歸約,但對字符串連接效率低。完整句子結束。

Python執行,那是什麼?Python執行,那是什麼?May 14, 2025 am 12:06 AM

pythonexecutionistheprocessoftransformingpypythoncodeintoExecutablestructions.1)InternterPreterReadSthecode,ConvertingTingitIntObyTecode,whepythonvirtualmachine(pvm)theglobalinterpreterpreterpreterpreterlock(gil)the thepythonvirtualmachine(pvm)

Python:關鍵功能是什麼Python:關鍵功能是什麼May 14, 2025 am 12:02 AM

Python的關鍵特性包括:1.語法簡潔易懂,適合初學者;2.動態類型系統,提高開發速度;3.豐富的標準庫,支持多種任務;4.強大的社區和生態系統,提供廣泛支持;5.解釋性,適合腳本和快速原型開發;6.多範式支持,適用於各種編程風格。

Python:編譯器還是解釋器?Python:編譯器還是解釋器?May 13, 2025 am 12:10 AM

Python是解釋型語言,但也包含編譯過程。 1)Python代碼先編譯成字節碼。 2)字節碼由Python虛擬機解釋執行。 3)這種混合機制使Python既靈活又高效,但執行速度不如完全編譯型語言。

python用於循環與循環時:何時使用哪個?python用於循環與循環時:何時使用哪個?May 13, 2025 am 12:07 AM

UseeAforloopWheniteratingOveraseQuenceOrforAspecificnumberoftimes; useAwhiLeLoopWhenconTinuingUntilAcIntiment.forloopsareIdealForkNownsences,而WhileLeleLeleLeleLeleLoopSituationSituationsItuationsItuationSuationSituationswithUndEtermentersitations。

Python循環:最常見的錯誤Python循環:最常見的錯誤May 13, 2025 am 12:07 AM

pythonloopscanleadtoerrorslikeinfiniteloops,modifyingListsDuringteritation,逐個偏置,零indexingissues,andnestedloopineflinefficiencies

See all articles

熱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

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

熱門文章

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

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