V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Mark24  ›  全部回复第 75 页 / 共 91 页
回复总数  1805
1 ... 71  72  73  74  75  76  77  78  79  80 ... 91  
2015-12-23 23:49:55 +08:00
回复了 cxbii 创建的主题 Linux 深度操作系统 15 RC ——用真心捕获你的芳心
终于来了,再等一周
2015-12-22 21:02:19 +08:00
回复了 Mark24 创建的主题 问与答 Django 的官网也被墙了?
长城宽带,上不去
2015-12-22 20:55:24 +08:00
回复了 czipeng 创建的主题 Linux 大家学习 linux 都是从哪里开始的?是 centos 吗
ubuntu
2015-12-21 23:45:22 +08:00
回复了 Mark24 创建的主题 问与答 关于闭包一大堆问题
@banricho 感谢整理,感谢回答。给了我很大灵感

我还是自问自答吧
刚才又看了一会资料。个人的粗糙理解:

以 Python3 的闭包为例:
在我理解,闭包的最大意义就在于
1.保存环境:实际上创造了第三种作用域,内部的变量可以不被回收
2.函数的面向对象:将函数和数据捆绑了起来,第三种作用域内部的函数可以看出私有变量(因为别人访问不到)
a.包装了函数 b.捆绑了变量数据

顺便区分一下,装饰器,偏函数,闭包
函数式编程,这三者真的是纠缠在一起,没搞清楚就会混淆

装饰器,偏函数其实并不是闭包
他们也基本上没有什么关系
他们只是形式上有些相似,就是函数嵌套函数,并且返回函数

把函数当做参数,和当成返回值,这就叫函数式编程,因为可以实现数学上的 f(f(f(x)))这种感觉

装饰器,就是嵌套函数,传入函数 f ,对 f 进行加工,添加一些功能,再返回函数,依然给 f
这个变量就切换指向了
实际上是丢弃了原来的函数,变成了增强函数,这就是装饰器

偏函数,函数的某些变量被固定了
这样子返回的是一个函数,可以在适合的时候, f( ) 起作用
经常用在 GUI ,比如一个按钮,先固定尺寸,颜色主题,等固定的变量,空出一个标题和信号绑定
然后后面合适的时候,不断地绑定

======
下面来讲闭包:

闭包,形式上和上面两个有点像,很接近,其实很不一样
首先,闭包的语法形式上要素是:
1.嵌套函数
2.返回的是函数
3.内部函数,引用外部函数的变量,包括嵌套函数的 f(x)的直接参数 x

如:
def f(x):
....a=1
....def g( ):
........nonlocal a,x
........a += 1
........x += 1
........print("a:{},x:{}".format(a,x))
....return g

s = f(5)
s()
s()
s()
====
输出:
a:2,x:6
a:3,x:7
a:4,x:8
[Finished in 0.1s]


就比如这个例子,内部嵌套函数, g 引用了 x , a
这就算闭包了。
要想解释清楚这个名字,得从调用说起。

s = f(5) #这步调用,其实是生成了一个函数 g( ) ,变量名 g 付给了 s
只有当 s( ) 的时候,才启用

退一步,我们都知道,函数会产生自己的局部作用域,对 s 来讲,就是 g 函数
g 函数产生了自己的作用域,但是 g 函数调用了 a , x 两个变量, a,x 又在 f 中,可是 f 又调用结束了,该回收了

解释器陷入两难,于是,算是特殊情况
于是解释器,生成了一个特殊作用域

介于 全局作用域和 f 的局部作用域之间的,作用域

当你反复调用,生成多个函数,该作用域中 a , x 是彼此独立的,这个比较特别,要记住
想一个封闭的包裹,夹在 f 的局部作用域和 全局作用域之间
这个从属于外部函数 f 局部作用域的变量 a,x ,被函数“封闭”起来了。
被封闭起来的变量的寿命,与封闭它的函数寿命相等
名字起得很形象,夹在中间,作用域封闭起来,称为闭包( Closure )。

封闭的作用域,外界访问不到
还有就是,他是不会被回收的,据说,寿命和函数一样长。
如果你设置变量为累加
反复调用,就会积累数值

这个作用域和不会被回收的变量,就叫做环境
所谓的记住环境,就是这些变量的数值,可以保持

变量被称作自由变量
我没看出哪里自由,高等数学里自由变量的意思是可以是任意值,表示为 C
这里大概的意思是,解释器管不着,不被回收

总结一下闭包,之后的特点:
作用域内的变量
1.不会被回收
2.相对封闭,不会被访问到,想一个封闭的包内的变量
3.反复调用,可以积累
4.for 循环使用的时候,总是以最后一个为准,因为是临解释的时候,才使用

换个角度看闭包:

def f(x):
....a=1
....def g( ):
........nonlocal a,x
........a += 1
........x += 1
........print("a:{},x:{}".format(a,x))
....return g

闭包实际上就是记录了外层嵌套函数的作用域中的变量
通过这个 f , g 例子,可以建立多个自定义函数

这很容易让人联想到面向对象编程
f 更像是 g 的构造器,
a,x 是一个私有变量
数据和变量捆绑,函数版本的面向对象
闭包意味着数据与函数结合起来了,这和面向对象思想中的“对象”的概念很接近。

于是闭包有了各种用途

1.可以返回加强的函数,作为函数工厂函数,比如时间戳装饰器
2.可以贮藏闭包作用域中的变量,可以做一个独立环境的计数器
3.可以构造一个私有变量( JS )
4.记住环境, JS 中,可以带着 DOM 的 div 信息,跟到最新点击信息

5.既然都是面向对象,闭包可以实现的, OOP 都可以实现,反过来
OOP 可以实现的功能,闭包有时候可以化繁为简。
2015-12-21 15:42:47 +08:00
回复了 pymmrd 创建的主题 Python [招聘]高薪聘请 Python 研发工程师
竟然没写工作地点,工作福利,工作时间,特殊福利
2015-12-20 00:57:32 +08:00
回复了 hongfeiyu 创建的主题 Linux 小米马上要发布笔记本了,系统应该是 Linux 的
便携 13 寸
干活 13/15(当然能接外显最好)
2015-12-20 00:45:26 +08:00
回复了 FireCat 创建的主题 Steam Steam 上有哪些 Mac 可以玩的好游戏?
泰拉瑞亚
2015-12-20 00:32:50 +08:00
回复了 haozes 创建的主题 问与答 Github 提交代码好慢,经常不成功,大家如何解决的?
2015-12-19 21:33:05 +08:00
回复了 youngitachi 创建的主题 Linux 第三次尝试装 archlinux
折腾半天,不过是折腾一个 Arch 版本的 Ubuntu
就像 Ubuntu 玩了半天,只不过想做一个 Mac OS X 样子的 Linux
2015-12-18 10:20:18 +08:00
回复了 cxbii 创建的主题 Linux 深度操作系统 15 Beta——每一处都在“靓”变
哈哈, V 上有人用 Deepin ,碰到深友了
2015-12-16 23:28:40 +08:00
回复了 pc10201 创建的主题 程序员 用熟了 python 之后,学不进其他语言,怎么办?
和楼主一样,但是还是对 C,Wolfram 心存敬畏
现在的师兄,一和他讨论稍微深入点的话题,马上就 JavaScript 云云
JS 那个先天残疾的语法……看不惯,也看不上

已经被 Python 惯坏了,看哪个语言都觉得不顺眼
2015-12-16 16:38:16 +08:00
回复了 ca1123 创建的主题 Python Python 编程最大的坑是什么?
2 的编码,这个绝对绝对绝对!
3 的分裂(其实 3 好用)
缩进, tab ……其实把缩进调为可见,这个问题一般不是问题

CPython 的多线程
2015-12-14 22:52:04 +08:00
回复了 niedongming 创建的主题 上海 在魔都租房子的过程真虐心。忍不住吐槽一下
@wingoo 南京 1200 的三室一厅,请联系我!!我在找房子!!
@zhyu 感谢!!
一直知道 PEP8 是代码规范,以为 PEP1~7 就是之前版本的代码规范
……
汗滴滴
感谢!!
@zhyu 对装饰器的描述仅限于名词,拓展链接也仅仅一笔带过。有没有详细介绍装饰器——如何使用,怎么构建自己的装饰器;使用闭包……等等

这些描述呢?
我在想,如果官方都没有描述的话,其他的那些人的教程的根源,来自于哪里??!
2015-12-12 19:46:55 +08:00
回复了 Mark24 创建的主题 问与答 有 V 友/公司在把自己的项目迁移到 Python3 么?什么感受?
@vus520 哈哈哈哈哈哈哈
1 ... 71  72  73  74  75  76  77  78  79  80 ... 91  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   984 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 36ms · UTC 23:04 · PVG 07:04 · LAX 15:04 · JFK 18:04
Developed with CodeLauncher
♥ Do have faith in what you're doing.