彻底弄懂Python中的回调函数(callback)


Posted in Python onJune 25, 2022

摘要

主要是介绍python 的回调函数callback。

什么是回调函数

当程序运行是,一般情况下,应用程序会时常通过API调用库里所预先备好的函数。但是有些库函数却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)

例如:

有一家旅馆提供叫醒服务,但是要求旅客自己决定叫醒的方法。可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽误事的,还可以要求往自己头上浇盆水。这里,“叫醒”这个行为是旅馆提供的,相当于库函数,但是叫醒的方式是由旅客决定并告诉旅馆的,也就是回调函数。而旅客告诉旅馆怎么叫醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数(to register a callback function)

可以看到,回调函数通常和应用处于同一抽象层(因为传入什么样的回调函数是在应用级别决定的)。而回调就成了一个高层调用底层,底层再回过头来调用高层的过程。(我认为)这应该是回调最早的应用之处,也是其得名如此的原因。

彻底弄懂Python中的回调函数(callback)

回调机制的优势

回调机制提供了非常大的灵活性。我们把图中的库函数改称为中间函数了,这是因为回调并不仅仅用在应用和库之间。任何时候,只要想获得类似于上面情况的灵活性,都可以利用回调。有的同学可定想回调似乎只是函数间的调用,可以发现两者之间的一个关键的不同

在回调中,我们利用某种方式,把回调函数像参数一样传入中间函数。可以这么理解,在传入一个回调函数之前,中间函数是不完整的。换句话说,程序可以在运行时,通过登记不同的回调函数,来决定、改变中间函数的行为。这就比简单的函数调用要灵活太多了。

#回调函数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)

彻底弄懂Python中的回调函数(callback)

 使用闭包代替上面的类来实现

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)

博文参考:

python3回调函数(callback) - 知乎

总结

到此这篇关于Python中回调函数(callback)的文章就介绍到这了,更多相关Python 回调函数callback内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Python 相关文章推荐
理解Python中的With语句
Feb 02 Python
讲解Python中if语句的嵌套用法
May 14 Python
21行Python代码实现拼写检查器
Jan 25 Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 Python
python3使用urllib模块制作网络爬虫
Apr 08 Python
一个Python最简单的接口自动化框架
Jan 02 Python
python selenium自动上传有赞单号的操作方法
Jul 05 Python
Python+numpy实现矩阵的行列扩展方式
Nov 29 Python
python实现滑雪者小游戏
Feb 22 Python
Python Django view 两种return的实现方式
Mar 16 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
利用Python实现翻译HTML中的文本字符串
Jun 21 #Python
使用scrapy实现增量式爬取方式
Jun 21 #Python
python+opencv实现目标跟踪过程
Jun 21 #Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Python+DeOldify实现老照片上色功能
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 #Python
virtualenv隔离Python环境的问题解析
Jun 21 #Python
You might like
德劲1107的电路分析与打磨
2021/03/02 无线电
一个多文件上传的例子(原创)
2006/10/09 PHP
php写的简易聊天室代码
2011/06/04 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
2013/12/16 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
微信小程序 自定义对话框实例详解
2017/01/20 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
2018/04/22 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
node.js实现http服务器与浏览器之间的内容缓存操作示例
2020/02/11 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
python中类的一些方法分析
2014/09/25 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
Python 经典算法100及解析(小结)
2019/09/13 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
德国鞋子网上商店:Omoda.de
2017/03/31 全球购物
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
中文专业毕业生自荐书范文
2014/01/04 职场文书
会计师职业生涯规划范文
2014/02/18 职场文书
元宵节晚会主持人串词
2014/03/25 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
护士工作心得体会
2016/01/25 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python