<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
主要是介紹python 的回撥函數callback。
當程式執行是,一般情況下,應用程式會時常通過API呼叫庫裡所預先備好的函數。但是有些庫函數卻要求應用先傳給它一個函數,好在合適的時候呼叫,以完成目標任務。這個被傳入的、後又被呼叫的函數就稱為回撥函數(callback function)。
例如:
有一家旅館提供叫醒服務,但是要求旅客自己決定叫醒的方法。可以是打客房電話,也可以是派服務員去敲門,睡得死怕耽誤事的,還可以要求往自己頭上澆盆水。這裡,“叫醒”這個行為是旅館提供的,相當於庫函數,但是叫醒的方式是由旅客決定並告訴旅館的,也就是回撥函數。而旅客告訴旅館怎麼叫醒自己的動作,也就是把回撥函數傳入庫函數的動作,稱為登記回撥函數(to register a callback function)
可以看到,回撥函數通常和應用處於同一抽象層(因為傳入什麼樣的回撥函數是在應用級別決定的)。而回撥就成了一個高層呼叫底層,底層再回過頭來呼叫高層的過程。(我認為)這應該是回撥最早的應用之處,也是其得名如此的原因。
回撥機制提供了非常大的靈活性。我們把圖中的庫函數改稱為中間函數了,這是因為回撥並不僅僅用在應用和庫之間。任何時候,只要想獲得類似於上面情況的靈活性,都可以利用回撥。有的同學可定想回撥似乎只是函數間的呼叫,可以發現兩者之間的一個關鍵的不同:
在回撥中,我們利用某種方式,把回撥函數像引數一樣傳入中間函數。可以這麼理解,在傳入一個回撥函數之前,中間函數是不完整的。換句話說,程式可以在執行時,通過登記不同的回撥函數,來決定、改變中間函數的行為。這就比簡單的函數呼叫要靈活太多了。
#回撥函數1 #生成一個2k形式的偶數 def double(x): return x * 2 #回撥函數2 #生成一個4k形式的偶數 def quadruple(x): return x * 4 callback_demo.py` from even import * #中間函數 #接受一個生成偶數的函數作為引數 #返回一個奇數 def getOddNumber(k, getEvenNumber): return 1 + getEvenNumber(k) #起始函數,這裡是程式的主函數 def main(): k = 1 #當需要生成一個2k+1形式的奇數時 i = getOddNumber(k, double) print(i) #當需要一個4k+1形式的奇數時 i = getOddNumber(k, quadruple) print(i) #當需要一個8k+1形式的奇數時 i = getOddNumber(k, lambda x: x * 8) print(i) if __name__ == "__main__": main()
def apply_ascyn(func, args, callback): """ func 函數的是處理的函數 args 表示的引數 callback 表示的函數處理完成後的 該執行的動作 """ result = func(*args) callback(result) def add(x, y): return x + y def print_result(result): print(result) apply_ascyn(add, (2, 3), callback=print_result)
這裡print_result只能接收一個result的引數,不能傳入其他資訊。當想讓回撥函數存取其他變數或者特定環境的變數值的時候會遇到問題。
def appy_async(func, args, *, callback): result = func(*args) #非同步執行的函數 同時將執行後返回到這個早從這個函數跳出去 callback(result) def add(x ,y): return x + y class ResultHandler(object): def __init__(self): self.sequence = 0 def handle(self, result): self.sequence += 1 print("[{}] Got: {}".format(self.sequence, result)) resultHandler = ResultHandler() appy_async(add, (2,3), callback=resultHandler.handle)
def apply_async(func, args, *, callback): result = func(*args) callback(result) def add(x ,y): return x + y def make_handler(): sequence = 0 def handler(result): nonlocal sequence sequence += 1 print("[{}] Got:{}".format(sequence, result)) return handler handler = make_handler() apply_async(add, (2,3), callback=handler)
def apply_async(func, args, *, callback): result = func(*args) callback(result) def add(x, y): return x + y def make_handler(): sequence = 0 while True: result = yield sequence += 1 print("[{}] Got:{}".format(sequence, result)) handle = make_handler() next(handle) apply_async(add, (2,3), callback=handle.send)
博文參考:
到此這篇關於Python中回撥函數(callback)的文章就介紹到這了,更多相關Python 回撥函數callback內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45