文章目录

  • 说明
  • 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中的特殊的返回值-函数相关推荐

  1. linux中popen汉字乱码,Python中使用subprocess.Popen返回值乱码解决方案

    Python中使用subprocess.Popen返回值乱码解决方案 问题描述 在python 2.7中,使用subprocess.Popen()调用*nix命令,并通过管道,获取其输出,并将其返回值 ...

  2. python中使用cv2.findContours返回值too many values to unpack (expected 2)错误如何解决

    python中使用cv2.findContours返回值too many values to unpack (expected 2)错误如何解决 具体原因: opencv-python 版本还有一定关 ...

  3. python中return的理解-python中的return的返回与执行

    author:headsen chen date:2018-03-21 15:12:09 notice:created by headsen chen himself and not allowed ...

  4. qdialog 返回值_如何从Python中的QDialog实例返回值?

    我想打开一个QtGui.QDialog,从用户请求一组值,然后在单击"保存"后返回值.在 下面的代码应该在不修改的情况下运行.在import sys from PySide imp ...

  5. python中os.system.获取输出信息_python中os.system()的返回值

    [python中os.system()的返回值] 如果第三方程序返回的是布尔型返回值,os.system会将true转为1,false转为0进行返回. 问题: /bin/xxx.py是一个返回码为1的 ...

  6. python os.system保存返回值_python中os.system的返回值

    python中os.system()的返回值 1.python中的 os.system(cmd)的返回值与linux命令返回值(具体参见本文附加内容)的关系 你们都习惯用os.systemv()函数执 ...

  7. python装饰器作用-理解python中的装饰器

    一 什么是装饰器? 正如其名,装饰器的作用是为已经存在的对象增加额外功能(装饰),由此可使已有函数在无需代码改动的情况下增加额外功能:装饰器的本质是嵌套的函数且返回函数对象,即闭包.有关闭包的概念,可 ...

  8. 全面理解python中self的用法

    self代表类的实例,而非类. class Test:def prt(self):print(self)print(self.__class__)t = Test() t.prt() 执行结果如下 & ...

  9. pythonself用法_全面理解python中self的用法

    self代表类的实例,而非类. classTest:defprt(self):print(self)print(self.__class__) t=Test() t.prt() 执行结果如下 从上面的 ...

最新文章

  1. return true Java_[Java教程]js中return,return true,return false的用法及区别
  2. 【转】深入探讨 Android 传感器
  3. java中保留两位小数(四舍五入后)
  4. oppo r17听筒测试软件,【OPPOR17评测】ColorOS变智能 OPPO R17堪称生活小秘书(全文)_OPPO R17(6GB RAM/全网通)_手机评测-中关村在线...
  5. java桥_JAVA 桥模式
  6. poi comment
  7. selenium 控制ie_Python爬虫---Selenium的简单介绍
  8. 【python】面向对象类、对象的介绍
  9. php gtk教程,PHP-GTK 介绍及其应用-PHP教程,PHP应用
  10. DataX不支持Mysql8.x
  11. 【CSP201803-1 】跳一跳,简单模拟
  12. 获取音频频响和失真_专业音响设备_音频功放失真的四大要点及改善方法
  13. html---表单实例代码
  14. 计算机一级考试ppt知识点,计算机一级考试考点:PPT演示文稿
  15. 调查:人工智能技术的应用现状
  16. 跨月作废发票,红字冲红注意事项 如何整理上交发票
  17. 大案牍术——我们或是只是一串数字
  18. linux下weblogic新建域domian
  19. 判断字符串子序列【python】
  20. 2022年国内外大数据工程师薪资大比拼

热门文章

  1. Navicat Premium 12 卸载和注册表的删除
  2. Centos7 安装Httpd服务并浏览器中测试http页面
  3. 2021安徽计算机二级报名时间,2021年3月安徽计算机二级报名时间|网上报名入口【12月29日开通】...
  4. MEM/MBA 考研高频单词总结(09)
  5. flume ChannelSelector -- channel 选择器
  6. 【用户增长】用户增长方法论及增长思维
  7. 张正友相机标定算法原理与源代码(OpenCV+C++)
  8. 自然语言处理(NLP)初识
  9. 【合约开发工具】合约的开源与验证
  10. 5G#DVEV (Development environment-开发环境)