首页 > 编程语言 >Python装饰器

Python装饰器

时间:2024-07-13 09:29:05浏览次数:17  
标签:get Python sum nine time print table 装饰

装饰器(Decorators)是 Python 的一个重要部分。

我们现在想要在程序中定义两个函数,分别用类打印九九乘法表和计算N以内的数字累加的和。

#定义功能: 打印九九乘法表
def print_nine_table():
    for line in range(1, 10):
        for column in range(1, line + 1):
            print(f"{column} * {line} = {column * line}", end="\t")
        print()
        
#定义功能,完成N以内的数字的计算
def get_sum(n):
    sum = 0
    for i in range(1, n + 1):
        sum += i
    print(sum)

现在来了个需求,我需要统计九九乘法表的方法需要执行多长时间!

time_start = time.time()
print_nine_table()
time_end = time.time()
print(f"任务耗时: {time_end - time_start}")

 一个函数的执行时间统计可以这样去统计,可是如果是多个函数呢?例如有10个函数,都需要统计计算时间改怎么办?是不是需要重复的去定义time_start、time_end以及去计算差值呢?其实没有必要,我们只需要将这些重复的部分单独提取出来即可。那么中间需要执行的代码怎么办?可以使用函数参数来实现。

def get_function_time(function, *args, **kwargs):
    time_start = time.time()
    result = function(*args, **kwargs)
    time_end = time.time()
    print(f"任务耗时: {time_end - time_start}")
    return result
    
get_function_time(print_nine_table)
get_function_time(get_sum, 10)

 基本的功能解决了,如果想要通过调用原来函数的名字,既能实现原来的功能,又能统计消耗的时间,又该怎么做呢?例如: print_nine_table() 既能打印九九乘法表,又能打印消耗的时间。此时就需要新建一个变量,用来临时存储之前的功能。

other = print_nine_table
print_nine_table = get_function_time
print_nine_table(other)
other = get_sum
get_sum = get_function_time
get_sum(other, 20)

此时又出现了重复的操作: 定义第三方变量,赋值、调用,因此,能不能把这个过程再简化一下? 

def transform(func):
    return get_function_time
    
print_nine_table = transform(print_nine_table)
print_nine_table(get_sum, 10)

此时出现问题,如果我将transform的返回值使用print_nine_table接收,那么就不能求print_nine_table本身的时间了。

如何在函数A中,获取到函数B的数据?嵌套函数!

def transform(func):
    def get_function_time(*args, **kwargs):
        time_start = time.time()
        result = func(*args, **kwargs)
        time_end = time.time()
        print(f"任务耗时: {time_end - time_start}")
        return result
    return get_function_time
    
print_nine_table = transform(print_nine_table)
print_nine_table()
get_sum = transform(get_sum)
get_sum(20)

 终于写完了,但是太麻烦了!

Python提供了@语法糖的替换操作!
相当于 test_transform = transform(test_transform)

@transform
def test_transform():
    print("test_transform")

 

"""
装饰器案例:
        APP中有点赞、评论等操作,
        设计装饰器,在执行点赞、评论操作的时候,先让用户登录,登录成功可以继续操作
"""
def login_check(func):
    def inner(*args, **kwargs):
        username = input("请输入用户名: ")
        password = input("请输入密码: ")
        if username == "root" and password == "123456":
            func(*args, **kwargs)
        else:
            print("登录失败,再见!")
    return inner
    
@login_check
def comment(content):
    print(f"发布评论: {content}")
    
comment("HAHAHA")

 

 

 

标签:get,Python,sum,nine,time,print,table,装饰
From: https://blog.csdn.net/n2670820434/article/details/140394576

相关文章

  • 第八篇:Python集合:高效的无序集数据结构
    1.集合的定义Python中的集合(set)是一种高度优化的无序且不重复的数据结构。它在概念上类似于数学中的集合,能够存储多个不同的元素。集合的这种特性使其成为处理唯一性和成员资格检查的理想选择。在Python中,我们可以通过两种主要方式定义集合:a)使用花括号{}:set1={1,......
  • 总结篇:Python数据类型总结
    在Python中,数据类型是编程的基础。理解和熟练运用各种数据类型及其操作方法,是编写高效、优雅代码的关键。本文将结合自己的理解,详细介绍Python中的几种基本数据类型及其常用操作。一.整数(Int)整数是最基本的数据类型之一,主要用于表示没有小数部分的数值。常用操作:1.声明整......
  • Python项目开发实战,掷硬币的连胜,案例教程编程实例课程详解
    在Python中进行实战项目,比如模拟掷硬币并记录连胜次数,是一个既有趣又能加深理解随机数生成、循环控制、条件判断等编程基础的好方法。下面,我将逐步引导你完成一个详细的Python项目,该项目将模拟掷硬币的过程,并追踪记录连胜的次数,同时我们会深入探讨一些编程概念,如函数封装、异常......
  • 初学者必看的 3 个 Python 小项目
    我们都知道,将知识点融入实际操作是提高编程学习效率的关键。尤其对于初学者来说,通过学习一些涉及核心编程概念的简单项目,不仅可以深化对编程语言的理解,还能快速提高解决问题的能力。下面将探讨三个基础的Python项目:计算器、猜数字游戏和待办事项列表,旨在巩固Python基础......
  • 教你使用 python 不到100行 制作 音乐播放器
    在这篇博客中,我们将使用Python的PyQt5和pygame库来创建一个简单的音乐播放器应用程序。我们的音乐播放器将具有基本的播放、暂停、上一首和下一首功能。导入所需的库首先,我们需要导入我们将在应用程序中使用的库:importosimportpygameimportqtawesomeasqtafr......
  • python 校验密码强度
    在我们的日常生活中,密码的安全性是非常重要的。无论是我们的电子邮件账户,社交媒体账户,还是银行账户,都需要一个强大的密码来保护。在这篇文章中,我将向你展示如何使用Python来检查密码的强度。代码解析首先,我们需要导入 string 库。importstring然后,我们定义一个函数......
  • 用python处理excel数据
    1.小技巧:用print()检查代码,可以把想检查的变量作为参数放进括号内打印出来,便于检查2.第三方库:1.xlrd读取excel文件。 2.xlwt写入excel文件。 3.xlutils一组excel高级操作的工具3.xlrd包含四个功能:1.读取有效单元格的行数和列数。2.读取指定行或列所有单元格的值。3.读取......
  • 【Python 基础】列表 - 1
    列表在你能够开始编写程序之前,还有一个主题需要理解,那就是列表数据类型及元组。列表和元组可以包含多个值,这样编写程序来处理大量数据就变得更容易。而且,由于列表本身又可以包含其他列表,所以可以用它们将数据安排成层次结构。列表数据类型“列表”是一个值,它包含多个字构......
  • 【python学习】面向对象编程以及面向对象编程的核心概念和使用方法
    引言Python语言设计之初,就是为了面向对象,所以Python的面向对象更加易于理解。面向对象编程中,我们将现实世界的实体视为对象,每个对象都有属性(数据)和行为(方法)文章目录引言一、面向对象编程是什么二、面向过程编程和面向对象编程的区别2.1面对过程编程2.2面向对象编......
  • 【Python123题库】#查询省会 #字典的属性、方法与应用
    禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/140081665参考教程:B站视频讲解——https://space.bilibili.com/3546616042621301有帮助麻烦点个赞~~Python123题库查询省会字典的属性、方法与应用查询省会类型:字典‪‬‪‬‪‬‪‬‪‬‮‬‪‬......