关于回调函数,网上有很多说明和各种解释,多数在尝试用语言描述。我认为,如果对各个角色之间的关系不清楚,如果没有相关的编程需求,那么语言便非常无力,很难理解。

这是360百科的解释:

  在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
  【什么是其它代码?什么是某一块?什么是可执行?什么是引用?什么是允许?什么是底层代码?什么是高层定义?什么是子程序?这些词,每一个词都有很多含义,如果你理解回调,那么这个定义描述得非常准确,如果你不理解回调,那么等于没说,文字都认识,连起来不知道啥意思。】

这是知乎的一个解释:

  https://www.zhihu.com/question/19801131

还有些用指针来进行说明

   如果一个人不知道回调,他很可能也不了解指针这个C语言中的核心。

一图解千言,一例解千言,下面是一个python中的回调函数例子,可能可以有效地说明什么是回调函数。这个栗子用于下载时展现下载进度。

urlretrieve(url, filename=None, reporthook=None, data=None)

这是urllib.request中的一个函数,用于直接将远程数据下载到本地。

  • url是你要下载的链接
  • 参数 finename 指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
  • 参数 reporthook 是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度
  • 参数 data 指 post 到服务器的数据,该方法返回一个包含两个元素的(filename, headers)元组,filename 表示保存到本地的路径,header 表示服务器的响应头。

  注意看reporthook,现假设你作为一名使用Python做开发的程序员,你不是在为Python开发插件,而是在用现成的插件去实现你的功能,那么,Python语言和它的插件,整体上是封闭的,假设你看不到Python的源代码。

  此时,你要使用urlretrieve这个函数,分以下几种情况:

  1.你可以只用一个参数的,即urlretrieve(url),那么你只能把远程的链接所打开的页面存到本地这个单纯的动作,没有其它功能和反馈。

  2.除了查看那个实际下载的文件是否完成和在控制台中查看程序的执行结束以外,实际上你无法知道1的进度,也无法知道是否下载成功。那么,此时reporthook就有作用了,你需要给urlretrieve传一个你本地函数的名字,带着3个参数(假设这个函数是func(a,b,c),函数名是func),在你无法看到的urlretrieve内部,必要的时候,它会调用你传给它的这个函数(func),把合适的数据赋给这个func的3个参数,然后,你就可以在你本地处理这3个参数,比如,显示出来。

  这三个参数,按顺序分别表示:已经下载的数据块、数据块的大小、远程文件的大小,得到这几个数据,我们就可以得到下载的进度。

  以下是官方文档中的说明:

   If reporthook is given, it must be a function accepting three numeric parameters: A chunk number, the maximum size chunks are read in and the total size of the download (-1 if unknown). It will be called once at the start and after each chunk of data is read from the network. reporthook is ignored for local URLs.

来源:https://docs.python.org/3.6/library/urllib.request.html#module-urllib.request

以下是代码:

import urllibdef cbk(a, b, c): '''回调函数@a: 已经下载的数据块@b: 数据块的大小@c: 远程文件的大小''' per = 100.0 * a * b / c if per > 100: per = 100 print('%.2f%%' % per)url = 'http://www.bing.com'
local = 'd://bing.html'
urllib.urlretrieve(url, local, cbk)

(以上代码来自http://www.nowamagic.net/academy/detail/1302861)

这是你作为一个使用者,使用别人设计好的函数时的情况。

 

转载于:https://www.cnblogs.com/Sabre/p/8150892.html

对于Python中回调函数的理解相关推荐

  1. js中回调函数的理解 举例说明js回调函数

    初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数. 我们先来看看回调的英文定义:A callback is a function that is passed as an arg ...

  2. javascript中回调函数的理解和应用

    一. 什么是回调函数? 被作为实参传入另一函数,并在该外部函数内被调用,用以来完成某些任务的函数,称为回调函数. function f1(fn) {let a =1;console.log(a,'a' ...

  3. python在工厂中的应用_什么是工厂函数?Python 中工厂函数怎么理解?

    其实谈工厂函数前必须首先把嵌套作用域和闭包讲清楚 python有一个很有意思的地方,就是def函数可以嵌套在另一个def函数之中.调用外层函数时,运行到的内层def语句仅仅是完成对内层函数的定义,而不 ...

  4. python中 map函数 的使用

    1. 概念 map函数也是python中的一个内置函数,用法同之前讲过的filter函数类似.map在这里的意思是映射的意思,会根据提供的函数对指定序列做映射. map函数会返回一个迭代器,如果要转换 ...

  5. 彻底理解JavaScript中回调函数 (推荐)

    在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply() ...

  6. MATLAB中的函数句柄 理解

    MATLAB中的函数句柄 理解 https://zhuanlan.zhihu.com/p/266263265 https://blog.csdn.net/kevinhg/article/details ...

  7. python open 打开是什么类型的文件-详解Python中open()函数指定文件打开方式的用法...

    文件打开方式 当我们用open()函数去打开文件的时候,有好几种打开的模式. 'r'->只读 'w'->只写,文件已存在则清空,不存在则创建. 'a'->追加,写到文件末尾 'b'- ...

  8. Java 回调函数的理解

    以下是我对java回调函数的理解,希望对各位有帮助. 简而言之,假设有两个类A与B,还有一个回调接口C(有一个c方法).其中A类持有一个B类对象作为属性和拥有一个a方法,并实现了接口C,所以A类中就有 ...

  9. js回调函数的理解(轉)

    js回调函数(callback)理解Mark!讲之前说一句function say(){alert(,,,,,,,,)}var say=function (){alert(,,,,,,,)}var s ...

最新文章

  1. VS Code配置PHP XDebug
  2. linux string split,linux下awk内置函数的使用(split/substr/length)
  3. php是独立服务吗,在LNMP服务器中,PHP是作为一个独立的服务存在的,这个服务叫做_______。...
  4. ACCESS中的Update语句不支持Select的解决办法
  5. 设计模式3:装饰模式
  6. 天下第一 txdy (LCT+双指针+线段树)
  7. intellij IDEA--- 报inspects a maven model for resolution problems
  8. pycharm安装教程,超详细
  9. 《微信公众平台入门到精通》,青龙老贼,详情版本
  10. php在linux中执行外部命令
  11. 2018年我国人均国民总收入达到9732美元,国民经济持续快速增长
  12. 自棱镜事件,隐私保护搜索引擎DuckDuckGo流量增长600%
  13. 为什么局域网IP通常以192.168开头而不是1.2或者193.169?
  14. 会议及作用篇--项目管理(十六)
  15. 搞笑生活短视频为何涨粉飞快?有三个原因,抓住用户心理是关键
  16. python绘制函数曲线
  17. Me and My Girlfriend:1
  18. Android客户端与PHP服务端API接口Token安全验证
  19. 几种典型的立体匹配算法
  20. 杰里之主动降噪与物理降噪的区别【篇】

热门文章

  1. 遥远的救世主:电视剧《天道》
  2. 关于Linux内核的一些问题
  3. python格式化输入_python-格式化(%,format,f-string)输出+输入
  4. 苹果手机怎么拍星空_手机怎么拍星空
  5. oracle:用户购买平台案例分析与优化
  6. 【Flink】FLink assigned slot xx was removed
  7. 【Elasticsearch】如何设计可扩展的 Elasticsearch 数据存储的架构
  8. 【Elasticsearch】es mapper_parsing_exception
  9. 【Mac】mac 安装Axure RP 8 点不开 就一直跳-后闪退-报错Expected an Int64 but got a System.UInt64
  10. 【Docker】Docker 安装 Prometheus并且交给 grafana