(十八)python 3 回调函数
回调函数:把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
通俗理解就是:把一个函数作为参数传给另一个函数,第一个函数称为回调函数。这个被传入的参数其实是函数指针,即指向一个函数的指针(地址)。
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类: 同步调用、回调和异步调用。
- 同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;
- 回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;
- 异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口.
回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础,因此,下面我们着重讨论回调机制在不同软件架构中的实现
案例一
import random as rd # -----------被调用方----------------------------
def newRN(fn): # 生成10个[0,1)之间小数
ns = []
for i in range(10):
n = round(rd.random(), 2)
ns.append(n) # 不用直接 return, 因为调用方 通知不接返回结果
# 改成回调函数方式
fn(ns) # 调用是调用方函数,这一操作称之为回调 # ----------------调用方------------------------ # 定义回调函数
def abc(*args):
# 进入到本函数内,意味着被调用方函数已执行完
print('生成数据成功')
print(args) newRN(abc)
案例二
import random as rd
import time def test(fn, n):
"""
测试生成 n 个随机数需要的时间(秒)
:param fn: 回调函数
:param n: 生成的数量
:return:
"""
start_time = time.time() # 开始时间 for i in range(n):
rd.random()
time.sleep(0.1) # 让CPU休眠0.1秒 end_time = time.time() # 循环结束的时间
seconds = round(end_time - start_time) # 执行的时间
fn(seconds,n) # 回传用时(秒),n 生成的数量 def test_callback(tm_s,n):
print('生成 {0}个数,用时 {1} 秒'.format(n, tm_s)) test(test_callback, 20)
案例三
def findNumbers(path, num, fn):
l = []
rowNo = 1
with open(path, 'r+') as f:
for line in f.readlines():
index = line.find(str(num))
if index != -1:
l.append((rowNo, index + 1))
rowNo += 1
fn(l) def callback_(sl):
print(sl) findNumbers('222.txt', 5, callback_)
(十八)python 3 回调函数的更多相关文章
- 十八. Python基础(18)常用模块
十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...
- 八. Python基础(8)--函数
八. Python基础(8)--函数 1 ● 函数返回布尔值 注意, 自定义的函数也可以是用来作逻辑判断的, 例如内置的startswith()等函数. def check_len(x): ' ...
- Python学习第十八篇——低耦合函数设计思想
import json 2 def greet_user(filename): 3 try: 4 with open(filename) as f_obj: 5 username = json.loa ...
- python 自定义回调函数
回调函数用起来比较爽.特别是在js中,满世界全是回调,那么在python中,怎么来优雅地实现自己的回调函数呢 下面贴一个我写的例子 class BaseHandler(object): def cra ...
- 对于Python中回调函数的理解
关于回调函数,网上有很多说明和各种解释,多数在尝试用语言描述.我认为,如果对各个角色之间的关系不清楚,如果没有相关的编程需求,那么语言便非常无力,很难理解. 这是360百科的解释: 在计算机程序设计中 ...
- 十八 Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式
我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/env python # -*- coding:utf8 -*- from scrapy.cmdline import ...
- Python之回调函数
在计算机程序设计中,回调函数,或简称回调(Callback),是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 有两种类型的回调函数:即bloc ...
- 初识python: 回调函数
回调函数 简单理解就是:将一个函数通过参数的形式传递给另一个函数 #!/user/bin env python # author:Simple-Sir # time:2019/8/9 10:49 # ...
- python 的回调函数
回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.有些库函数(library function)却 ...
随机推荐
- 【转】有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?
Apple 算是最重视应用开发体验的公司了.从Xib到StoryBoard,从Auto Layout到Size Class,每一次的更新,都会给iOS应用的开发带来不小的便利.但是,对于绝对多数i ...
- bzoj1878 [SDOI2009]HH的项链【莫队】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1878 以每个询问左端点所属的块的编号为第一关键字,右端点本身为第二关键字,排序,然后保利扫描 ...
- Educational Codeforces Round 20 B
Description You are given the array of integer numbers a0, a1, ..., an - 1. For each element find th ...
- Odd sum CodeForces - 797B
Odd sum CodeForces - 797B 好方法:贪心 贪心2 糟糕(不用动脑)的方法:dp ans[i][0]表示到第i个和为偶数最大,ans[i][1]表示到第i个和为奇数最大. 但是, ...
- C. Memory and De-Evolution 逆向思维
http://codeforces.com/contest/712/problem/C 要使得把三角形由边长n变成m,等价于由m变成n 如果是从n变成m,则很难判断每次判断变成多少.比如22的变成4, ...
- eclipse 闪退原因
电脑关机后 重启发现eclipse竟然打不开了,打开出现闪退,原因是: 1.JDK版本不一致,或者你电脑上安装了多个版本: 2.环境变量:安装了其他软件比如:oracle 它自带有一个较低版本的JDK ...
- vue中引入字体图标报错,找不到字体文件
在用vue + webpack进行开发的时候,在引用字体图标遇到字体无法加载的问题: 报以下错误 搞了好久没搞定,最后才找到解决方法(还是没有找到原因) 修改字体图标的css中引入字体文件的路径 以前 ...
- Verilog设计中的锁存器
问题: 什么是锁存器? 什么时候出现锁存器? 锁存器对电路有什么影响? 如何在FPGA设计中避免锁存器? 在FPGA设计中应该避免锁存器.实际上,锁存器与D触发器实现的逻辑功能基本相同,都有暂存数据的 ...
- casting in C++
这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=39 February 20, 2013 casting in C++ Fil ...
- springboot的多个配置文件的关系
一般我们在使用springboot时会用到多个环境下的配置文件,例如 application-dev.yml:开发环境 application-uat.yml:用户验收测试环境 application ...