一 闭包与装饰器
1.1 闭包
如果在一个内部函数里面,对在外作用域( 但不是在全局作用域) 的变量进行引用,那么内部函数就被认为是闭包
def f ( ) :
x = 10
def g ( ) :
print ( x)
return g
h = f( )
h( )
def f ( x) :
def g ( ) :
print ( x)
return g
h = f( 1 )
h( )
def f ( ) :
x = 10
def g ( ) :
y= 5
print ( y)
return g
h = f( )
h( )
1.2 装饰器
装饰器 装饰字面意思就是添加一个新的功能,为你之前的某个函数添加新的功能,也就是说在不修改原代码的基础上给函数增加新的功能
1.2.1 无参
time 时间模块(要导包 import time)
start = time. time( )
print ( start)
time. sleep( ) 休眠程序,括号里面是休眠几秒
import time
def foo ( ) :
start = time. time( )
print ( 'foo...' )
time. sleep( 1 )
end = time. time( )
print ( f"运行了 { end- start} 秒" )
foo( )
def foo ( ) :
print ( 'foo...' )
def show_time ( func) :
start = time. time( )
func( )
time. sleep( 1 )
end = time. time( )
print ( f"运行了 { end- start} 秒" )
show_time( foo)
import time
def foo ( ) :
print ( 'foo...' )
def show_time ( func) :
def inner ( ) :
start = time. time( )
func( )
time. sleep( 1 )
end = time. time( )
print ( f"运行了 { end- start} 秒" )
return inner
foo = show_time( foo)
foo( )
import time
def foo ( ) :
print ( 'foo...' )
def bay ( ) :
print ( 'bay...' )
def show_time ( func) :
def inner ( ) :
start = time. time( )
func( )
time. sleep( 1 )
end = time. time( )
print ( f"运行了 { end- start} 秒" )
return inner
foo = show_time( foo)
foo( )
bay = show_time( bay)
bay( )
@ 语法糖
import time
def show_time ( func) :
def inner ( ) :
start = time. time( )
func( )
time. sleep( 1 )
end = time. time( )
print ( f"运行了 { end- start} 秒" )
return inner
@ show_time
def foo ( ) :
print ( 'foo...' )
foo( )
@ show_time
def bay ( ) :
print ( 'bay...' )
bay( )
1.2.2 原函数参数
import time
def show_time ( func) :
def inner ( a, b) :
start = time. time( )
func( a, b)
time. sleep( 1 )
end = time. time( )
print ( f"运行了 { end- start} 秒" )
return inner
@ show_time
def add ( a, b) :
print ( a+ b)
add( 1 , 2 )
import time
def show_time ( func) :
def inner ( * args) :
start = time. time( )
func( * args)
time. sleep( 1 )
end = time. time( )
print ( f"运行了 { end- start} 秒" )
return inner
@ show_time
def add ( * args) :
relust = 0
for i in args:
relust+= i
print ( relust)
add( 1 , 2 , 3 , 4 , 5 )
总结
闭包:能够读取其他函数内部变量的函数
闭包的作用:保存外部函数的变量,不会随着外部函数调用完而销毁
闭包的形成条件:
1. 函数嵌套
2. 内部函数必须使用外部函数的变量或者参数
3. 外部函数返回内部函数,这个使用了外部函数变量的内部函数就称为闭包
装饰器:实际上也是一个闭包函数
装饰器的作用:在不改变原函数的情况下,对已有函数进行额外的扩展功能
装饰器的形成条件:
1. 不修改已有函数的源代码
2. 不修改已有函数的调用方式
3. 给已有函数增加额外的功能