文章目录

  • 说明
  • 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. 清理系统盘遇到的问题
  2. 【UDP协议头解析】
  3. java wrap方法_Java WritableCellFormat.setWrap方法代码示例
  4. linux常见基础服务,常用的linux命令的基本使用(一)
  5. vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn
  6. CSS 行内级元素和行内框
  7. Codeforces Round #147 (Div. 2) E. Build String 最小费用最大流
  8. silverlight打开和保存文件
  9. fastdfs返回的url_FastDFS上传文件Demospringboot实现
  10. HMM(隐马尔可夫模型)
  11. 问题记录:net::ERR_CERT_DATE_INVALID
  12. 计算机操作系统有哪几个管理功能,操作系统管理功能有哪几种
  13. 作为运营,如何在职场上野蛮生长
  14. matlab边坡可靠性分析,滇西南地区高速公路高边坡调查及抗震稳定性分析
  15. 转】用Mahout构建职位推荐引擎
  16. 使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
  17. 物联网专业属于计算机的哪个门类,物联网工程专业属于什么门类
  18. 【正本清源】Synchronized 源码全解之偏向锁的获取(基于 Openjdk12)
  19. [Vue warn]: Unknown custom element: vhead - did you register the component correctly? For recursiv
  20. 甲骨文发布适用于 MongoDB 的 Oracle Database API;Chrome 和 Edge 互相“拉踩”;树莓派驱动程序现可在 Android 上运行 | 开源日报

热门文章

  1. 腾讯信鸽 php sdk,关于信鸽SDK(腾讯云推送)使用指北
  2. Google受隐私问题困扰 或放弃欧洲版街景服务
  3. Excel函数应用实例:计算零存整取未来值(转)
  4. WordPress自媒体主题:Zibll V3.0 bate(免费下载)
  5. 标量衍射理论计算光栅衍射效率
  6. 英文版-Hillsong Still 安静(现场)
  7. 美国计算机语言互动软件,美华裔研发文字语音转换软件 便利盲人操作电脑
  8. Golang 使用http Client下载文件
  9. 智能车基础四轮组”氢气球“----(1)软件基础框架
  10. BUUCTF MISC 小明的保险箱