闭包
https://www.bilibili.com/video/av18586448?from=search&seid=6330694885542181095
内部函数对外部函数作用域变量的引用。
函数内的属性都是有生命周期的,都是在函数执行期间
闭包内的闭包函数私有化了变量,类似于面向对象
图片解析
示例一
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(sex='man'):
print('好好上班')
@ arg_fun()
def woman(sex='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):#装饰器函数,func指的是 prime_nums()
def wrapper(*args):
t1 = time.time()
result=func(*args)#执行装饰器里面的函数,count结果保存在result中
t2 = time.time()
print("Total time:{:.4}s".format(t2 - t1))
return result
return wrapper() def is_prime(num):#判断是否是质数
if num < 2:#num为1,
return False#判断不是质数
elif num == 2:
return True
else:
for i in range(2,num):
if num % i == 0:#如果存在某个数i使得num除以i的结果是9,那么num就不是质数,
return False#结果判断不是质数
return True
#装饰器函数需要执行额部分
@display_time
def count_prime_nums(maxnum):#统计质数个数
count=0
for i in range(2,maxnum):
if is_prime(i):
#print(i)
count=count+1
return count
count=count_prime_nums(10000)
#prime_nums()
print(count)
#注意函数1中的执行顺序:先计算time1,再执行装饰器里面的函数,当遇到func,执行函数3,最后计算time2
#当函数3中有多个参数,且不确定个数的时候,通过*args以元组的形式进行收集