1 #知识点一、函数的作用域
2
3 int() #内置变量 B
4 v = 6 #全局变量G
5 def outer():
6
7 x = 5 #嵌套变量 E
8
9 def inner():
10
11 b = 10 #局部变量 L
12 print(x)
13
14 #知识点二、高阶函数
15 #什么是高阶函数? 二条件有一个条件符合即可 1.函数名可以作为参数传入函数 2.函数名可以作为返回值
16
17 def test(inner):
18 return outer
19
20 #知识点三、闭包
21 #什么是闭包? 内部函数,对外部作用域(而非全局作用域)进x行引用,那么该内部函数就是闭包
22 #闭包的用处: 闭包函数可以脱离外部作用域而直接可以调用外部作用域 x
23
24 def fuck():
25
26 x = 10 #外部作用域 而非全局作用域
27 def shit(): #内部函数
28 print(x) #对外部作用域进x行引用
1 # 装饰器
2
3 #1.需求:计算函数执行的时间,假如要计算的函数个数为300个,该怎么处理?
4 #假设要计算的函数对象如下:
5 def test():
6
7 print("test...")
8
9 #因为要计算300个函数的执行时间,涉及到代码的重复,所以需要专门定义个计算函数执行时间的函数
10 import time
11 def showtime(f):
12 start = time.time() #开始时间
13 #这里是函数的执行 函数名为传入的参数f
14 f() #这是函数逇执行
15 end = time.time() #结束时间
16
17 print(end-start) #计算执行了多长时间
18 # 进一步优化以上函数
19 # 需求:每次都要调用这个新函数,为了简便,需要对该函数重新命名成需要计算函数执行时间的函数名
20 # 优化二:
21 # 重新定义个test变量 让其等于该showtime()函数
22 test = showtime
23 test() #如果是这样执行的话原 shoutime()函数的参数该怎么传过去呢?因为这样的话test()函数执行后与原函数指向一样
24 # 优化三:
25 # 优化计时器函数
26
27 def showtime(f):#这是外部函数
28 def inner():
29 start = time.time() #开始时间
30 #这里是函数的执行 函数名为传入的参数f
31 f() #这是函数逇执行###############这里使用到了闭包
32 end = time.time() #结束时间
33 print(end-start) #计算执行了多长时间
34 return inner
35
36 test = showtime(test) # 该语句python中做了进一步优化 使用@
37 test() #执行函数 就执行了计算函数执行时间的函数
38
39 # 优化三:
40 @showtime
41 def test():
42 print("test...")
43 test() #函数的执行,计算函数的执行时间
1 #装饰器参数
2 #待装饰函数参数
3
4 #定义装饰函数
5 #功能 计算函数的执行时间
6 # 闭包函数 :就是让需要装饰的函数先执行该闭包函数以实现该装饰功能
7 # 然后再执行该函数本身的原始定义
8
9 #这是无参数状态
10 import time
11 def showTime(f):
12
13 def showWratter(): #这里不能穿多参数
14 start = time.time()
15 f()
16 time.sleep(2)
17 end = time.time()
18 print(end -start)
19 return showWratter #记住一定要返回该闭包函数名
20
21 #定义待装饰函数
22 @showTime
23 def test(): #被执行的函数的参数要有闭包函数的参数要一致
24 print("我爱北京天安门")
25 test()
1 #装饰对象 带参数
2 import time
3 def showTime(f):
4
5 def showWratter(*args): #这里不能穿多参数
6 start = time.time()
7 f(*args)
8 time.sleep(2)
9 end = time.time()
10 print(end -start)
11 return showWratter #记住一定要返回该闭包函数名
12
13 #定义待装饰函数
14 @showTime
15 def add(*args): #被执行的函数的参数要有闭包函数的参数要一致 这里带了参数
16
17 all = 0
18 for i in args:
19 all +=i
20 print("我爱北京天安门",all)
21 add(1,3,4,5,6) # 我爱北京天安门 19
1 # 装饰器需要传参数
2 # 需求:我需要传个参数,如 flag 为true时候打印日志,为false时候不打印日志
3 # 该怎么传参数呢?
4 # 实现如下:通过闭包函数时间传参数 因为闭包函数能够引用外部的参数 利用了这点
5 import time
6 def logger(flag):
7 def showTime(f):
8
9 def showWratter(*args): #这里不能穿多参数
10 start = time.time()
11 f(*args)
12 if flag == "True":
13 print("这里打印出日志来了!")
14 time.sleep(2)
15 end = time.time()
16 print(end -start)
17 return showWratter #记住一定要返回该闭包函数名
18 return showTime #返回值
19
20 #定义待装饰函数
21 @logger("True") # 装饰器参数逇使用
22 def add(*args): #被执行的函数的参数要有闭包函数的参数要一致 这里带了参数
23
24 all = 0
25 for i in args:
26 all +=i
27 print("我爱北京天安门",all)
28 add(1,3,4,5,6) # 我爱北京天安门 19