zoukankan      html  css  js  c++  java
  • Python闭包

    定义

    闭包(closure)即在函数中又有函数的定义,例如:

    def fun1(str):
        print("this is fun1 str")
        def fun2(str1):
            print("this is fun2 str and parameter from fun1 %s" %str1)
        fun2(str)
    
    fun1('test')
    

    作用域

    作用域与def所在层级相同

    作用

    可以根据不同的配置信息得到不同的结果

    def line_conf():
        b = 15
        def line(x):
            return 2*x+b
        return line       # return a function object
    
    b = 5
    my_line = line_conf()
    print(my_line(5))
    print(my_line(3))

    因为函数是一个对象,所以也可以作为函数的返回值。这里line_conf的返回值就可以是line函数。这里可以对my_line赋不同的值,就可以得到不同的结果。看起来也没啥好处,我同样也可以在外面定一个line函数,然后在line_conf中调用就可以了。只是不能返回line函数而已。从功能上看是没啥区别。不同的是,如果是闭包,他是可以直接调用line_conf中的变量的,这称为闭包的环境变量 一个函数和他的环境变量打包在一起就称为闭包(closure)

    实例

    def line_conf(a, b):
        def line(x):
            return ax + b
        return line
    
    line1 = line_conf(1, 1)
    line2 = line_conf(4, 5)
    print(line1(5), line2(5))
    

    这里一个函数就定义了一组曲线,该曲线形如$ y = ax + b$。在配置完a , b两个参数后,该函数的形式就确定了下来。后面的line就只需要给一个参数就行了。也就是说,环境变量确定下来了,只需要给函数很少的参数就可以了。如果没有闭包,我们只能用函数完成,这个函数每次都得传递a , b , x的值才能得到y的值。这样增加了程序开销,也不利于程序的移植。

  • 相关阅读:
    02数值类型
    01开班第一节
    oracle 课堂笔记
    错题整理
    多线程下的单例模式
    线程的同步和异步
    九大内置对象!!!
    jsp前三章测试
    Jav开发中的23种设计模式详解(转载)
    java IO 学习笔记
  • 原文地址:https://www.cnblogs.com/WeyneChen/p/6670617.html
Copyright © 2011-2022 走看看