python-16

 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
posted @ 2018-06-19 22:35  xiaodingzi  阅读(217)  评论(0编辑  收藏  举报