前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >装饰器、计时器、计数器

装饰器、计时器、计数器

作者头像
y191024
发布2022-09-20 19:00:42
3890
发布2022-09-20 19:00:42
举报
文章被收录于专栏:睡不着所以学编程

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

代码语言: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("\n\n正在执行加法运算...")
        # 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秒
"""

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 睡不着所以学编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档