又到了我最烦的内容了哈哈哈,装饰器,早上起床过了一遍,把运行结果都标上了方便看。
代码语言:javascript复制"""
学习内容:
1.调用函数
2.计数器
3.装饰器(函数不带参数)
4.装饰器(函数带有参数)
5.计时器
"""
def func():
a = 10
def inner_func1():
b = 20
s = a b
print(s) # 30
def inner_func2():
inner_func1()
print("--------->")
return inner_func2
f = func()
print(f) # <function func.<locals>.inner_func2 at 0x000001F6CA7C1DC0>
f()
def counter_generate():
container = [0]
def add_1():
# 由于container是一个可变数据类型,因此不用nonlocal
container[0] = container[0] 1
print("这是第{}次计数".format(container[0]))
return add_1
result = counter_generate()
print(result) # <function counter_generate.<locals>.add_1 at 0x000001F6CA7C7550>
result() # 这是第1次计数
result() # 这是第2次计数
result() # 这是第3次计数
# 装饰器
"""
特点:
1.函数作为参数传递给另一个函数
2.有闭包的特点出现
"""
# eg.
# 函数不带参数
def test():
print("this is a test.")
def func1(f): # f = test
print(f) # <function test at 0x00000207041A2040>
f() # 调用函数test ---> this is a test.
print("------------->")
func1(test)
def decorator(func): # func = house
func()
print("正在装修")
# time.sleep(2)
def wrapper():
print("刷漆")
print("铺地砖")
print("装门")
print("装修完成")
return wrapper # 返回wrapper函数,默认被house函数接收
# 使用装饰器
@decorator
def house():
print("我是毛坯房")
house() # house = wrapper 即wrapper()
"""
运行结果:
我是毛坯房
正在装修
刷漆
铺地砖
装门
装修完成
"""
"""
一.要点
1.house称作被装饰函数(在装饰器下面的函数)
2.然后将这个参数传给decorator
3.执行装饰器函数
4.将返回的函数传递给house函数
二.装饰器的使用场景
1.函数执行时间的统计。
2.输出日志信息。
3.不变动原有函数,实现输入参数的处理工作
"""
# 函数带参数
def decorator1(func1): # func1 = f1
def wrapper(x):
print("正在校验中...")
# time.sleep(2)
print("校验完毕")
# 调用原函数
func1(x)
return wrapper
@decorator1
def f1(n):
print("输出的数字------->", n)
f1(10) # f1(10) = wrapper(10)
"""
正在校验中...
校验完毕
输出的数字-------> 10
"""
print("----------------------------------------------")
def decorator2(func3): # func3 = result, =decorator2(result)
def add_together(num1, num2): # num1 = 10, num2 = 20
print("nn正在执行加法运算...")
# time.sleep(2)
func3(num1, num2)
return add_together
@decorator2
def result(num1, num2):
add = num1 num2
print("n相加结果是{}".format(add))
result(10, 20)
"""
正在执行加法运算...
相加结果是30
"""
# 自我练习
# 计数器
def decorator3(function):
count = [0]
def wrapper():
function()
count[0] = count[0] 1
print("正在进行运算第{}次运算".format((count[0])))
# time.sleep(2)
print("完成运算")
return wrapper
@decorator3
def f2():
print("系统启动")
f2()
"""
系统启动
正在进行运算第1次运算
完成运算
"""
f2()
f2()
import time
def decorator5(function):
def inner():
start = time.time()
function()
end = time.time()
print("程序运行时间为{}秒".format(end - start))
return inner
@decorator5
def func8():
time.sleep(1)
print("程序正在运行...")
func8()
def decorator5(function):
def inner():
start = time.time()
function()
end = time.time()
print("程序运行时间为{}秒".format(end - start))
return inner
def func8():
time.sleep(1)
print("程序正在运行...")
func8 = decorator5(func8)
# 装饰器的另一种写法,比语法糖(@)复杂一点.
# func8 = inner 函数
func8()
"""
程序正在运行...
程序运行时间为1.0092978477478027秒
程序正在运行...
程序运行时间为1.0025441646575928秒
"""
计时器的过程分析,由于我实在是写了太多次了,不想再做图了,上我自己手写的图,明天起来继续好好过一遍。