L13-理解Python中的特殊的返回值-函数
文章目录
- 说明
- 1.初识返回值-函数
- 2. 辨识函数对象
- 3. 闭包的注意事项
- 谨记
- 如何避免?
说明
在Python中,一切函数即对象。函数同时也可视作变量,作为一个返回值。下面通过实际案例来说明下,当函数作为返回值时的使用方式与注意事项
1.初识返回值-函数
- 立即执行函数,获取结果集
def calc_sum(*args):ax = 0 for n in args:ax = ax + nreturn ax# 场景1:执行函数,会立即执行,并得到结果集
calc_sum(1, 3, 9)
- 将函数作为返回值,输出并执行
# 另一种场景,不需要立即求和,
def lazy_sum(*args):def sum():ax = 0 for n in args:ax = ax+nreturn axreturn sumf = lazy_sum(1, 3, 9)
# 这里输出的是函数对象
print(f)
# 再调用函数 f() ,得到执行结果
f()
2. 辨识函数对象
下面来看看,当给定一组相同的输入参数,得到两个不同的返回函数对象是否相等。
# 每次调用lazy_sum()时,都会返回一个新的函数
f1 = lazy_sum(1, 3, 9)
f2 = lazy_sum(1, 3, 9)
# 且是不同的对象
f1 is f2
# False
可见,虽然输入参数一样,但二者并不是同一个对象。
3. 闭包的注意事项
- 内部函数中引用了外部函数的局部变量
- 返回的函数并没有立刻执行,而是直到调用了f()才执行
内部函数sum()引用外部函数lazy_sum()的局部变量 *args时,可能会导致意料之外的结果 。请看如下示例。
def count():fs = []# 外部函数的局部变量ifor i in range(1, 4):# 注: 这里定义f()函数时,并未传入参数def f():# 对外部变量作运算操作、并返回return i*i# 添加的是函数对象f,而不是f(),更不是f(i)fs.append(f)# 返回列表对象return fs
# 执行
f1, f2, f3 = count()
print(f1(), f2(), f3())
# 9,9,9
你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际是 9,9,9。
正是因为内部函数中引用了外部函数中的变量 i ,但它并非立即执行,等3个函数都返回时,变量i已经变为了3,导致最终结果为 9
谨记
返回函数不要引用任何循环变量,或者后续会发生变化的变量
如何避免?
再创建一个函数,用该函数的参数绑定循环变量当前的值。
无论该循环变量后续如何更改,已绑定到函数参数的值不变
def count():fs = []for i in range(1, 4):def f(i):def g():return i*ireturn g# 添加的是 f(i) ,不是f,也不是f() fs.append(f(i))return fs f1, f2, f3 = count()
print(f1(), f2(), f3())
L13-理解Python中的特殊的返回值-函数相关推荐
- linux中popen汉字乱码,Python中使用subprocess.Popen返回值乱码解决方案
Python中使用subprocess.Popen返回值乱码解决方案 问题描述 在python 2.7中,使用subprocess.Popen()调用*nix命令,并通过管道,获取其输出,并将其返回值 ...
- python中使用cv2.findContours返回值too many values to unpack (expected 2)错误如何解决
python中使用cv2.findContours返回值too many values to unpack (expected 2)错误如何解决 具体原因: opencv-python 版本还有一定关 ...
- python中return的理解-python中的return的返回与执行
author:headsen chen date:2018-03-21 15:12:09 notice:created by headsen chen himself and not allowed ...
- qdialog 返回值_如何从Python中的QDialog实例返回值?
我想打开一个QtGui.QDialog,从用户请求一组值,然后在单击"保存"后返回值.在 下面的代码应该在不修改的情况下运行.在import sys from PySide imp ...
- python中os.system.获取输出信息_python中os.system()的返回值
[python中os.system()的返回值] 如果第三方程序返回的是布尔型返回值,os.system会将true转为1,false转为0进行返回. 问题: /bin/xxx.py是一个返回码为1的 ...
- python os.system保存返回值_python中os.system的返回值
python中os.system()的返回值 1.python中的 os.system(cmd)的返回值与linux命令返回值(具体参见本文附加内容)的关系 你们都习惯用os.systemv()函数执 ...
- python装饰器作用-理解python中的装饰器
一 什么是装饰器? 正如其名,装饰器的作用是为已经存在的对象增加额外功能(装饰),由此可使已有函数在无需代码改动的情况下增加额外功能:装饰器的本质是嵌套的函数且返回函数对象,即闭包.有关闭包的概念,可 ...
- 全面理解python中self的用法
self代表类的实例,而非类. class Test:def prt(self):print(self)print(self.__class__)t = Test() t.prt() 执行结果如下 & ...
- pythonself用法_全面理解python中self的用法
self代表类的实例,而非类. classTest:defprt(self):print(self)print(self.__class__) t=Test() t.prt() 执行结果如下 从上面的 ...
最新文章
- 清理系统盘遇到的问题
- 【UDP协议头解析】
- java wrap方法_Java WritableCellFormat.setWrap方法代码示例
- linux常见基础服务,常用的linux命令的基本使用(一)
- vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn
- CSS 行内级元素和行内框
- Codeforces Round #147 (Div. 2) E. Build String 最小费用最大流
- silverlight打开和保存文件
- fastdfs返回的url_FastDFS上传文件Demospringboot实现
- HMM(隐马尔可夫模型)
- 问题记录:net::ERR_CERT_DATE_INVALID
- 计算机操作系统有哪几个管理功能,操作系统管理功能有哪几种
- 作为运营,如何在职场上野蛮生长
- matlab边坡可靠性分析,滇西南地区高速公路高边坡调查及抗震稳定性分析
- 转】用Mahout构建职位推荐引擎
- 使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
- 物联网专业属于计算机的哪个门类,物联网工程专业属于什么门类
- 【正本清源】Synchronized 源码全解之偏向锁的获取(基于 Openjdk12)
- [Vue warn]: Unknown custom element: vhead - did you register the component correctly? For recursiv
- 甲骨文发布适用于 MongoDB 的 Oracle Database API;Chrome 和 Edge 互相“拉踩”;树莓派驱动程序现可在 Android 上运行 | 开源日报
热门文章
- 腾讯信鸽 php sdk,关于信鸽SDK(腾讯云推送)使用指北
- Google受隐私问题困扰 或放弃欧洲版街景服务
- Excel函数应用实例:计算零存整取未来值(转)
- WordPress自媒体主题:Zibll V3.0 bate(免费下载)
- 标量衍射理论计算光栅衍射效率
- 英文版-Hillsong Still 安静(现场)
- 美国计算机语言互动软件,美华裔研发文字语音转换软件 便利盲人操作电脑
- Golang 使用http Client下载文件
- 智能车基础四轮组”氢气球“----(1)软件基础框架
- BUUCTF MISC 小明的保险箱