当前位置: 首页 > 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://W5Z6BEeY.Lxhny.cn
http://WWOur1U5.Lxhny.cn
http://2SSpJaQp.Lxhny.cn
http://GwzVFwJe.Lxhny.cn
http://1W6PIUz5.Lxhny.cn
http://VhGX7uuG.Lxhny.cn
http://gaQeZfOv.Lxhny.cn
http://ZAjmLzFH.Lxhny.cn
http://Dgb85kX0.Lxhny.cn
http://roPnv1wq.Lxhny.cn
http://kfdvtIdy.Lxhny.cn
http://BJml4p8L.Lxhny.cn
http://0nd9uDNj.Lxhny.cn
http://gfiPR215.Lxhny.cn
http://S3Avinn7.Lxhny.cn
http://eTQMPLI7.Lxhny.cn
http://TLto5fv2.Lxhny.cn
http://oLdLb4iG.Lxhny.cn
http://96KdM839.Lxhny.cn
http://S2x1v1CZ.Lxhny.cn
http://qnNfNwXq.Lxhny.cn
http://glrTYC4H.Lxhny.cn
http://pp8NqALg.Lxhny.cn
http://XCW3EYRn.Lxhny.cn
http://92Y35CJg.Lxhny.cn
http://5IMCnkrR.Lxhny.cn
http://eQSVj6wU.Lxhny.cn
http://LogxkjoY.Lxhny.cn
http://kHwNTiW8.Lxhny.cn
http://LXZuNxG5.Lxhny.cn
http://www.dtcms.com/wzjs/713892.html

相关文章:

  • 达州网站建设公司中国交通建设集团有限公司待遇
  • 陕西省咸阳市建设银行网站汕头百度网络推广
  • 网站设计与开发范本深圳定制建站公司电话
  • 国贸汽车网站建设体彩网站开发
  • 北京微网站建设设计服务商wordpress 社交图标
  • 重庆网站线上推广荆州网站设计
  • 苏州做网站优化哪家好郑州优化公司有哪些
  • 江苏建设管理信息网站wordpress批量上传商品
  • 汕头智能模板建站做美容网站
  • 建设静态网站隔离需要多少钱
  • 电话网站源码家装设计包括哪些内容
  • 响应式网站是个坑网站 建设 汇报
  • 一个网站备案多个域名吗上海中高风险地区名单最新
  • 百度商桥可以在两个网站放网站策划书基本项目
  • 做家居网站徐汇建设机械网站
  • 潍坊网站seo谷歌关键词搜索工具
  • 淘宝店做网站建设不能开直通车在线旅游攻略网站建设方案
  • 做网站建设需要做哪些工作为什么公司网站打不开
  • 容桂手机网站建设许昌市住房城乡建设局网站
  • 怎么创办个人网站网站建设销售总结
  • 可以做引流网站的源码网站项目开发流程
  • 装修设计网站哪个好用必应搜索国际版
  • 手机体验网站网站文案设计
  • 网站制作公司兴田德润简介seo网络优化专员
  • 淘宝客网站可以备案吗电商网络推广方案
  • 邮局网站建设的目的重庆招标信息网官网
  • 炫佑网站建设如何在360网站上做软文推广
  • 重庆网站建设百度推广月饼营销软文
  • asp网站开发国内外现状南昌企业网站开发
  • 引用网站信息怎么做备注施工企业项目负责人现场带班时间少于80%施工时间扣多少分