转载请注明出处:王亟亟的大牛之路

本来打算把工作的事周末做掉点,但是发现在外面浪并不能迅速集中投入,为了避免不必要的BUG 还是明天在家做吧,那么久写一篇Python的文章吧,毕竟背着Mac出门不做些太对不起自己的肩膀了


废话不多,直接说内容,这篇文章的内容大致是围绕“闭包”走的,介绍下相关理论知识

作用域:对象有其存活的范围
闭包:内部函数可以引用外部函数的参数和局部变量(是不是听得云里雾里的,没事 看例子就明白了)

就像循环内声明的对象,除了循环也就无法获取他的值一样。就像在java中声明的静态变量它的作用域就在整个类都有效一样。

那如果在非对象可存活的范围内操作了某个对象编译器也不会让我们通过的,像这样(拿一个错误的闭包函数来演示下)

那再上一个对的实现

也就引出了“高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回”。

我们来解释下这2个例子,首先外层有一个wdd函数,它里面有一个line函数因为我们图1他超出了合理的作用域所以编译器就报错了。

那我们再来分析下第二个例子,我们也是外面有一个wdd()函数,里面有一个line函数 函数返回值为 传入的参数x*2+50 然后line()函数的计算结果作为wdd()函数的返回值

这也就是我们所说的 函数作为返回值,实质上其实就是类似于 我们声明了一个 k 然后wdd()这个函数赋值给了k 然后line(x) 这个函数引用了外部函数的参数 5 然后计算出结果后的结果返回给了外部函数wdd。

那有些人问了 直接

print(wdd(5))

不行吗?

我们再贴个例子来看一下

def sumLogic2(*args):def addAll():sumValue2 = 0for k in args:sumValue2 = sumValue2 + kreturn sumValue2return addAll

这个例子跟wdd区别只是计算的算法不同,结果完全相同,主要看下不同的调用的结果

result = sumLogic2(1, 2, 3, 4, 5)
print(result())
print(sumLogic2(1, 2, 3, 4, 5))结果:
15
<function sumLogic2.<locals>.addAll at 0x101b7b840>

这也就验证了我们刚才说的 我们 sumLogic2(1, 2, 3, 4, 5) 其实返回的是addAll()方法,调用函数result时,才真正计算结果。

再顺道上一下证明 内部函数可以引用外部函数的参数和局部变量 的例子

def wjj(z, x, c):a = 20def wjj2():return a*(z * x * c)return wjj2k = wjj(2, 3, 4)
print(k())结果:
480

这个例子不仅引用了局部变量,也使用了外部传入wjj方法的参数。

那我们每次调用同一个外部函数返回的是同一个对象吗?

拿刚才的result验证下

def sumLogic2(*args):def addAll():sumValue2 = 0for k in args:sumValue2 = sumValue2 + kreturn sumValue2return addAllresult = sumLogic2(1, 2, 3, 4, 5)
print(result())
print(sumLogic2(1, 2, 3, 4, 5))result2 = sumLogic2(1, 2, 3, 4, 5)print(result == result2)结果:
15
<function sumLogic2.<locals>.addAll at 0x101b7b840>
False

那也就说明调用结果互不影响。

是不是对大致的使用 有了点概念?

什么? 还不清楚,还是觉得闭包没用? 那么看以下例子

def line_conf(a, b):def line(x):return a*x + breturn lineline1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5), line2(5))结果:6 25

这个例子中,函数line与环境变量a,b构成闭包。在创建闭包的时候,我们通过line_conf的参数a,b说明了这两个环境变量的取值,这样,我们就确定了函数的最终形式(y = x + 1和y = 4x + 5)。我们只需要变换参数a,b,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用。

如果没有闭包,我们需要每次创建直线函数的时候同时说明a,b,x。这样,我们就需要更多的参数传递,也减少了代码的可移植性。利用闭包,我们实际上创建了泛函。line函数定义一种广泛意义的函数。这个函数的一些方面已经确定(必须是直线),但另一些方面(比如a和b参数待定)。随后,我们根据line_conf传递来的参数,通过闭包的形式,将最终函数确定下来。

是不是发现瞬间觉得有那么点用了?


现在手头运作一些公司的职位,有兴趣的小伙伴可以U 简历到452270579@qq.com

公司:Pactera 地点:上海 职位: Java PHP Android UI设计 .Net 服务于平安好车项目(大企业,大项目)

公司:阿里巴巴 地点 :上海,杭州,北京 职位: Android/iOS 淘宝/蚂蚁/其他子公司(有一定能力,学历要求)

公司:暴走漫画 地点:上海 职位:Android/iOS 暴走大事件配套App产品(大用户量产品)


源码:https://github.com/ddwhan0123/PythonExample/blob/master/示例/l8Demo.py

最后一个例子来源于:http://www.cnblogs.com/vamei/archive/2012/12/15/2772451.html

王亟亟的Python学习之路(10)-函数对象的作用域,函数作为返回值,闭包相关推荐

  1. Python学习之路基础篇--10Python基础,函数进阶

    1 命名空间 对于Python 来说命名空间一共有三种 1 内置命名空间 -- Python 解释器 就是Python 解释器一启动就可以使用的名字,储存在内置命名空间中.内置的名字在启动解释器的时候 ...

  2. python之路 mysql 博客园_教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql...

    教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql Easy_install安装MySQLdb 很简单,以至于我不晓得该怎么说.一句话. sodu ...

  3. Python学习之路—2018/7/14

    Python学习之路-2018/7/12 3.功能开发 3.3 设计博客首页 博客首页中最重要的就是中间的文章区域,所以我首先把文章区域设计出来,一开始并没有数据,如果用orm添加或者直接在数据库添加 ...

  4. Python学习之路—2018/6/20

    Python学习之路-2018/6/20 1.模板语法之变量 views.py def index(request):import datetimes="gyq"l=[1,2,3] ...

  5. Python学习之路9☞面向对象的程序设计

    Python学习之路9☞面向对象的程序设计 一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什 ...

  6. python 学习之路开始了

    python 学习之路开始了.....记录点点滴滴.... 转载于:https://www.cnblogs.com/chobit/p/6163287.html

  7. Python学习之路5☞文件处理

    Python学习之路5☞文件处理 一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 1 正趣果上果 2 Interesting fruit fruit 3 4 ...

  8. python学习之路0x00

    Python学习之路0x00 在学习python之前,要知道什么是python? python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,与c语言不同, c语言要编译后才能执行.而 ...

  9. 我的Python学习之路(一)_Mr_Ouyang

    我的Python学习之路(一)_Mr_Ouyang 笔者按: 本文从18:55开始写作,至19:38中断,又从21:12始继续,至23:22写就. 共计耗时113分钟,总字数9081字,约80.4字/ ...

最新文章

  1. python 多进程multiprocessing 队列queue报错:AttributeError: Can't pickle local object
  2. maven 如何给web项目添加jar包依赖
  3. 前端实现街道地图_来自法国的注重保护个人隐私的开源地图
  4. python contains类似函数_介绍几款Python性能优化工具
  5. Thinkphp 6.0商城系统,B2C商城系统全新UI
  6. 【VBA】excel客户数据打印录入控件
  7. 每周一练:如何创建自己的Python爬虫代理IP池(免费IP)
  8. 网络在线播放ASF格式流媒体文件的制作(转)
  9. Java POI的Excel操作(行高列宽比例;生成说明,标题,字段;导出Excel代码,压缩)
  10. 0x000000ED蓝屏完美解决方案
  11. ps计算机网络海报,PS教程:Photoshop制作星空云海创意海报
  12. (转)在路上—Tinyfool的程序员生涯(职业生涯篇一)
  13. win10软件拒绝访问删不掉_Win10文件夹无法访问拒绝访问怎么解决?
  14. 假如开源项目创始人去世了,项目怎么办? - 知乎精华
  15. 山寨电视不会成为山寨手机第二
  16. 联发科向上,高通向下
  17. sql 导入linux问题:ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-m
  18. 周易六十四卦——天风姤卦
  19. python 查看 文件MD5值
  20. 一台PC双网卡,一个外网一个内网

热门文章

  1. 假如苹果公司倒闭了,会对iOS及macOS用户产生什么影响?
  2. 目前java行业的发展
  3. 图灵机不能解决的问题现有计算机也不能解决,科学网—电脑人心 之 计算机能思维吗?(二)图灵的机器(5)丘奇-图灵论题 - 罗军的博文...
  4. miui11 android,悉数MIUI11不容易注意到的细节新特性
  5. 网络控制系统仿真:Truetime2.0工具箱安装(win10 + matlab R2017b)
  6. 安卓转移到IOS,传输错误问题
  7. 简易四则运算计算器(C51单片机实现)
  8. 人工智能应届毕业生月薪20k,他们是如何做到的?
  9. Maven升级3.8.1后maven-default-http-blocker (http0.0.0.0) Blocked mirror for repositories
  10. 【已解决】连接被重置