python3闭包
一、函数的基本概念
def func_name():
输出变量:a = '2'
print(a)
输出函数:print func_name() 在这块函数输出一定要加上()
函数都有显性返回值,保证代码的完整性和可维护性,一定要返回一下。
一、函数作用域的LEGB:L>E>G>B
L(local):函数内部作用域。
E(enclosing):函数内部与内嵌函数之间,主要是内嵌函数对内部函数变量的引用,这时候就成为闭包。
G(global):全局作用域,所定义的全局变量就作用于全局作用域。
B(build-in):python默认导入的一些变量,如list,tuple,max等等。
LEGB的原则:L>E>G>B
二、闭包(closure)的概念
closure:内部函数中对enclosing作用域的变量进行引用,内部函数就称作闭包。
函数实质与属性:
1、函数是一个对象,这个对象在内存中有存储空间。
2、函数执行完成后内部变量被python解释器回收,如果中间产生变量并且这个变量返回,则这个变量不被回收。
代码一(python中一切都是对象,我们可以直接把函数返回):
1 #coding:utf-8
2 passline = 60
3 def func(val):
4 passline = 90
5 if val >= passline:
6 print("pass")
7 else:
8 print("failed")
9 def in_func():
10 print(val)
11 in_func()
12 return in_func
13
14 f = func(89) #f用来接收返回值
15 f()#in_func
16
17 运行结果:
18 failed
19 89
代码二:
1 #coding:utf-8
2 def func_150(val):
3 passline = 90
4 if val >= passline:
5 print("pass")
6 else:
7 print("failed")
8 def func_100(val):
9 passline = 60
10 if val >= passline:
11 print("pass")
12 else:
13 print("failed")
14
15 func_150(89)
16 func_100(89)
17
18 运行结果:
19 failed
20 pass
代码三(同代码二): 内部函数引用了外部函数的passline,这就是闭包。f_100用来接收set_passline的返回值,(type(f_100)) 的返回值是function类型,所以还需要对(type(f_100)) 进行调用。也可以直接通过set_passline(60)(89)进行调用。
1 #coding:utf-8
2 def set_passline(passline):
3 def cmp(val):
4 if val >= passline:
5 print("pass")
6 else:
7 print("failed")
8 return cmp #返回的是一个函数
9
10 f_100 = set_passline(60)
print(type(f_100))
11 f_150 = set_passline(90)
12 f_100(89)
13 f_150(89)
14
15 运行结果:
<class 'function'>
16 pass
17 failed
闭包的作用:
1、封装
2、代码复用
代码四(将代码三中的passline换成函数)
代码五(将判断的部分抽象出归为一类,下面使用闭包的方式完成)