今天的课程总结:
- 装饰器
- 迭代器&生成器
- json&pickle实现数据的序列化
- 软件目录结构规范
一、装饰器
装饰器的本质是函数,起目的就是用来为其它函数增加附加功能
原则:不能修改被装饰函数的源代码;被装饰函数的调用方式不能改变 ,简而言之就是转时其对于函数就是透明的,对被装饰的函数是没有影响的。
实现装饰器的知识储备:函数即变量;高阶函数;嵌套函数;最终高阶函数加上嵌套函数就构成了装饰器,函数也就是一种变量
知识点介绍:
函数即变量
高阶函数:
a.把一个函数名仿作实参传给另外一个函数(不修改装饰函数源代码的情况下为其添加功能)
import time def test1(func): start_time = time.time() func() stop_time = time.time() print("toyal %s"%(stop_time-start_time)) def bar(): time.sleep(3) print("in the bar!!") test1(bar) #其中,test1相当于是一个装饰器,但不完全是。test1(bar)
b.返回值中包含函数名(不用修改函数的调用方式)
#!/usr/bin/env python # -*- coding:utf-8 -*- import time def test1(func): print(func) return func def bar(): time.sleep(3) print("in the bar!!") bar = test1(bar) bar()
嵌套函数:
#!/usr/bin/env python # -*- coding:utf-8 -*- #函数的嵌套 def foo(): print("hello World") def bar(): print('in the bar!!') bar() foo()
然后就是装饰器了:说白了装饰器就是高阶函数和嵌套函数的结合
装饰器的一个栗子:
import time ##装饰器部分 def timer(func): def deco(): start_time = time.time() #return func() func() stop_time = time.time() print("total is %s:"%(stop_time-start_time)) return deco @timer #调用装饰器 ##test1和test2函数相当于是源代码,然而一直没改变原代码而是显得功能添加,这就是装饰器达成的效果 def test1(): time.sleep(1) print('test1') @timer #装饰器外城函数名 def test2(): time.sleep(2) print("test2") test1() test2()
要是传入了参数,就利用参数组修改:
#!/usr/bin/env python # -*- coding:utf-8 -*- import time def timer(func): def deco(*args): #如果带了参数组,下面源代码中的参数传递就可以被调用了 start_time = time.time() func(*args) stop_time = time.time() print("total is %s"%(stop_time-start_time)) return deco @timer def test1(): time.sleep(0.1) print("heheheheh") @timer def test2(name): time.sleep(1) print("test2",name) test1() test2("wanghui")