对于回调函数的理解

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

这是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

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

 

原文地址:https://www.cnblogs.com/Sabre/p/8150892.html

时间: 2024-08-29 19:50:39

对于回调函数的理解的相关文章

js回调函数(callback)理解

Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函数了.不懂啊,于是在google回调函数,发现网上的中文解释实在是太“深奥”了,我承认自己才疏学浅了.看了几个回调的例子后,貌似有点理解了.下面是我对回调函数的理解,要是理解错了,请指正,不甚感激. 首先还是从jquery网站上的英文定义入手,身为国人,我真感到悲剧.一个回调的定义被国内的“高手”解

Android中回调函数的理解---本人Android纯新手

本人大二,刚刚接触Android,也刚刚申请的cnblog博客,说一下对Android中回调函数的理解,Android中回调函数和C++.JAVA中的默认构造函数差不多,即运行到了一定的代码时自动调用的代码,而Android中的回调函数和C++.JAVA中的默认构造函数的区别在于:C++.JAVA中的默认构造函数在创建一个对象时自动调用,而Android中的回调函数的自动调用是在比如按了HOME键之后.

JS 对于回调函数的理解,和常见的使用场景应用,使用注意点

  很经常我们会遇到这样一种情况: 例如,你需要和其他人合作,别人提供数据,而你不需要关注别人获取或者构建数据的方式方法. 你只要对这个拿到的数据进行操作. 这样,就相当于我们提供一个外在的函数,别人调用这个函数,返回相应的数据. 例如: ? 1 2 3 4 5 6 7 8 function (num , numFun) { if(num < 10){ //do sth }else { //do sth numFun(); } } 在num的判断之后执行NumFun的函数. 所谓的回调函数,可以

JavaScript回调函数的理解

这里是个人对回调函数的一段理解 <!DOCTYPE html> <html> <head> <title>回调函数</title> </head> <script type="text/javascript"> function testfun(){ alert("hello"); } //i = testfun();//会执行 //i = testfun; // 将首地址给了i /

JS回调函数(理解篇)

概述: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 定义: 在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A.我们就说函数A叫做回调函数.如果没有名称(函数表达式),就叫做匿名回调函数. 因此callba

关于js的callback回调函数的理解

回调函数的处理逻辑理解: 所谓的回调函数处理逻辑,其实就是先将回调函数的代码 冻结(或者理解为闲置),接着将这个回调函数的代码放到回调函数管理器的队列里面. 待回调函数被触发调用的时候,对应的回调函数的代码才会从管理器队列取出来并自动执行(激活回调函数的代码),实现异步的编程效果. 不过,对于一些必须要等回调函数执行完毕才可以确定的动作,实际上,就是会掉入一个层层回调的局面了.这点也是回调函数的复杂的地方! 换句话说,只要您要获取的值是要被回调才确定的,那接下来的所有代码都必须用回调的方式来编写

回调函数透彻理解Java

回调函数,第一次见是在Java编程思想中,以及后来的观察者模式也应用了回调函数的思想.但是一直都没有重视,终于在一次面试的时候吃亏了,越来越理解为什么很多人说Java编程思想这本书要一遍遍的看,吃透! 首先在网络上搜索很多文章介绍什么是回调函数,看的云里雾里的.后来自己一步步分解终于理解了,记录如下. 从维基百科上面摘抄定义:(看完本篇文章再来理解这个定义) 在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的

回调函数及其理解

最近在学习NodeJS的时候看到了NodeJS的回调函数,以前也听过,仔细一想发现自己根本就不知道回调具体是什么,于是决定百度弄清楚,我的理解如下: 1.回调函数是什么? 打个比方,当你写了两个窗体程序,通过一个窗体1打开另外一个独立的窗体2,需要通过窗体2来操作窗体1的时候,怎么办?封装使得窗体2 的类是不可以访问到窗体1中的元素和方法的,所以可以在创建窗体2的时候将窗体1的一个指针(这里只是一个说法,传一个自己的代表过去)传给窗体2作为参数,这样窗体2就可以利用该指针来操作窗体1了. 2.回

转Java 回调函数的理解

所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数.例如Win32下的窗口过程函数就是一个典型的回调函数.一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供.由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数.Web Service以及Java的RMI都用到回调机制,可