闭包
内部函数对外部函数作用域变量的引用。
函数内的属性都是有生命周期的,都是在函数执行期间
闭包内的闭包函数私有化了变量,类似于面向对象
图片解析
示例一
https://www.bilibili.com/video/av18586448/?spm_id_from=333.788.videocard.16
def func():#外部函数 a=1 #外部函数作用域的变量 print("this is func.") def func1(num):#内部函数其实是闭包函数 print("this is func1") print(num+a) return func1#函数保存了变量a #func()运行外部函数,内部函数就被创建了 var=func()#创建过程在func函数的执行过程中 #var==func1 var(3)#当del var时a就不存在了
示例二
mylist=[1,2,3,4,5] def func(obj): print('func:',obj) def func1(): obj[0]+=1 print('func1',obj) return func1 var=func(mylist) #var:obj,print('func1',obj)
装饰器
装饰器,是语法糖 用@
@func1
def func():
print('aaa')
不影响原有函数的功能,还能添加新功能
>@func1
>def myprint():
myprint()==func2()+myprint()
普通装饰器 zsq(bzs)()
装饰器函数带参数:dczsq(cs='man')(bza)()
多一层包装来接收装饰器的参数
被装饰的函数带参数:只需在最内部函数传入参数即可
示例一
def arg_fun(sex) def func(b_func): def func2() if sex=='man': print('你不可以生娃') if sex=='woman': print('你可以生娃') return b_func() return func2 return fun1 #arg_func(sex='man')()()>func1 #func1()>func2 #func2()>(''你不可以生娃'')or('你可以生娃') @ arg_fun() def man(): print('好好上班') @ arg_fun() def woman(): print('好好上班') man() woman()
示例二
def func1(func) def func2(x,y) print(x,y) x+=5 y+=5 return func(x,y) return func2 @func1 def mysum(a,b) print(a+b) mysum(1,2)
示例三
import time def display_time(func): def wrapper(*args): t1=time.time() result=func(*args) t2=time.time() print("Total time:{:.4} s".format(t2-t1)) return result return wrapper def is_prime(num) if num<2: return False: elif num==2: return True else: for i in range(2,num): if num%i==0: return False return True @display_time def count_prime_nums(maxnum): count=0 for i in range(2,maxnum): if is_prime(i): count=count+1 return count count=count_prime_nums(10000) print(count)