ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【Python百日基础系列】Day24 - Python装饰器:Dash回调预备

2021-11-14 09:30:37  阅读:230  来源: 互联网

标签:函数 Python Day24 Dash lst time print com 装饰


文章目录


视频讲解:

一、Python装饰器是什么?

python中的装饰器用于修饰函数,以增强函数的行为:记录函数执行时间,建立和撤销环境,记录日志等。
装饰器可以在不修改函数内部代码的前提下实现以上增强行为。

  • 装饰器是函数的智慧帽。
  • 装饰器是函数的催化剂。
  • 装饰器是函数美丽的外衣。

二、Python 最常用的装饰器:计时器

2.1 计算素数:函数内运行快

同样的代码段,封装在函数内,运行速度快,那是因为局部变量比全局变量效率高,所以尽量减少全局变量的使用量。

# 计算素数
t1 = time.time()
lst_com = []
for i in range(2, 10001):
    is_com = 0
    if i ==2 or i == 3:
        lst_com.append(i)
    if i % 2 ==0 or i % 3 == 0:
        continue
    for j in range(6, int(math.sqrt(i))+2, 6):
        if i % (j-1) == 0 or i % (j+1) == 0:
            is_com = 1
    if is_com == 1:
        continue
    lst_com.append(i)
# print(lst_com)
t2 = time.time()
print(f'取出素数{len(lst_com)}个,耗时{t2-t1}秒。')

def prime_number(str_num, end_num):
    t1 = time.time()
    lst_com = []
    for i in range(str_num, end_num):
        is_com = 0
        if i ==2 or i == 3:
            lst_com.append(i)
        if i % 2 ==0 or i % 3 == 0:
            continue
        for j in range(6, int(math.sqrt(i))+2, 6):
            if i % (j-1) == 0 or i % (j+1) == 0:
                is_com = 1
        if is_com == 1:
            continue
        lst_com.append(i)
    # print(lst_com)
    t2 = time.time()
    print(f'取出素数{len(lst_com)}个,耗时{t2-t1}秒。')

if __name__ == '__main__':
    prime_number(2, 1000001, times=100)

输出结果:
取出素数1229个,耗时0.0109710693359375秒。
取出素数1229个,耗时0.00698089599609375秒。

2.2 最常用的装饰器:计时器

import math
import time


def run_time(func):
    """ 外层为装饰器函数,参数为被装饰的函数 """
    def wrapper(*args,**kwargs):
        """ 内层为功能增强函数,可以接收被装饰函数的参数,其中,*args:接收位置参数,**kwargs:接收关键字参数 """
        start = time.time()
        result = func(*args,**kwargs)
        end = time.time()
        print(f'*args:{args}')
        print(f'**kwargs:{kwargs}')
        print(f'运行时间(s):{end - start}')
        return result
    return wrapper


@run_time
def prime_number(str_num, end_num, times):
    lst_com = []
    for i in range(str_num, end_num):
        is_com = 0
        if i ==2 or i == 3:
            lst_com.append(i)
        if i % 2 ==0 or i % 3 == 0:
            continue
        for j in range(6, int(math.sqrt(i))+2, 6):
            if i % (j-1) == 0 or i % (j+1) == 0:
                is_com = 1
        if is_com == 1:
            continue
        lst_com.append(i)
    # print(lst_com)
    print(f'取出素数{len(lst_com)}个')

if __name__ == '__main__':
    prime_number(2, 1000001, times=100)

输出结果:
取出素数1229个
args:(2, 10001)
kwargs:{'times': 100}
运行时间(s):0.007979631423950195

三、带参数的装饰器函数

import math
import time


def run_time(doc):
    """ 外层为装饰器函数,接收装饰器函数的参数 """
    def logger(func):
        """ 中间层参数为被装饰的函数 """
        print(f'装饰器函数的参数doc为:{doc}')
        def wrapper(*args,**kwargs):
            """ 内层为功能增强函数,可以接收被装饰函数的参数,其中,*args:接收位置参数,**kwargs:接收关键字参数 """
            start = time.time()
            result = func(*args,**kwargs)
            end = time.time()
            print(f'*args:{args}')
            print(f'**kwargs:{kwargs}')
            print(f'运行时间(s):{end - start}')
            return result
        return wrapper
    return logger


@run_time(123)
def prime_number(str_num, end_num, times):
    lst_com = []
    for i in range(str_num, end_num):
        is_com = 0
        if i ==2 or i == 3:
            lst_com.append(i)
        if i % 2 ==0 or i % 3 == 0:
            continue
        for j in range(6, int(math.sqrt(i))+2, 6):
            if i % (j-1) == 0 or i % (j+1) == 0:
                is_com = 1
        if is_com == 1:
            continue
        lst_com.append(i)
    # print(lst_com)
    print(f'取出素数{len(lst_com)}个')

if __name__ == '__main__':
    prime_number(2, 1000001, times=100)

输出结果:
装饰器函数的参数doc为:123
取出素数1229个
*args:(2, 10001)
**kwargs:{'times': 100}
运行时间(s):0.006983757019042969

标签:函数,Python,Day24,Dash,lst,time,print,com,装饰
来源: https://blog.csdn.net/yuetaope/article/details/121313942

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有