python中的回调函数,python回调函数的使用方法

  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

  {"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"...省略"}

本文来自 python教程 栏目,欢迎学习!以上就是Python中回调的含义详解的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: