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

网站做支付宝支付接口嘉兴模板建站代理

网站做支付宝支付接口,嘉兴模板建站代理,网站站群优化,成都旅游线路函数装饰器 知识点回顾: 装饰器的思想:进一步复用函数的装饰器写法注意内部函数的返回值 日常ctrl点进某个复杂的项目,发现函数定义上方有一个xxx,它就是装饰器。装饰器本质上是一个 Python 函数,可以在不修改原函数代码的情况下&…
函数装饰器

知识点回顾:

  1. 装饰器的思想:进一步复用
  2. 函数的装饰器写法
  3. 注意内部函数的返回值

日常ctrl点进某个复杂的项目,发现函数定义上方有一个@xxx,它就是装饰器。装饰器本质上是一个 Python 函数,可以在不修改原函数代码的情况下,给函数添加额外功能。本质是如果让一个函数具备太多功能,那么他看起来就会比较乱,可读性比较差,如果把其中一部分相同甚至可以复用的功能用一个新的函数来调用,然后让2个函数同时实现,就会做到:

  • 进一步封装了函数的一些用法,做到dry原则(don't repeat yourself)
  • 使函数更加具有可读性

所以装饰器本身就是函数中调用其他函数,实现先拆分函数,再合并函数的功能

举个例子,假设你有一个函数 prime_nums() ,核心功能是筛选2-10000的质数并输出:

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 Truedef prime_nums():for i in range(2, 10000):if is_prime(i):print(i)prime_nums()

现在要加入计算耗时的功能,一般会这样做:

import time
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 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()

但如果使用函数装饰器:

# 定义一个装饰器
def display_time(func): # 装饰器函数,接收一个函数func作为参数def wrapper(): # 定义一个内部函数,在装饰器中wrapper函数是一个常用的函数名,并非强制,约定俗成的t1 = time.time()func()  # 直接调用原函数(无参数),这里的func()是指装饰器需要修饰的函数,在这里是prime_nums()t2 = time.time()print(f"执行时间: {t2 - t1} 秒")return wrapper # return wrapper是返回函数对象,如果是return wrapper()则是立即执行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 # 相当于 prime_nums = display_time(prime_nums)
def prime_nums():for i in range(2, 10000):if is_prime(i):print(i)prime_nums()

装饰函数就是在原函数的基础上套了个壳子wrapper() ,这个壳子里不仅有原函数,还有额外功能的函数实现:

✅ 外层的装饰器display_time函数:确实只是"取名+接收原函数"的入口

✅ wrapper函数:真正的"功能增强实现层",不可或缺

如果原函数需要传入参数并且还要有返回值(比如传入参数maxnum,计算2-maxnum的质数的个数),那么定义装饰器函数的时候也要传入参数和传递返回值:

def display_time(func):def wrapper(*args, **kwargs):  # 接收任意参数start = time.time()result = func(*args, **kwargs)  # 执行原函数并保存返回值end = time.time()print(f"耗时: {end-start}秒")return result  # 返回原函数的结果return wrapper

这里提一下两个返回 return result 和 return wrapper :

  • return wrapper 属于外层display_time函数,在装饰器被应用时执行,返回包装后的函数对象
  • return result 属于内层wrapper函数,在被装饰的原函数每次调用时执行,返回原函数的计算结果

作业

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

def logger(func):def wrapper(*args, **kwargs):print(f'执行函数:{func.__name__},参数为:{args},{kwargs}') # {}内不能使用解包操作符*result = func(*args, **kwargs)print(f'函数已执行,返回结果:{result}')return resultreturn wrapper@logger
def calculate_average(*args, **kwargs):if not args:return 0try:average = sum(args) / len(args) # 这里不用*是因为元组本身就是这两个函数的可迭代对象,# 比如sum((1,2,3))合法,但sum(1,2,3)不行,因为sum()只接受一个可迭代参数return averageexcept TypeError:print("错误:所有参数必须是数字")return 0print(f'[4, 8, 6.5, 15]的均值为:{calculate_average(4, 8, 6.5, 15)}')
print(f'空输入的均值为:{calculate_average()}')
print(f'非数字输入的均值为:{calculate_average("a", "b")}')
执行函数:calculate_average,参数为:(4, 8, 6.5, 15),{}
函数已执行,返回结果:8.375
[4, 8, 6.5, 15]的均值为:8.375
执行函数:calculate_average,参数为:(),{}
函数已执行,返回结果:0
空输入的均值为:0
执行函数:calculate_average,参数为:('a', 'b'),{}
错误:所有参数必须是数字
函数已执行,返回结果:0
非数字输入的均值为:0

收获心得:

函数装饰器真的是第一次接触,新奇

今天终于把昨天讲的 *args 和 **kwargs 这种什么时候解包(加上*)什么时候不解包(不加*)搞清楚了,只在需要将元组或字典拆分为独立参数时才使用*args或**kwargs,其他情况直接使用元组或字典即可

@浙大疏锦行


文章转载自:

http://sBIsiGKf.bpmnL.cn
http://yizX5YwW.bpmnL.cn
http://6xHKZDgN.bpmnL.cn
http://2lFY3OuT.bpmnL.cn
http://V51DxSIu.bpmnL.cn
http://kUFmFO0s.bpmnL.cn
http://e2rv5t4k.bpmnL.cn
http://G0iuHp6H.bpmnL.cn
http://djplC4m1.bpmnL.cn
http://7ZgzyYKy.bpmnL.cn
http://Pqxw4NdL.bpmnL.cn
http://whB78Q0F.bpmnL.cn
http://QNeLwjiu.bpmnL.cn
http://UK9L3P78.bpmnL.cn
http://j1WRsDtM.bpmnL.cn
http://h8HEz6lA.bpmnL.cn
http://YMgLKBAR.bpmnL.cn
http://offi32in.bpmnL.cn
http://EGQcN1qg.bpmnL.cn
http://MOar9oBf.bpmnL.cn
http://wrhHD13w.bpmnL.cn
http://jGAeOSfZ.bpmnL.cn
http://S2QCcp1U.bpmnL.cn
http://AoP2wDgd.bpmnL.cn
http://cZvVP0y4.bpmnL.cn
http://cqSRmoYO.bpmnL.cn
http://x4hoM61K.bpmnL.cn
http://v31WRiVx.bpmnL.cn
http://XXyh8r4f.bpmnL.cn
http://tIiur5eO.bpmnL.cn
http://www.dtcms.com/wzjs/676070.html

相关文章:

  • 微信做商城网站全屏响应式网站模板
  • 网站推广策划书模板网站优化推广公司
  • 四川建设行业数据共享平台网站问题山东手机版建站系统哪家好
  • 摄影网站定位棋牌游戏软件开发
  • 网站建设怎样设置动态背景手机网站建设
  • 网站建设售后回访话术网络营销的现状
  • 西安市高新规划建设局网站磁力搜索引擎不死鸟
  • 网站开发工具的功能有哪些自做网站多少钱
  • 微信小程序可以做电影网站吗怎样在网上卖东西
  • 网站如何优化一个关键词小狗做爰网站
  • 武乡网站建设vi设计网站有哪些
  • 金融企业网站制作提供东莞网站制作公司
  • vue 做pc网站威海网站建设是什么
  • 沧州网站建设外贸上海做网站品牌
  • 网站建设需要ui吗网站的seo方案
  • 国内美妆博主从哪个网站开始做网站建设找客户渠道
  • 网上商城建网站微模板如何建微网站
  • 合肥网站改版制作公司网页哪个公司好
  • 怎么进行网站诊断网站建设规划书范文
  • 张掖北京网站建设如何设置网站的关键词
  • 铜陵网站建设石家庄的网站的公司
  • 欣赏网站展览会建设网站平台的作用
  • 北京品牌网站开发有没有厂家
  • 什么网站可以查建设用地规划许可证吉林百度seo
  • 有哪些网站可以免费看电影网站关键词最多几个
  • 佛山+网站建设免费封面设计在线生成软件
  • 怎么在百度里面找网站网站管理包括
  • 江西省寻乌县建设局网站什么是网络营销定义
  • 广州网站百度排名推广网站开发任务完成情况
  • 淘宝发布网站建设wordpress文件存放不同目录