python中的回调函数,python回调函数的使用方法
回调函数的最初需求背景
回调函数我能想到的最老的场景就是会用在系统编程中。
编程分为两类:
系统编程(系统编程)
应用程序设计(应用程序设计)
(推荐学习:Python视频教程)
什么是系统编程:
所谓系统编程,简单来说就是写各种函数库。比如Windows中的win32和gdi32库,win32可以调用主机硬件和系统层的函数,gdi32可以用来绘制图形。这些库只是等着做应用的人来调用。
什么是应用编程:
而应用编程就是利用各种编写的系统函数库和语言函数库,编写具有一定业务功能的程序,也就是应用。比如一个基本的爬虫可以用python语言和请求库完成,一个基本的网站可以用Java语言和Java Servlet库完成。
系统编程和回调的关系
系统程序员会给自己的库留一些接口,也就是API,供程序员使用。所以在抽象层的图中,库位于应用程序的底部。程序运行时,一般情况下,应用程序会经常通过API调用库中预先准备好的函数。但是,有些库函数要求应用程序先给它传递一个函数,以便在合适的时候调用它来完成目标任务。这个被传入然后被调用的函数叫做回调函数.
如果你对文字感到困惑,那么看看我画的图(下图1):
先理解同步调用,再理解回调。
同步调用是一个阻塞调用,简单来说就是从上到下按顺序执行。回调是一个异步调用序列。
同步呼叫的具体案例可以联系到古代的烽火台。在古代,长城篝火的传递机制类似于同步通话。现在我们假设每个篝火只能看到相邻的篝火状态,每个篝火状态只有亮(点火状态)和暗(不点火状态)。
现在有A、B、C、d四个烽火台,A先亮灯,B看到A的烽火台亮了,就马上点燃,2秒钟就亮了。但此时,C篝火的负责人正在睡觉,而此时,大家都在等着C亮灯。最后,C睡了2个小时,看到B亮了,然后就去亮了。因为D很久没有点燃,篝火出现了问题,所以整个过程都在等待D的完成,(这也引发了一些思考。有时候,同步调用很容易掉链子。如果上一步掉链,下一步之后的操作将结束。)
呼叫的案例代码:
打印(开始)
打印(123)
打印(456)
a=7
如果一个6:
打印(789)
打印(91011)
打印(结束)回调需要解决的问题
通用系统会开发许多具有许多功能的库。但是,有些函数需要调用方根据自己的需要编写要调用的函数。因为这个在写库的时候是无法预测的,只能由调用者输入,所以需要一个回调机制。
回调机制是改进同步调用机制的一种方式,异步调用机制也用于改进同步调用机制。(稍后将撰写一篇文章来介绍这种更重要的异步)
回调函数解决实际问题的一个案例。
回调就是通过以下方式解决上述问题。
函数可以变成参数。
以灵活和定制的方式打电话。
函数可变参数情况
def double(x):
返回2*x
def四倍(x):
返回4*x
#思维功能
def getAddNumber(k,getEventNumber):
返回1 getEventNumber(k)
定义主():
k=1
i=getAddNumber(k,double)
打印(一)
i=getAddNumber(k,四倍)
打印(一)
#呼叫总机
Main()输出结果:
三
5.灵活和定制的呼叫方式(酒店叫醒乘客)案例
这个案例真的是回调的灵魂。假设你是酒店的前台妹子,你无法知道今晚入住的旅客明天是否需要叫醒服务,需要什么样的叫醒服务。
def call_you_phone(次):
叫醒方法:打电话给你。
:param times:呼叫次数
:返回:无
现状
t;
print('已经给旅客拨打了电话的次数:', str(times))
def knock_you_door(times):
"""
叫醒方式: 去敲你房间门
:param times: 敲几次门
:return: None
"""
print('已经给旅客敲门的次数:', str(times))
def no_service(times):
"""
叫醒方式: 无叫醒服务. (默认旅客是选无叫醒服务)
:param times: 敲几次门
:return: None
"""
print('顾客选择无服务.不要打扰他的好梦。')
def front_desk(times, function_name=no_service()):
"""
这个相当于酒店的前台,你去酒店之后,你要啥叫醒方式都得在前台说
这里是实现回调函数的核心,相当于一个中转中心。
:param times:次数
:param function_name:回调函数名
:return:调用的函数结果
"""
return function_name(times)
if __name__ == '__main__':
front_desk(100, call_you_phone) # 意味着给你打100次电话,把你叫醒输出:
已经给旅客拨打了电话的次数:100实际应用(Python的requests库自带的事件钩子)
这个案例就很好解决原本程序是同步机制执行的,但是通过钩子事件,就可以优先去执行一些先行步骤。而这个钩子事件的原理就是函数回调。
import requests输出:def env_hooks(response, *args, **kwargs):
print(response.headers['Content-Type'])
def main():
result = requests.get("https://api.github.com", hooks=dict(response=env_hooks))
print(result.text)
if __name__ == '__main__':
main()
application/json; charset=utf-8本文来自 python教程 栏目,欢迎学习!以上就是Python中回调的含义详解的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!{"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"...省略"}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。