摘要

主要是介绍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 * 4callback_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 + ydef 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 + yclass ResultHandler(object):def __init__(self):self.sequence = 0def handle(self, result):self.sequence += 1print("[{}] 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 + ydef make_handler():sequence = 0def handler(result):nonlocal sequencesequence += 1print("[{}] Got:{}".format(sequence, result))return handlerhandler = 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 + ydef make_handler():sequence = 0while True:result = yieldsequence += 1print("[{}] Got:{}".format(sequence, result))handle = make_handler()
next(handle)apply_async(add, (2,3), callback=handle.send)

博文参考:

python3回调函数(callback) - 知乎

Python——回调函数(callback)相关推荐

  1. python回调函数实例详解_Python回调函数用法实例详解

    本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...

  2. 服务器响应回调函数,解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)...

    由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...

  3. python回调函数的作用是_回调函数的意义以及python实现

    因工作需要,最近在学习使用python来解析各种文件,包括xmind,xml,excel,csv等等. 在学习python解析XML的时候看到这样一段话: 当时就犯了老毛病,被一个不是很知道的名词引起 ...

  4. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  5. JS回调函数(callback)

    在使用Jquery的时候,用到Callback(),回调函数的概念.而且很多. 比如: $.ajax({url:"test.json",type: "GET", ...

  6. python回调接口_三个案例带你了解python回调函数

    原标题:三个案例带你了解python回调函数 回调函数: 把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用 ...

  7. linux callback函数,C++回调函数(callback)的使用

    什么是回调函数(callback) 模块A有一个函数foo,它向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事情,让 ...

  8. alert 回调_JavaScript中到底什么时候回调函数Callback

    什么是回调函数Callback 简单的理解:回调函数是在另一个函数执行完毕后执行的函数 - 因此名称为'call back'. 复杂的理解:在JavaScript中,函数是对象.因此,函数可以将函数作 ...

  9. C++回调函数(callback)的使用

    什么是回调函数(callback)      模块A有一个函数foo,它向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什 ...

最新文章

  1. 如何用python创建一个下载网站-用Python写一个简单的网页下载
  2. S/4HANA生产订单增强WORKORDER_UPDATE方法
  3. 16:9或4:3,哪种屏幕宽高比更适合用户?
  4. c json 数组转dirction_值得掌握的命令行JSON工具jq
  5. 插值法:拉格朗日插值、牛顿插值
  6. nginx动静分离和负载均衡
  7. windows下安装服务注册Consul
  8. 阶跃函数卷积自己_如何看待大神/老师说“阶跃响应曲线调参并不准确”的观点?...
  9. Python SQLite3库
  10. 关于instanceof、isinstance和isAssignableFrom的区别
  11. Java 面试学习指南
  12. 思岚科技A1,A2雷达驱动安装
  13. 全网整合营销能力训练要点
  14. Evaluate之迷思
  15. Day13-寻觅踪迹
  16. html手机下拉菜单样式,MUI下拉菜单样式
  17. 查看服务器的文件夹,远程查看服务器文件夹内的文件夹
  18. HashMap源码面试题
  19. WSL安装ubuntu18.04+2016VCS+Verdi——记录安装过程错误
  20. 我们的优势 Our Advantage

热门文章

  1. 1087 有多少不同的值
  2. 浙江万里学院计算机专业好不好,浙江万里学院值得上吗 重点专业有哪些
  3. 信任用户证书(CA),实现Android7及以上HTTPS抓包
  4. 【数据结构基础】之数组介绍,生动形象,通俗易懂,算法入门必看
  5. springboot天文科普网站的设计与实现
  6. 软工——结构化分析(数据流图、ER图、状态转换图)(围绕例题有详细过程哟~)
  7. Android低功耗蓝牙BLE
  8. html锚点滑动效果,【转载】HTML锚点效果改进平滑移动页面滚动特效实现技术
  9. RK3399鸿蒙系统平板,诺维 工控级安卓主板 RK3399K4 安卓8.1系统
  10. 袋真园:年轻人千万别着急赚钱