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() 执行结果如下 从上面的 ...
最新文章
- return true Java_[Java教程]js中return,return true,return false的用法及区别
- 【转】深入探讨 Android 传感器
- java中保留两位小数(四舍五入后)
- oppo r17听筒测试软件,【OPPOR17评测】ColorOS变智能 OPPO R17堪称生活小秘书(全文)_OPPO R17(6GB RAM/全网通)_手机评测-中关村在线...
- java桥_JAVA 桥模式
- poi comment
- selenium 控制ie_Python爬虫---Selenium的简单介绍
- 【python】面向对象类、对象的介绍
- php gtk教程,PHP-GTK 介绍及其应用-PHP教程,PHP应用
- DataX不支持Mysql8.x
- 【CSP201803-1	】跳一跳,简单模拟
- 获取音频频响和失真_专业音响设备_音频功放失真的四大要点及改善方法
- html---表单实例代码
- 计算机一级考试ppt知识点,计算机一级考试考点:PPT演示文稿
- 调查:人工智能技术的应用现状
- 跨月作废发票,红字冲红注意事项 如何整理上交发票
- 大案牍术——我们或是只是一串数字
- linux下weblogic新建域domian
- 判断字符串子序列【python】
- 2022年国内外大数据工程师薪资大比拼
热门文章
- Navicat Premium 12 卸载和注册表的删除
- Centos7 安装Httpd服务并浏览器中测试http页面
- 2021安徽计算机二级报名时间,2021年3月安徽计算机二级报名时间|网上报名入口【12月29日开通】...
- MEM/MBA 考研高频单词总结(09)
- flume ChannelSelector -- channel 选择器
- 【用户增长】用户增长方法论及增长思维
- 张正友相机标定算法原理与源代码(OpenCV+C++)
- 自然语言处理(NLP)初识
- 【合约开发工具】合约的开源与验证
- 5G#DVEV (Development environment-开发环境)