本节内容
1 迭代器和装饰器
2 装饰器
3 Json 和 Pickle数据序列化
4 软件目录结构规范
5 作业:ATM项目开发
一 装饰器
1 装饰器:2 定义:本质是函数,(装饰其他函数),就是为其他函数添加附加功能3 原则: 1-不能修改被装饰的函数的源代码 2-不能修改被装饰的函数的调用方式 实现装饰器知识储备:1.函数即"变量" (定义函数体到内存房间,函数体是字符串,调用的时候,通过函数名直接调取内存的函数体,函数名就是内存地址)2.高阶函数 满足下面两个条件之一就是高阶函数 A:把一个函数名当作实参传给另一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
def bar(): print("in the bar") def test1(func): print(func) func() test1(bar) # 此处bar 就是 把 func = bar ,func等于bar了,意思就是fucn 有了内存地址,有了函数体
import time def bar(): time.sleep(3) print("in the bar") def test1(func): start_time = time.time() func() stop_time = time.time() print("the func run time is %s "%(stop_time-start_time)) # 这里就是func 运行的时间 test1(bar)
B:返回值中包含函数名(不修改函数的调用方式)
import time def bar(): time.sleep(3) print("in the bar") def test2(func): print(func) return func bar = (test2(bar)) bar() # 这里实现了未改变源代码的情况下,增加打印func(其实就是bar的内存地址)的内存地址的功能 # 并且未改变源函数的调用方式
3.嵌套函数
def foo(): print("in the foo") def bar(): # 函数的嵌套是 在一个函数的函数体内用def 去申明一个函数(而不是调用函数) print("in the bar") bar()
高阶函数+嵌套函数 = 装饰器
__author__ = ‘shellxie‘ # -*- coding:utf-8 -*- import time def timmer(fuc): #未修改源代码 def warpper (*args,**kwargs): start_time = time.time() fuc() stop_time = time.time() print("in the fuc run time %s"%(stop_time-start_time)) return warpper @timmer #调用装饰器 def test1(): # 一个被装饰的函数 time.sleep(3) print("in the test1") test1()
装饰器1.0版
import time def timer(func): # 这时候timer(test1) 就是tiemr(func) func = test1 def deco(): start_time = time.time() func() # 这时候是run test1 stop_time = time.time() print("the func run time %s"%(stop_time-start_time)) return deco def test1(): time.sleep(3) print( "in the test1") # 在不改变调用方式以及源代码的情况下,给源函数增加功能 def test2(): time.sleep(3) print("in the test2") print(timer(test1)) test1= (timer(test1)) test1() # 这时候test1() ------就是执行deco的内存地址然后调用
装饰器1.0版优化
import time def timer(func): # 这时候timer(test1) 就是tiemr(func) func = test1 def deco(): start_time = time.time() func() # 这时候是run test1 stop_time = time.time() print("the func run time %s"%(stop_time-start_time)) return deco @timer # 这一步的意思就是test1 = timer(test1) def test1(): time.sleep(3) print( "in the test1") # 在不改变调用方式以及源代码的情况下,给源函数增加功能 @timer def test2(): time.sleep(3) print("in the test2") test1() test2()
时间: 2024-10-09 20:11:56