理解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中的回调函数

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PCIE 4.0 Power Mangement

PCIe总线的电源管理包含了ASPM和软件电源管理两方面的内容&#xff0c;所谓ASPM是指PCIe路在没有系统软件参与的情况下&#xff0c;由PCIe链路自发进行的电源管理方式&#xff1b;而软件电源管理是指PCI-PM机制&#xff08;与PCI总线兼容&#xff09;。 1. Link State Power M…

Python爬虫——Urllib库-1

这几天都在为了蓝桥杯做准备&#xff0c;一直在刷算法题&#xff0c;确实刷算法题的过程是及其的枯燥且枯燥的。于是我还是决定给自己找点成就感出来&#xff0c;那么Python的爬虫就这样开始学习了。 注&#xff1a;文章源于观看尚硅谷爬虫视频后笔记 目录 Urllib库 基本使…

【深蓝学院】移动机器人运动规划--第7章 集群机器人运动规划--笔记

文章目录 0. Contents1. Multi-Agent Path Finding (MAPF)1.1 HCA*1.2 Single-Agent A*1.3 ID1.4 M*1.5 Conflict-Based Search(CBS)1.6 ECBS1.6.1 heuristics1.6.2 Focal Search 2. Velocity Obstacle (VO&#xff0c;速度障碍物)2.1 VO2.2. RVO2.3 ORCA 3. Flocking model&am…

【Leetcode】2369. 检查数组是否存在有效划分

文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的整数数组 nums &#xff0c;你必须将数组划分为一个或多个 连续 子数组。 如果获得的这些子数组中每个都能满足下述条件 之一 &#xff0c;则可以称其为数组的一种 有效 划分&#xff1a; 子数组 恰 由 2 个…

C/C++ 迷宫游戏

游戏介绍 这个迷宫探险游戏有以下功能&#xff1a; 探险&#xff1a;选择该选项后&#xff0c;玩家会进入地下迷宫进行探险。在随机事件中&#xff0c;可能会遇到陷阱、发现金币或者什么都没有发生。陷阱会使玩家失去一定的生命值&#xff0c;金币可以增加玩家的金币数量。 休…

ToDesk - macOS 上轻便好用的远程控制

文章目录 官网 https://www.todesk.com个人版&#xff08;免费&#xff09;下载地址&#xff1a; https://www.todesk.com/download.html 支持系统类型 Windows、macOS、Android、iOS、Linux 应用大小为 320MB 左右 使用界面

SpringBoot整合rabbitmq-主题交换机队列(四)

说明&#xff1a;Topic主题交换机它的大致流程是交换机和一个或者多个队列绑定&#xff0c;这个绑定的Routingkey是包含通配符的&#xff0c;满足通配符的队列会接收到消息。 通配符规则&#xff1a; #&#xff1a;匹配一个或多个词 *&#xff1a;匹配一个词 例如&#xff…

2024年工控人职场求生之路

2024年&#xff0c;眼看项目多了活儿忙了 工控工程师们开始上演飞驰人生 不是跑去客户那里调设备 就是在电脑上搭项目做画面搭系统 每天都过热辣滚烫 你说忙吧&#xff0c;每天也就干那些事儿 你说多有成就感呐 我觉得我能有绝对的主导权和话语权 那都是天方夜谭 2024年…

给孩子选台灯什么样的好?2024年最值得购买的护眼台灯推荐

自从孩子上学以后&#xff0c;很多家长就一直给孩子添置各种各样的学习用品&#xff0c;例如专用的学习桌椅、书架&#xff0c;不过随着作业的增多&#xff0c;发现最需要的物品就是一盏好的护眼台灯。然而有些商家为了降低成本&#xff0c;不惜牺牲产品质量&#xff0c;使用没…

没有项目经历,该如何写简历?

没有项目经历&#xff0c;我该如何写简历 一、前言二、挖掘自己三、看现成的项目经验&#xff0c;转化成自己的语言1、硬件方面2、软件方面 四、最后 一、前言 相信有很多刚出来找工作的人会遇到这种情况&#xff0c;因为自身没有项目经历&#xff0c;投了很多的简历都石沉大海…

【详识JAVA语言】逻辑控制

概述 我的曾经&#xff1a; 早上8:00起床--->洗漱--->吃早饭--->上课--->吃午饭--->上课--->运动--->吃完饭--->玩手机--->睡觉 每天的生活貌似都是这么规律&#xff0c;顺序的做着每件事&#xff0c;前途一片渺茫~~~ 直到有一天&#xff1a; 我…

外卖点餐小程序二合一自由切换商业运营版 带完整的搭建教程

“外卖点餐小程序二合一自由切换商业运营版”的源码&#xff0c;是基于当前最流行的移动应用开发框架开发的。它整合了前端展示、后端管理、数据库存储等多个功能模块&#xff0c;为用户提供了一个高效、稳定、易于维护的外卖点餐解决方案。这套源码不仅适用于初创企业快速搭建…

基于ssm疫情期间高校防控系统+vue论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;学生信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广大…

#stm学习总结 (二十八)硬件随机数实验

28.1 随机数发生器简介 STM32F407 自带了硬件随机数发生器&#xff08;RNG&#xff09;&#xff0c;RNG 处理器是一个以连续模拟噪声为基础的随机数发生器&#xff0c;在主机读数时提供一个 32 位的随机数。 28.1.1 RNG 框图 STM32F407 的随机数发生器&#xff08;RNG&#x…

ShardingJdbc实战-分库分表

文章目录 基本配置分库分表的分片策略一、inline 行表达时分片策略algorithm-expression行表达式完整案例和配置如下 二、根据实时间日期 - 按照标准规则分库分表标准分片 - Standard完整案例和配置如下 基本配置 逻辑表 逻辑表是指&#xff1a;水平拆分的数据库或者数据表的相…

Nodejs+vue汽车保养美容管理系统vscode前后端分离项目

汽车美容保养管理系统后台采用nodejs语言开发,前台页面和后台管理页面使用vue等技术开发,使用MySql作为数据持久化存储工具对汽车美容保养管理系统的用户等角色权限对应的功能等进行存储。采用vsocde集成IDE对汽车美容保养管理系统统进行开发,整合系统的各个模块。 拟开发的汽车…

Java字符串相关类的底层原理

Java字符串相关类的底层原理

SpringBoot底层原理

SpringBoot底层原理 一 配置优先级 1.配置方式 Springboot中支持三种配置方式&#xff0c;分别为&#xff1a; application.propertiesapplication.ymlapplication.yaml 2.配置优先级 当存在多份配置文件时&#xff0c;配置文件会按照它们的优先级生效。 优先级从高到底…

unity后期

unity|后处理篇 前言一、Post-Processing 1、 Post-Processing的使用2、Post-Processing后处理效果 抗锯齿①、Ambient Occlusion 环境光遮蔽②、Auto Exposure 自动曝光③、Bloom 辉光/泛光④、Chromatic Aberration | 色差⑤、Color Grading 色调/颜色分级⑥、Depth Of Fiel…

第九届数学与人工智能国际会议 (ICMAI 2024)即将召开!

2024年第九届数学与人工智能国际会议将于2024年5月10-12日在中国北京召开。本届会议由北京工业大学主办&#xff0c;旨在促进应用逻辑、算法与复杂性研究&#xff0c;使用数学的方法促进人工智能理论与应用发展&#xff0c;加深学术交流与合作。我们热忱欢迎从事相关技术研究的…