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

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

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

 

对于Python中回调函数的理解的更多相关文章

  1. java中回调函数的理解

    一,案例一 "通常大家说的回调函数一般就是按照别人(李四)的定好的接口规范写,等待别人(张三)调用的函数,在C语言中,回调函数通常通过函数指针来传递:在Java中,通常就是编写另外一个类或类 ...

  2. python中strip()函数的理解

    1.strip()函数 函数原型 声明:s为字符串.rm为要删除的字符序列 s.strip(rm) :删除s字符串中开头.结尾处.位于 rm删除序列的字符 s.lstrip(rm) :删除s字符串中开 ...

  3. 什么是工厂函数?Python 中工厂函数怎么理解?(转)

    所谓工厂函数就是指这些内建函数都是类对象(实际上是类), 当你调用它们时,实际上是创建了一个类实例. type():查看类型

  4. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

  5. js中的回调函数的理解

    一,常见的但是不是特别注意的回调方法. 1.1,ajax $.ajax({ url:"test.json", type: "GET", data: {usern ...

  6. 回调函数透彻理解Java

    http://blog.csdn.net/allen_zhao_2012/article/details/8056665 回调函数透彻理解Java 标签: classjavastringinterfa ...

  7. js回调函数(callback)理解

    Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...

  8. C++中回调函数(CallBack)的使用

    如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而 ...

  9. JavaScript callback function 回调函数的理解

    来源于:http://mao.li/javascript/javascript-callback-function/ 看到segmentfault上的这个问题 JavaScript 回调函数怎么理解, ...

随机推荐

  1. [Scikit-learn] 1.4 Support Vector Machines - Linear Classification

    Outline: 作为一种典型的应用升维的方法,内容比较多,自带体系,以李航的书为主,分篇学习. 函数间隔和几何间隔 最大间隔 凸最优化问题 凸二次规划问题 线性支持向量机和软间隔最大化 添加的约束很 ...

  2. WebBrowser中html元素如何触发winform事件

    这个问题来自论坛提问,对dom稍微了解的话还是比较简单的,只要注册一下事件就可以了. C#代码如下: using System;using System.ComponentModel;using Sy ...

  3. Java使用选择排序法对数组排序

    编写程序,实现将输入的字符串转换为一维数组,并使用选择排序法对数组进行排序. 思路如下: 点击"生成随机数"按钮,创建Random随机数对象: 使用JTextArea的setTex ...

  4. SpringMVC由浅入深day02_4springmvc校验

    4 springmvc校验 4.1 校验Validation理解 b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可 ...

  5. NetBpm 安装篇(1)

    尊重别人劳动成果 转载注明出处:http://www.cnblogs.com/anbylau2130/p/3875718.html 官方主页 http://www.netbpm.org/docs/in ...

  6. [转]Struts2多个文件上传

    转载至:http://blog.csdn.net/hanxiaoshuang123/article/details/7342091 Struts2多个文件上传多个文件上传分为List集合和数组,下面我 ...

  7. nodejs服务器部署教程四

    nodejs服务器部署最后一篇文章,部署ssl证书,升级http为https,其实网上相关教程有很多,但是略麻烦,本教程让你一切从简,5分钟搞定https,免费一年哦 申请ssl证书 免费申请的机构有 ...

  8. js精准时间迭代器(定时器)

    /** * 精准时间迭代器 * Create By Tujia @2017.05.22 * * 使用示例: * window.setMyInterval(function(){ * console.l ...

  9. 使用 urllib 设置代理服务

    (1) 如果我们一直用同一个IP去请求同一个网站上的网页,久了之后可能会被该网站服务器屏蔽,因此我们可以使用代理IP来发起请求,代理实际上指的就是代理服务器(2) 当我们使用代理IP发起请求时,服务器 ...

  10. Linux 下 c 语言 聊天软件

    这是我学C语言写的第一个软件,是一个完整的聊天软件,里面包括客户端,和服务器端,可以互现聊天,共享文件,有聊天室等,是一个有TCP和UDP协议的聊天软件,测试过很多次在CENTOS和UBUNTU下都通 ...