本节内容
迭代器&生成器
装饰器
Json & pickle 数据序列化
软件目录结构规范
作业:ATM项目开发
1.装饰器(语法糖)
定义:本质是函数,(装饰其他函数),就是为其他函数添加附加功能
原则:
不能修改被装饰函数的源代码
不能修改被装饰函数的调用方式
实现装饰器“知识”储备:
1.函数即“变量”
2.高阶函数
a.把一个函数名当作实参传给另一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
def bar():
print("in the bar")
def test1(func): #test1(bar)
print(func)
func() #相当于bar()
test1(bar) #此时相当于 func=bar
--------输出--------
in the bar
1 importtime2 defbar():3 time.sleep(3)4 print("in the bar")5 defdeco(func):6 start_time=time.time()7 func()8 stop_time=time.time()9 print("the func run time is %s"%(stop_time-start_time))10 deco(bar) #但是其实这个例子不合适,因为改变了调用方式
11 #bar() 这才是原来的调用方式
12
13 ------输出-----
14 inthe bar15 the func run time is 3.0007259845733643
举例
b.返回值包含函数名(不修改函数调用方式)
1 defbar():2 print("in the bar")3 def deco(func): #func=bar
4 print(func) #打印bar的内存地址
5 return func #再返回bar的内存地址
6 #内存地址+()就能运行
7
8 deco(bar) #把内存地址即函数名传给deco
9 print("----分割线---")10 print(deco(bar)) #把return返回值打印出来
11 print("------||------")12 deco(bar()) #把返回值传给deco,不符合高阶函数的定义
13
14 ----------输出------
15
16 ----分割线---
17
18
19 ------||------
20 inthe bar21 None
View Code
因此,可以得到在不改变调用方式的情况下的做法
def bar():
print("in the bar")
def deco(func): #func=bar
print(func) #打印bar的内存地址
return func #再返回bar的内存地址
#内存地址+()就能运行
bar=deco(bar) #将return返回的值赋值给bar
bar() #此时bar为内存地址,所以bar+()就能运行bar这个函数
------输出-----
in the bar
3.嵌套函数
定义:在函数体内,用def去声明一个新的函数。而不是去调用他
def foo():
print("in the foo")
def bar():
print("in the bar/")
bar() #局部变量只能在局部函数内调用
foo()
‘‘‘
def foo():
bar() #这种是直接调用
‘‘‘
-------输出----
in the foo
in the bar/
4.高阶函数+嵌套函数==》装饰器
匿名函数
def plus(n): #函数名plus
return n+1
plus2 = lambda x:x+1 #没有函数名字,只有变量名
#但是两者得到的结果是一样的
#lambda x:x+1 起了个名字叫plus2,相当于def plus2(x)