Pyhton闭包、装饰器


Pyhton闭包、装饰器

文章插图

闭包1. 函数引用
def test1(): print("--- in test1 func----")# 调用函数test1()# 引用函数ret = test1print(id(ret))print(id(test1))#通过引用调用函数ret()运行结果:
--- in test1 func----140212571149040140212571149040--- in test1 func----2. 什么是闭包# 定义一个函数def test(number): # 在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包 def test_in(number_in): print("in test_in 函数, number_in is %d" % number_in) return number+number_in # 其实这里返回的就是闭包的结果 return test_in# 给test函数赋值,这个20就是给参数numberret = test(20)# 注意这里的100其实给参数number_inprint(ret(100))#注 意这里的200其实给参数number_inprint(ret(200))运行结果:
in test_in 函数, number_in is 100120in test_in 函数, number_in is 2002203. 看一个闭包的实际例子:def line_conf(a, b): def line(x): return a*x + b return lineline1 = line_conf(1, 1)line2 = line_conf(4, 5)print(line1(5))print(line2(5))这个例子中,函数line与变量a,b构成闭包 。在创建闭包的时候,我们通过line_conf的参数a,b说明了这两个变量的取值,这样,我们就确定了函数的最终形式(y = x + 1和y = 4x + 5) 。我们只需要变换参数a,b,就可以获得不同的直线表达函数 。由此,我们可以看到,闭包也具有提高代码可复用性的作用 。
如果没有闭包,我们需要每次创建直线函数的时候同时说明a,b,x 。这样,我们就需要更多的参数传递,也减少了代码的可移植性 。
注意点:
由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
4. 修改外部函数中的变量Python3的方法
def counter(start=0): def incr(): nonlocal start start += 1 return start return incrc1 = counter(5)print(c1())print(c1())c2 = counter(50)print(c2())print(c2())print(c1())print(c1())print(c2())print(c2())python2的方法
def counter(start=0): count=[start] def incr(): count[0] += 1 return count[0] return incrc1 = closeure.counter(5)print(c1()) # 6print(c1()) # 7c2 = closeure.counter(100)print(c2()) # 101print(c2()) # 102装饰器装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多初次接触这个知识的人来讲,这个功能有点绕,自学时直接绕过去了,然后面试问到了就挂了,因为装饰器是程序开发的基础知识,这个都不会,别跟人家说你会Python, 看了下面的文章,保证你学会装饰器 。
1、先明白这段代码
#### 第一波 ####def foo(): print('foo')foo # 表示是函数foo() # 表示执行foo函数#### 第二波 ####def foo(): print('foo')foo = lambda x: x + 1foo() # 执行lambda表达式,而不再是原来的foo函数,因为foo这个名字被重新指向了另外一个匿名函数函数名仅仅是个变量,只不过指向了定义的函数而已,所以才能通过 函数名()调用,如果 函数名=xxx被修改了,那么当在执行 函数名()时,调用的就不知之前的那个函数了
2、需求来了
初创公司有N个业务部门,基础平台部门负责提供底层的功能,如:数据库操作、redis调用、监控API等功能 。业务部门使用基础功能时,只需调用基础平台提供的功能即可 。如下:
############### 基础平台提供的功能如下 ###############def f1(): print('f1')def f2(): print('f2')def f3(): print('f3')def f4(): print('f4')############### 业务部门A 调用基础平台提供的功能 ###############f1()f2()f3()f4()############### 业务部门B 调用基础平台提供的功能 ###############f1()f2()f3()f4()目前公司有条不紊的进行着,但是,以前基础平台的开发人员在写代码时候没有关注验证相关的问题,即:基础平台的提供的功能可以被任何人使用 。现在需要对基础平台的所有功能进行重构,为平台提供的所有功能添加验证机制,即:执行功能前,先进行验证 。
老大把工作交给 Low B,他是这么做的:
跟每个业务部门交涉,每个业务部门自己写代码,调用基础平台的功能之前先验证 。诶,这样一来基础平台就不需要做任何修改了 。太棒了,有充足的时间泡妹子…
当天Low B 被开除了…
老大把工作交给 Low BB,他是这么做的:
############### 基础平台提供的功能如下 ############### def f1(): # 验证1 # 验证2 # 验证3 print('f1')def f2(): # 验证1 # 验证2 # 验证3 print('f2')def f3(): # 验证1 # 验证2 # 验证3 print('f3')def f4(): # 验证1 # 验证2 # 验证3 print('f4')############### 业务部门不变 ############### ### 业务部门A 调用基础平台提供的功能### f1()f2()f3()f4()### 业务部门B 调用基础平台提供的功能 ### f1()f2()f3()f4()


推荐阅读