普通函数能完成大功能编写,匿名函数能完成小功能代码编写,而且当作实参非常方便;而闭包比函数方便,拥有函数代码的功能(类似于匿名函数),还能有代码所需要使用数据;而面向对像,实例对象赋值给参数,里面的参数和方法都有,但应用中往往只要一部分,而不是全部,故闭包的优点就能体现出来,就是比面向对象更轻量,不会有多余的东西
def line(k,b): def create_y(x): print(k*x+b) return create_y line_1 = line(1,2) line_1(0) line_1(1) line_1(2) line_1 = line(11,22) line_1(0) line_1(1) line_1(2)
输出内容以下:
2 3 4 22 33 44
代码说明:
1、line方法返回的是方法create_y的引用,并定义变更k=1,b=2,赋值给变量line_1
2、执行line_1(0)是,就相当于执行方法create_y,那0就为参数x的值
3、在create_y方法中,执行k*x+b,在当前方法找不到变量和k,b,因为当前函数是内部函数,就往外部函数找,即往上一层找,在方法line中找到k=1,b=2
4、再根据这三个参数的值计算返回值
闭包就是一个函数里面套着另一个函数的定义,一般情况内部函数的功能会用到外部函数的变量,把内部函数和用到的外部函数的变量整体称之为闭包
函数、匿名函数、闭包、对象,都作为实参时,有什么区别?
匿名函数能够完成基本的简单功能,传递是这个函数的引用,只有功能
普通函数能够完成较为复杂的功能,传递是这个函数的引用,只有功能
闭包能够将较为复杂的功能,传递是这个闭包中的函数以及数据,因为传递是功能+数据
对象能够完成最为复杂的功能,传递是很多数据+很多功能,因此传递是功能+数据
闭包的修改,使用nonlocal 语句