理解python3中的回调函数

百度百科说:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

通俗理解就是:把一个函数作为参数传给另一个函数,第一个函数称为回调函数。这个被传入的参数其实是函数指针,即指向一个函数的指针(地址)。在python中,指针的概念被淡化,先举个c++的例子:

        本段引用自  python 回调函数(Callback)——天涯海阁未走远

        编写一个计算函数computer,对于两个整数进行各种计算(通用的,什么计算都能做)。有一个形参是指向具体算法函数的指针,根据不同的实参函数,用不同的算法进行计算。

        编写三个函数:求两个整数的最大值,最小值,和。分别用这三个函数作为实参,测试computer函数。

        那么肯定有人会问,一个函数怎么可能做各种计算呢?——这个时候,我们在computer的形参中设置一个函数指针,每次调用的时候传递给它一个函数指针。

        用函数名去初始化形参函数指针。这样的话,我们写computer函数的时候就只管说我要调用一个对两个整数做运算的函数,至于要做什么运算,只需要把代表这个运算的函数名传给我,我用函数指针来接收,用函数指针充当函数名,去调用函数体。这就是函数指针的好处,也就是函数回调。

#include<iostream>using namespace std;int computer(int a, int b, int(*func)(int, int)) {return func(a, b);
}int max(int a, int b) {return (a > b ? a : b);
}int min(int a, int b) {return (a > b ? b : a);
}int sum(int a, int b) {return a + b;
}int main() {int a, b, res;cout << "请输入整数a:"; cin >> a;cout << "请输入整数b:"; cin >> b;res = computer(a, b, &max);cout << "Max of " << a << " and " << b << " is " << res << endl;res = computer(a, b, &min);cout << "Min of " << a << " and " << b << " is " << res << endl;res = computer(a, b, &sum);cout << "Sum of " << a << " and " << b << " is " << res << endl;return 0;
}

结果:

现在再说python的情况:

        类似上面,编写三个函数:求两个整数的最大值,最小值,和。分别用这三个函数作为实参,测试computer函数。在调用max,min,sum时,这三个函数就是此处的回调函数。

def computer(a, b, func):return func(a, b)def max(a, b):return [a, b][a < b]def min(a, b):return [a, b][a > b]def sum(a, b):return str(int(a) + int(b))if __name__ == "__main__":a = input("请输入整数a:")b = input("请输入整数b:")res = computer(a, b, max)print("Max of " + a + " and " + b + " is " + res)res = computer(a, b, min)print("Min of " + a + " and " + b + " is " + res)res = computer(a, b, sum)print("Sum of " + a + " and " + b + " is " + res)

结果:

PS:一开始在测试上面python代码的时候,我没有加类型转换str()和int(),出现了输出 Sum of 5 and 12 is 512 的情况。看来python用起来是方便,但是编译器帮我们做了太多的事情,有时候会让我们忽略一些程序的本质,所以不能光学python啊,c++还是要多看看,有助于对程序本质的理解。

        说白了,回调函数和普通函数在定义的时候没有什么区别,只有在调用时才看出来是不是回调函数,正常调用就是普通函数,作为一个函数的参数在需要的时候分情况调用,就是回调函数。

        另外,回调函数还可以进行异步调用,即非阻塞调用,通常用在多线程或者多进程中。暂时没用到,先了解。

参考:彻底弄懂python3中的回调函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sqli-labs靶场第13关详解[Sqli-labs-less-13]

Sqli-labs-Less-13 #手工注入 post传参了 根据题目看&#xff0c;像一个登录页面&#xff0c;尝试使用布尔型盲注测试能否登录网站 1. Username输入a 测试是否会有报错&#xff0c;burp抓包 报错&#xff1a;syntax to use near a) and password() LIMIT 0,1 at line 1 分…

[python] `json.dumps()` TypeError: Object of type set is not JSON serializable

在Python中&#xff0c;当你尝试将一个集合&#xff08;set&#xff09;类型的对象转换为JSON格式时&#xff0c;可能会遇到“TypeError: Object of type set is not JSON serializable”的错误。这是因为标准的JSON格式不支持Python中的集合类型&#xff0c;JSON格式支持的数据…

【04】C语言括号匹配问题

欢迎来到土土的博客~&#x1f973;&#x1f973;&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;C语言系列函数实现 题目描述&#xff1a; 给定一个只包括 ‘(’&#xff0c;‘)’&#xf…

加密隧道技术

在现在的互联网上传输数据&#xff0c;首要考虑的就是安全。这关乎到你的隐私&#xff0c;个人信息&#xff0c;财产安全等等重大问题。如果你的程序本身传输的信息没有加密&#xff0c;也可以通过其他辅助方式让你的通信加密。一些工具的就是为了解决这样的场景的&#xff0c;…

之前续写抖音开发者接入字节小游戏的缓存一下,现在说一下在 Windows 或者 Mac 如何用终端更换路径?

window: 比方说你的 window 目录下是这个路径: 第一:E:\project\Q1\trunk\client\src,然后你想切换到下一个路径的话,你可以这样子操作: 第二:E:\project\Q1\trunk\client\src> cd .\usersetting 然后回车,这里不会计较大小写 第三:你就可以在这个目录下执行你的脚本:E:…

学习大数据,所必需的java基础(7)

文章目录 File类File 的静态成员File的构造方法File的获取方法相对路径和绝对路径File的创建方法File类中的删除方法File的遍历方法 字节流IO流介绍以及输入输出以及流向的介绍IO流的流向IO流分类IO流分类 OutputStream中的子类FileOutoutStream的介绍以及方法的简单介绍InputS…

服务器中如何检查端口是否开放

有多种方法可以检测服务器端口是否开放。以下是一些常用的方法&#xff1a; 1. Telnet 命令&#xff1a; 使用 Telnet 命令来测试端口的可达性。在命令提示符或终端中执行以下命令&#xff1a; telnet your_server_ip your_port_number 如果连接成功&#xff0c;表示端口是…

C++ //练习 10.22 重写统计长度小于等于6 的单词数量的程序,使用函数代替lambda。

C Primer&#xff08;第5版&#xff09; 练习 10.22 练习 10.22 重写统计长度小于等于6 的单词数量的程序&#xff0c;使用函数代替lambda。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********************************…

PDF标准详解(二)——PDF 对象

上一篇文章我们介绍了一个PDF文档应该包含的最基本的结构&#xff0c;并且手写了一个最简单的 “Hello World” 的PDF文档。后面我们介绍新的PDF标准给出示例时将以这个文档为基础&#xff0c;而不再给出完整的文档示例&#xff0c;小伙伴想自己测试可以根据上一节的文档来进行…

分布式ID选型对比(3)

redis自增 一, 引入依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.6.5</version> </dependency> 二, 配置信息: spring:redis:# 地…

YOLOv8有效涨点,添加GAM注意力机制,使用Wise-IoU有效提升目标检测效果

目录 摘要 基本原理 通道注意力机制 空间注意力机制 GAM代码实现 Wise-IoU WIoU代码实现 yaml文件编写 完整代码分享&#xff08;含多种注意力机制&#xff09; 摘要 人们已经研究了各种注意力机制来提高各种计算机视觉任务的性能。然而&#xff0c;现有方法忽视了…

【C/C++随笔】static 的用法和作用

「前言」所有文章已经分类好&#xff0c;放心食用 「归属专栏」C语言 | C嘎嘎 「主页链接」个人主页 「笔者」枫叶先生(fy) static 的用法和作用&#xff1f;&#xff1f;&#xff1f; static作用&#xff1a; 作用1修改存储方式&#xff1a;用 static 修饰的变量存储在静态区…

项目解决方案: 实时视频拼接方案介绍(中)

目 录 1.实时视频拼接概述 2.适用场景 3.系统介绍 4. 拼接方案介绍 4.1基于4K摄像机的拼接方案 4.2采用1080P平台3.0 横向拼接 4.2.1系统架构 4.2.2系统功能 4.2.3方案特色 4.2.4适用场景 4.2.5设备选型 4.3纵横兼顾&#xff0c;竖屏拼接 4.3.1系统…

如何使用ArcGIS Pro创建最低成本路径

虽然两点之间直线最短&#xff0c;但是在实际运用中&#xff0c;还需要考虑地形、植被和土地利用类型等多种因素&#xff0c;需要加权计算最低成本路径&#xff0c;这里为大家介绍一下计算方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载…

十四、计算机视觉-形态学梯度

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、梯度的概念二、梯度的应用三、梯度如何实现 一、梯度的概念 形态学梯度&#xff08;Morphological Gradient&#xff09;是数字图像处理中的一种基本操作&…

MATLAB中回调定义

目录 指定回调的方法 回调函数语法 传递额外输入参数 将回调定义为默认值 指定回调的方法 要使用回调属性&#xff0c;将回调代码赋予该属性。使用以下技术之一&#xff1a; 引用函数执行的函数句柄。 包含函数句柄和其他参数的元胞数组 计算为有效 MATLAB 表达式的字符向…

pytorch 图像的卷积操作

目录 1.卷积核基本参数说明 2.卷积相关操作说明 3.卷积操作示例 1.卷积核基本参数说明 pytorch进行图像卷积操作之前&#xff0c;需要把图像素格式进行分离&#xff0c;比如一个图像为rgb格式&#xff0c;把R&#xff0c;G,B取出来作为一个ndarray&#xff0c;前文讲过&#…

Linux 下 socket 编程介绍及 TCP 客户端与服务端创建示例

目录 socket 编程接口TCP 服务端TCP 客户端更多内容 本文介绍了 Linux 下的 socket 编程&#xff0c;及总结了使用 socket 接口实现 TCP 服务端和客户端的示例代码。 socket 编程接口 socket() 函数&#xff1a;用于创建一个新的 socket 描述符&#xff1a; int socket(int …

Linux内核MMC框架

1.mmc的概念 1.MMC MultiMedia Card&#xff0c;多媒体存储卡&#xff0c; 但后续泛指一个接口协定&#xff08;一种卡式&#xff09;&#xff0c;能符合这接口的内存器都可称作mmc储存体,工作电压&#xff1a;高电压为2.7&#xff5e;3.6 V&#xff0c;低电压为1.65&#xf…

【微服务】微服务中常用认证加密方案总结

目录 一、前言 二、登录认证安全问题 3.1 认证方式选择 三、常用的加密方案 3.1 MD5加密算法 3.1.1 md5特点 3.1.2 md5原理 3.1.3 md5使用场景 3.2 AES加密算法 3.2.1 AES简介 3.2.2 AES加解原理 3.2.3 AES算法优缺点 3.2.4 AES算法使用场景 3.3 RSA加密算法 3.3…