前言
一般是详解python的变化函数callback。
什么是调用函数
当程序执行是,通常情况下,系统软件会时常依据API开启裤中所预先配齐的函数。但是有些函数库却要求应用先发送到它一个函数,还行合适的时候开启,并进行工作规划。那个被传入的、后又被开启的函数就称作调用函数(callbackfunction)。
例如:
有一家快捷酒店给与叫起床,但是要求游人自己做决定叫醒的方法。可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽搁时间的,还可以要求往自己头上浇盆水。这里,“叫醒”这种做法是酒店所提供,相当于函数库,但是叫醒的办法是由游人明确并通知酒店的,本身就是调用函数。而游人告之酒店怎么叫醒自个的姿态,就是将调用函数传入函数库姿势,称作办理备案调用函数(toregisteracallbackfunction)
可以瞧见,调用函数通常及应用处于同样抽象层(由于传入怎么样的调用函数是在运用等级所决定的)。而调节就成了高层住宅开启最底层,最底层再转过头来开启高层全过程。(我觉得)这大概是调节最开始的应用的地方,亦是其而出名这般的缘故。
调整管理机制的优点
调整管理机制带来了协调能力协调能力。协调能力我们可以把函数库改叫为正中间函数了,主要是因为调节并不只是用于运用和库中间。任何时刻,只要你想得到类似上边状况的协调能力,都能够运用调节。许多学生肯定想调节好像仅仅函数之间开启,不难发现彼此之间的1个重要的差异:
在调节中,大家运用一种方法,把调用函数像主要参数相同传入正中间函数。可以这样了解,在传入1个调用函数以前,正中间函数是不完美的。也就是说,程序流程能够在运行中,依据办理备案不同类型的调用函数,来确定、更改正中间函数的个人行为。这便比简单函数调用要灵便太多。
#回调函数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)
综上所述,这篇文章就给大家介绍到这里了,希望可以给大家带来帮助。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/130260.html
前言 我在学习浏览器和NodeJS的Event Loop时看了大量的文章,那些文章都写的很好,但是往往是每篇文章有那么几个关键的点,很多篇文章凑在一起综合来看,才可以对这些概念有较为深入的理解。 于是,我在看了大量文章之后,想要写这么一篇博客,不采用官方的描述,结合自己的理解以及示例代码,用最通俗的语言表达出来。希望大家可以通过这篇文章,了解到Event Loop到底是一种什么机制,浏览器和Nod...
基本语法 下面列出了这几个遍历语法规则: for (let index = 0; index < array.length; index++) { const element = array[index] // ... } array.forEach(element => { // ... }) for (const key in array) { // ......
摘要:事件完成,回调函数进入。主线程从读取回调函数并执行。终于执行完了,终于从进入了主线程执行。遇到,立即执行。宏任务微任务第三轮事件循环宏任务执行结束,执行两个微任务和。事件循环事件循环是实现异步的一种方法,也是的执行机制。 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我。不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作...
摘要:关于这部分有严格的文字定义,但本文的目的是用最小的学习成本彻底弄懂执行机制,所以同步和异步任务分别进入不同的执行场所,同步的进入主线程,异步的进入并注册函数。宏任务微任务第三轮事件循环宏任务执行结束,执行两个微任务和。 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序。 因为javascr...
摘要:若时间差大于间隔时间,则立刻执行一次函数。不同点函数防抖,在一段连续操作结束后,处理回调,利用和实现。函数防抖关注一定时间连续触发的事件只在最后执行一次,而函数节流侧重于一段时间内只执行一次。 原博客地址,欢迎star 函数防抖和节流 函数防抖和函数节流:优化高频率执行js代码的一种手段,js中的一些事件如浏览器的resize、scroll,鼠标的mousemove、mouseover...
阅读 630·2023-01-14 11:38
阅读 454·2023-01-14 11:04
阅读 357·2023-01-14 10:57
阅读 423·2023-01-14 10:48
阅读 479·2023-01-14 10:40
阅读 1187·2023-01-14 10:34
阅读 551·2023-01-14 10:24
阅读 452·2023-01-14 10:18