关于回调函数,网上有很多说明和各种解释,多数在尝试用语言描述。我认为,如果对各个角色之间的关系不清楚,如果没有相关的编程需求,那么语言便非常无力,很难理解。
这是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 urllib def 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)
这是你作为一个使用者,使用别人设计好的函数时的情况。