码迷,mamicode.com
首页 > 编程语言 > 详细

Python进阶之闭包

时间:2015-12-13 17:01:28      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

闭包

闭包

在函数内部定义的函数和外部定义的函数是一样的,只是他们无法被外部访问:

1.def g():
2. print ‘g()...‘
3.def f():
4. print ‘f()...‘
5. return g

将g的定义移入函数f的内部,防止其他代码调用g:

1.def f():
2. print ‘f()...‘
3. def g():
4. print ‘g()...‘
5. return g

但是,

1.def calc_sum(lst):
2. def lazy_sum():
3. return sum(lst)
4. return lazy_sum

这是无法把lazy_sum移到calc_sum的外部,因为它引用了calc_sum的参数lst。
像这种内层函数引用了外层函数的变量,然后返回内层函数的情况,称为闭包(Closure)

闭包的特点是返回的函数还引用了外层函数的局部变量,像下面的:

1.#希望一次返回3个函数,分别计算1*1,2*2,3*3
2.def count():
3. fs=[]
4. for i in range(1,4):
5. def f():
6. return i*i
7. fs.append(f)
8. return fs
9.f1,f2,f3=count()

你可能认为调用f1(),f2(),f3(),结果应该是1,4,9,但实际结果全部都是9
原因就是当count()函数返回了3个函数时,这3个函数所引用的变量i的值已经变成了3,由于f1、f2、f3并没有被调用,所以,此时他们并未计算i*i,当f1被调用时:

1.>>> f1()
2.9 #因为f1现在才计算i*i,但现在i的值已经变成了3

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

那么这个程序该怎么改写,才能使其正确返回能计算1*1,2*2,3*3的函数?

1.def count():
2. fs=[]
3. for i in range(1,4):
4. def f(j):
5. def g():
6. return j*j
7. return g
8. r=f(i)
9. fs.append(r)
10. return fs
11.f1,f2,f3=count()
12.print f1(),f2(),f3()

Python进阶之闭包

标签:

原文地址:http://www.cnblogs.com/XBlack/p/5043026.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!