装饰器、计时器、计数器

2022-09-20 19:00:42 浏览数 (1)

又到了我最烦的内容了哈哈哈,装饰器,早上起床过了一遍,把运行结果都标上了方便看。

代码语言: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秒
"""

计时器的过程分析,由于我实在是写了太多次了,不想再做图了,上我自己手写的图,明天起来继续好好过一遍。

0 人点赞