一、什么是返回函数?

返回函数,简单的说就是返回值是一个函数。

返回的是函数,调用返回的函数的时候才会返回结果。

二、闭包 (以返回函数的形式实现)

相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”。

def returnre(a, b): def re(): return a + b return re test01 = returnre(1, 2)
test02 = returnre(1, 2)
print(test01 == test02)  # 每次调用都会返回新生成的函数


比如上面例子的re函数闭包的特性,嵌套定义在非全局作用域里面的函数,能够记住它在被定义的时候它所处的封闭命名空间。

来看一个例子:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def closur(a): def myprint(): print(a) return myprint test = closur(1)
test()


代码解析:

变量a是函数closur的一个本地变量,只应该存在于函数运行时,但正因为闭包的特性,将a的值封装进了返回函数。

def closuretest02(*args): f = [] for i in args: def test(): return i**2 f.append(test) return f
test = closuretest02(1,2,3,4)
for i in test: print(i())


返回闭包时牢记的一点就是:

返回函数不要引用任何循环变量,或者后续会发生变化的变量。

如果一定要引用循环变量怎么办?

方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def count(): def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() return fs

再看看结果:

f1, f2, f3 = count()
print(f1()) print(f2())
print(f3())


注:

缺点是代码较长,可利用lambda函数缩短代码。

一个函数可以返回一个计算结果,也可以返回一个函数。返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。

三、拓展

nonlocal

nonlocal适用于嵌套函数中内部函数修改外部变量的值。

def outside(): a = 1 print('outside' + str(id(a))) def inside(): nonlocal a print('inside ' + str(id(a))) inside()
outside()

因为使用nonlocal后,返回了闭包中有父函数的变量,所以父函数那里不会被回收。

四、总结

本文基于Python基础,介绍了返回函数。常见的返回函数的应用。函数作为返回值,闭包在实际应用中需要的点,遇到的难点,提供有效的解决方案。使用Python语言,能够更好的理解。

欢迎大家积极尝试,有时候看到别人实现起来很简单,但是到自己动手实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

代码很简单,希望对你学习有帮助。

一篇文章带你搞定Python返回函数相关推荐

  1. java 不重启部署_一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

    一.通过配置文件控制静态资源的热部署 在配置文件 application.properties 中添加: #表示从这个默认不触发重启的目录中除去static目录 spring.devtools.res ...

  2. 一篇文章带你搞定 MongoDB 实现 REST

    文章目录 一.前期准备 二.SpringBoot 实现 MongoDB 的 REST 三.使用 Postman 测试使用 一.前期准备 首先使用 docker 搭建好 MongoDB:一篇文章带你搞定 ...

  3. 一篇文章带你搞定19年数学建模机场出租车优化问题示例讲解含代码

    文章目录 一.问题分析 二.数据介绍 三.模型的求解 四.结果分析 一.问题分析 收集国内某一机场及其所在城市出租车的相关数据,给出该机场出租车司机的选择方案,并分析模型的合理性和对相关因素的依赖性. ...

  4. 如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 三分割据纡筹策,万古云霄一羽毛. ...

  5. 一篇文章带你搞定二维插值的 MATLAB 计算

    前面已经学习了二维插值的基本概念:一篇文章带你认识数学建模中的二维插值 本篇文章主要实现使用MATLAB进行二维插值计算 文章目录 一.网格节点的插值计算 二.散点数据的插值计算 1. 示例 1 2. ...

  6. 一篇文章带你搞定 SpringBoot 自定义欢迎页和网页图标 favicon

    文章目录 一.SpringBoot 自定义项目启动欢迎页 二.SpringBoot 自定义 favicon 一.SpringBoot 自定义项目启动欢迎页 已经分析过SpringBoot 的资源访问路 ...

  7. 一篇文章带你搞定和Spring Boot有关的那些高频面试题

    自Spring Boot诞生以来,就引起了业界轰动,目前越来越多的公司技术选型选择拥抱Spring Boot.所以Spring Boot也成为面试必问的问题之一.下面的问题是小胖哥面试了很多候选人后总 ...

  8. 一篇文章带你搞定线程池的自定义创建和扩展

    文章目录 一.自定义线程创建:ThreadFactory 二.扩展线程池 一.自定义线程创建:ThreadFactory 看了那么多有关线程池的介绍,不知道大家有没有思考过一个基本的问题:线程池中的线 ...

  9. 一篇文章带你搞定数学建模中的排队论思想(19年机场出租车优化问题示例讲解)

    文章目录 一.问题分析 二.模型建立 1. 时间成本 2. 时间成本的计算 3. 空载费用和潜在的载客收益 4. 决策模型的建立 一.问题分析 分析研究与出租车司机决策相关因素的影响机理,综合考虑机场 ...

最新文章

  1. Gentoo 安装日记 01 (工具准备)
  2. mysql拦截器实现crud_Mybatis自定义SQL拦截器
  3. 从零开始学keras之电影二分类
  4. 【测试用例级别定义】
  5. android 下载视频文件怎么打开,安卓手机支付宝文件夹下的视频文件是什么
  6. 港科大郑光廷院士问诊未来,探讨 AI 最新应用与实践
  7. Elasticsearch Trying to create too many scroll contexts. Must be less than or equal to: [500]
  8. re2正则表达式引擎学习(一)
  9. 【C++】C++继承和派生类、虚基类
  10. 机器学习笔记——乳腺癌鸢尾花分类问题详解(没有直接调包)
  11. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day17】—— 数据库4
  12. 不知道怎么识别手写文字?快来看这些手写文字识别成文档软件
  13. SafeIterableMap
  14. 核PCA(Kernel PCA)学习笔记
  15. 异常的深入研究与分析
  16. 至每一位在努力奋斗的人-----复旦女生的高三生活
  17. IC设计前后端常用的英文术语
  18. 因男友迟迟没升 P8 分手?? | 每日趣闻
  19. python如果文件存在就删除_python--文件删除、判断目录存在、字符串替换
  20. Maven仓库配置中央仓库

热门文章

  1. Oracle关于java.sql.SQLException常见错误集锦
  2. 浅析NSTimer CADisplayLink内存泄露
  3. 你所忽略的Linux系统安全及应用(最全面)
  4. 在我生命里留下温暖记忆的一位老师
  5. 【C#】C#抽象类及其方法
  6. 用PHPcms V9四步完成WAP手机站搭建
  7. 《 Spring1之第二次站立会议(重发)》
  8. android NDK 在Ubuntu10.04开发环境的搭建
  9. Spring学习之Bean的配置
  10. SQLServer 2005删除无主键表中的重复项