当前位置: 首页 > wzjs >正文

快3网站制作 优帮云小程序定制开发公司哪家好

快3网站制作 优帮云,小程序定制开发公司哪家好,电商是做什么工作的,福建优化seo一、装饰器基础概念 在 Python 项目中,当看到函数上方有 xxx 这样的标识,它就是装饰器。装饰器本质上是一个 Python 函数,属于高阶函数,即接收一个函数作为参数,并返回一个新函数来替代原函数。其主要作用是在不修改目…

一、装饰器基础概念

在 Python 项目中,当看到函数上方有 @xxx 这样的标识,它就是装饰器。装饰器本质上是一个 Python 函数,属于高阶函数,即接收一个函数作为参数,并返回一个新函数来替代原函数。其主要作用是在不修改目标函数代码的前提下,为函数或方法增加额外功能。

二、装饰器的优势

遵循 DRY 原则:当一个函数承担过多功能时,代码会显得混乱且可读性差。通过装饰器,可将部分相同或可复用的功能提取到新函数中,避免重复代码,实现 DRY (Don't Repeat Yourself)。

提高可读性:将特定功能从业务逻辑函数中分离,使业务逻辑函数更专注于核心功能,从而提升代码的整体可读性。

三、装饰器示例:计算质数并计时

普通函数实现

import timedef is_prime(num):if num < 2:return Falseelif num == 2:return Trueelse:for i in range(2, num):if num % i == 0:return Falsereturn Truedef prime_nums():t1 = time.time()for i in range(2, 10000):if is_prime(i):print(i)t2 = time.time()print(f"执行时间:{t2 - t1}秒")prime_nums()

此代码计时功能(使用 time 模块)与寻找质数的核心逻辑混在一起,使代码逻辑不够清晰。

装饰器实现

import time# 定义一个装饰器
def display_time(func):# 定义一个内部函数,在装饰器中wrapper函数是常用的函数名,并非强制,约定俗成。def wrapper():start_time = time.time()func()end_time = time.time()print(f"执000000行时间: {end_time - start_time} 秒")# 返回函数对象,如果是return wrapper()则是立即执行wrapper函数return wrapper# 继续定义判断质数的函数
def is_prime(num):"""判断一个数是否为素数"""if num < 2:return Falseelif num == 2:return Trueelse:for i in range(2, num):if num % i == 0:return Falsereturn True# 装饰器的标准写法
@display_time
def prime_nums():"""找出2到10000之间的所有素数并打印"""for i in range(2, 10000):if is_prime(i):print(i)
prime_nums()

装饰器原理 

装饰器函数 display_time 接收函数 func 作为参数,内部定义了 wrapper 函数。wrapper 函数记录原函数执行前后的时间,然后打印执行时间。最后,display_time 返回 wrapper 函数对象。

执行流程

  1. 定义装饰器函数 display_time,它接收函数 func 作为参数,并返回 wrapper 函数。
  2. 定义被装饰函数 prime_nums,此时它是一个普通函数对象。
  3. 应用装饰器:当看到 @xxx 写在某个函数上方时,xxx 所代表的装饰器函数会将紧跟其后定义的函数作为 func 参数传入即执行 display_time(prime_nums)
  4. 替换原函数:display_time 返回 wrapper 函数,用这个新函数覆盖原来的 prime_nums。因此,调用 prime_nums() 时,实际执行的是 wrapper(),它会记录开始时间,调用原函数 func(),记录结束时间并打印耗时。

装饰器的语法糖与设计思想

在 Python 中,语法糖(Syntactic Sugar)指的是语言提供的一些特殊语法结构,这些结构使代码编写更加简洁、易读,但不会增加语言本身的功能。它们本质上是对常规操作的一种简洁表达方式,编译器或解释器会将其转换为底层的常规代码。@display_time 这种写法就是 Python 中的语法糖,它等价于:

def prime_nums():...  # 函数体
prime_nums = display_time(prime_nums) 

在不使用语法糖时,我们要手动将函数传递给装饰器函数,并使用返回的新函数。而使用 @ 语法糖,代码看起来更简洁直观,Python 会自动帮我们完成函数传递和替换的操作。

带参数的装饰器与返回值处理

带参数的装饰器:如果被装饰函数需要传入参数,装饰器函数也需要相应地处理这些参数。为了使装饰器更具通用性,可使用可变参数 *args 和 **kwargs 接收任意数量的位置参数和关键字参数。

比如这里在 display_time 内部定义了 wrapper 函数。wrapper 函数使用 *args 和 **kwargs 作为参数,这样设计是为了让 wrapper 函数能够适配不同参数形式的被装饰函数。

import timedef display_time(func):"""支持任意参数的时间统计装饰器"""def wrapper(*args, **kwargs):t1 = time.time()result = func(*args, **kwargs)t2 = time.time()print(f"函数执行时间: {t2 - t1} 秒")return resultreturn wrapper@display_time
def add(a, b):return a + badd(3, 5)

返回值处理:当被装饰的函数有返回值时,装饰器内部的 wrapper 函数需要接收并返回原函数的返回值,以确保被装饰函数的返回值能正常传递给调用者,维持其原有的功能特性。

在上述示例中,add 函数返回两数之和,wrapper 函数通过 result = func(*args, **kwargs) 获取原函数返回值,并通过 return result 返回,确保原函数的返回值能正确传递。

练习

编写一个装饰器 logger,在函数执行前后打印日志信息(如函数名、参数、返回值)

@logger
def multiply(a, b):return a * bmultiply(2, 3)  
# 输出:
# 开始执行函数 multiply,参数: (2, 3), {}
# 函数 multiply 执行完毕,返回值: 6
# 答案def logger(func):def wrapper(*args, **kwargs):  # args 是元组,kwargs 是字典print(f"开始执行函数 {func.__name__},参数: {args}, {kwargs}")result = func(*args, **kwargs)print(f"函数 {func.__name__} 执行完毕,返回值: {result}")return resultreturn wrapper@logger
def multiply(a, b):return a * b multiply(2, 3) 
# 输出:
开始执行函数 multiply,参数: (2, 3), {}
函数 multiply 执行完毕,返回值: 6
6multiply(a=2, b=3)  
# 输出:
开始执行函数 multiply,参数: (), {'a': 2, 'b': 3}
函数 multiply 执行完毕,返回值: 6
6multiply(2, b=3)  
# 输出:
开始执行函数 multiply,参数: (2,), {'b': 3}
函数 multiply 执行完毕,返回值: 6
6multiply(a = 2, 3) 
# 报错,因为所有关键字参数必须跟在位置参数后面

@浙大疏锦行


文章转载自:

http://UriDD6bf.gcdzp.cn
http://PWXbNi9s.gcdzp.cn
http://RIswHUpx.gcdzp.cn
http://Dt4xlHMv.gcdzp.cn
http://gLUswBV4.gcdzp.cn
http://53nLL04K.gcdzp.cn
http://5WwkXIKB.gcdzp.cn
http://3tVNGZQp.gcdzp.cn
http://2ruW4Wax.gcdzp.cn
http://3GYECd3g.gcdzp.cn
http://3yIsupEh.gcdzp.cn
http://ZW60pCPY.gcdzp.cn
http://gdS6uCpN.gcdzp.cn
http://M5yAWPo1.gcdzp.cn
http://HE7Jx8nX.gcdzp.cn
http://UQlGXbCR.gcdzp.cn
http://WoW4cvMN.gcdzp.cn
http://UhMJpYtq.gcdzp.cn
http://4EcmYe4i.gcdzp.cn
http://0kqi6pE8.gcdzp.cn
http://LvtWW7Yz.gcdzp.cn
http://yUgA5rlP.gcdzp.cn
http://uItVpen2.gcdzp.cn
http://HP7HUnte.gcdzp.cn
http://g2ibEN7U.gcdzp.cn
http://GnlWJA3G.gcdzp.cn
http://nawrN7A4.gcdzp.cn
http://yIvlE0Vf.gcdzp.cn
http://9QbVh8AJ.gcdzp.cn
http://hUW9BBcw.gcdzp.cn
http://www.dtcms.com/wzjs/647383.html

相关文章:

  • 专业的网站搭建多少钱网络技术基础
  • 成都新线加网站建设未来做那些网站能致富
  • 自适应网站设计规范开发公司顶名字购买房子
  • 有哪些营销型网站衡水做wap网站的地方
  • 汽车网站方案庆阳网警
  • 网站设计师是什么专业做线上网站需要多少钱
  • 广州陈村网站建设网页设计专业开设院校
  • 深圳网站制作建设服务公司广州网站建设公司有哪些
  • 重点学科网站建设网站 信息内容建设 存在问题
  • 网站后台管理系统域名wordpress设置 vip栏目
  • 网站建设试题以及答案物流信息平台
  • 鞍山做百度网站一年多少钱wordpress docker镜像
  • 企业网站目的黄页大全有哪些
  • 律师网站建设推荐自媒体视频剪辑教学视频
  • 怎么做类似豆瓣的网站南昌网站建设公司特色
  • 购物网站开发设计思路怎么向谷歌提交网站
  • 关于文化的网站模板怎么在百度上注册店铺
  • 网站本地化怎么做直播网站建设项目策划书
  • 网页代码大全详解宁波网站优化建站公司
  • 山西建设工程备案网站wordpress安装空白页
  • 如何登陆公司网站后台宁波高端网站建设
  • 中国建设网官网网站手机h5免费模板网站模板
  • 免费网站制作模板2003建网站
  • 福州网站建设软件怎么建设网站上传音乐
  • 番禺建设网站专家茶叶网站模板
  • 做网站去哪里找软件开发文档怎么编写
  • 上海徐汇区网站建设公司慧聪网de网站建设策略
  • 自助设计网站synology wordpress
  • 做自动化设备哪个网站南京历史文化网页设计
  • 网站案例网站建设外语网站建设目的