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

python 函数闭包()

时间:2018-09-07 14:00:16      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:int   pre   bsp   函数应用   循环   ini   print   code   局部变量   

闭包(closure)

 当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回函数中,这种结果,叫闭包

example1:

 1 def test(*args):
 2     
 3     def test_1():
 4         rst = 0
 5         for i in args:#这里使用了函数外部的参数
 6             rst += i
 7         return rst
 8     return test_1#将函数作为返回值返回,相关参数和变量保存在返回的函数中
 9 
10 a = test(1,2,3)
11 print(a())

 这上面就是一个常见的闭包

 

闭包也有坑人的地方

example2:

def count():
    fs = []
    #这里定义了一个列表

    for i in range(1,4):
        #定义了一个函数f
        #f是一个闭包的结构
        def f():
            return i*i#这里不会马上计算 要返回的时候才会计算
        fs.append(f)
    return fs
f1,f2,f3 = count()
print(f1())
print(f2())
print(f3())
# 9
# 9
# 9
# [Finished in 0.2s]
# 为什么会是999呢,造成上述状况的原因是,返回函数引用了变量i,
# 而i并不是立即执行,而是等腰三个函数都返回的时候才统一执行
# 此时i已经变成了3,最终调用的时候 返回的都是 3*3
# 

上述问题得到结果: 返回闭包时,不能引用任何循环变量

解决办法:

再在外面套一个函数

example3:

def count2():
    fs = []
    #这里定义了一个列表
    def f(i):#将i作为参数传入进去
        def g():
            return i*i#这里i返回的时候会马上执行
        return g

    for i in range(1,4):
        fs.append(f(i))
    return fs
f1,f2,f3 = count2()
print(f1())
print(f2())
print(f3())
#1
#4
#9

 

python 函数闭包()

标签:int   pre   bsp   函数应用   循环   ini   print   code   局部变量   

原文地址:https://www.cnblogs.com/lonelyshy/p/9603689.html

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