python闭包

在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包。在了解闭包之前,先了解一下函数的引用。

def test():
    print('...test...')

test()
t1 = test
t1()
print(id(test))
print(id(t1))

print('*'*15)

结果如下:


函数的引用.jpg

那闭包是如何在函数内引用函数的?看如下代码:

def test(number):
    def test_in(number_in):
        print('test_in的number_in是:%s'%number_in)
        return number+number_in
    return test_in


t1 = test(10)
print(t1(20))
print(t1(30))

结果如下:


闭包.jpg

接下来看一个闭包的实际例子,定义一个函数曲线,给定x的值求y的值。

def fun1(k,b):
    def fun1_in(x):
        print('x的值是:%s'%x)
        return k*x+b
    return fun1_in

f1 = fun1(2,1)
print(f1(3))

结果如下:


闭包实例.jpg

这个例子中,函数fun1与变量k,b构成闭包。在创建闭包的时候,我们通过fun1的参数k,b说明了这两个变量的取值,这样,我们就确定了函数的最终形式(y=kx+b)。我们只需要变换参数a,b,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用。
如果没有闭包,我们需要每次创建直线函数的时候同时说明k,b,x。这样,我们就需要更多的参数传递,也减少了代码的可移植性。
闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成。
但由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、python函数作用域LEGB python解释器查找变量的原则(顺序):L→E→G→BL:Local函数内部...
    风萧雨霖阅读 462评论 0 0
  • 闭包的概念 关于什么是闭包,下面是百度百科的解释 闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是...
    Ljian1992阅读 811评论 3 7
  • 闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是...
    Mr_Chen阅读 320评论 0 1
  • 我在博客中曾经介绍过两篇关于函数的文章,第一篇是 关于 Python 函数是第一类对象,第二篇是关于 Lambda...
    liuzhijun阅读 1,540评论 2 27
  • 秋天,树叶会落下来 离开也是重生 度过一个寒冷的冬天 雨后芳华依然 人有悲欢,物有感念 月有盈缺,影有明暗 东边日...
    春风明月阅读 409评论 3 1