【每日一练】python函数与装饰器

Python装饰器是一种用于修改函数或类的行为的语法结构。装饰器可以在不修改原始函数或类的情况下,为它们添加额外的功能。

使用装饰器的常见场景是在不改变原函数代码的情况下,给函数添加日志记录、性能统计、输入验证等功能。装饰器还可以用于授权、缓存、重试等功能。

装饰器通过在函数或类定义的上面添加@语法糖来使用。当定义了一个函数或类后,可以通过在其上面添加@装饰器名称,将装饰器应用到函数或类上。

下面是一个简单的装饰器示例:

def log_decorator(func):def wrapper(*args, **kwargs):print(f"Calling function {func.__name__}")result = func(*args, **kwargs)print(f"Finished calling function {func.__name__}")return resultreturn wrapper@log_decorator
def add(a, b):return a + bprint(add(1, 2))

输出结果为:

Calling function add
Finished calling function add
3

在上面的示例中,定义了一个装饰器log_decorator,它会在被装饰的函数调用前后打印日志。然后,通过@log_decorator将装饰器应用到add函数上。当调用add函数时,实际上是调用了log_decorator返回的wrapper函数,从而实现了打印日志的功能。

可以看到,装饰器可以方便地为函数添加额外的功能,而不需要修改原函数的代码。装饰器还可以带参数,用于传递给装饰器的函数或类。装饰器可以是函数形式的装饰器,也可以是类形式的装饰器。
使用递归实现斐波那契数列

def f(n):if n < 2:return nelse:return f(n - 1) + f(n - 2)def fl(n):listF = []for i in range(n + 1):listF.append(f(i))print(listF)fl(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

然而,这段代码有一个效率上的问题,即函数 f 使用递归的方式计算斐波那契数列,这种计算方式对于较大的 n 值非常低效,因为它会重复计算很多相同的值。

一个改进的方法是使用动态规划或者记忆化递归来避免重复计算。这里是一个使用记忆化的版本:

def memoize(f):cache = {}def helper(x):if x not in cache:            cache[x] = f(x)return cache[x]return helper@memoize
def f(n):if n < 2:return nelse:return f(n-1) + f(n-2)def fl(n):listF = []for i in range(n+1):listF.append(f(i))print(listF)fl(10)

在这个版本中,我们添加了一个 memoize 装饰器来缓存已计算的结果,这样在递归调用时可以直接从缓存中获取结果而不需要重新计算。

请实现一个装饰器,把函数的返回值+100然后返回

def x100(func):def inner(a, b):return func(a, b) * 100return inner@x100
def add(a, b):return a + bprint(add(1, 2))
300

请实现一个装饰器,通过一次调用使函数重复执行5次

def run5(func):def inner():for i in range(5):func()return inner@run5
def run():print("hello world")run()
hello world
hello world
hello world
hello world
hello world

请实现一个装饰器每次调用函数时,在调用函数时输出函数名字及调用函数的时间点

import datetimedef name_time(func):def inner():func()print("函数的执行时间点:", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))print("函数名:", func.__name__)return inner@name_time
def test():print("test函数执行。")test()
test函数执行。
函数的执行时间点: 2024-07-12 14:39:05
函数名: test

有一个计算两个数和的方法,为其添加一个确保两个参数都是int或float类型的装饰器,保证运算不会抛异常

def check_num(func):def inner(n1, n2):if isinstance(n1, (int, float)) and isinstance(n2, (int, float)):return func(n1, n2)else:print("输入的参数类型有误!")return inner@check_num
def add(n1, n2):return n1 + n2add(3 ** (1 / 2), 3)
4.732050807568877

有一个一次性录入人名并返回人名的方法(人名只考虑存英文),为其添加一个装饰器,使得处理后人名首字母一定大写

# 首字母大写
def upper_name(func):def wrapper():name = func()return name.title()return wrapper@upper_name
def get_name():name = input("name: ")  # owenreturn nameprint(get_name())
Owen

使用函数传参的方式实现去哪里旅游的功能,根据意向内容决定去玩什么

def xuzhou():print("去徐州了。")def lianyungang():print("去连云港了。")def shanghai():print("去上海了。")def trip(city):print("计划去旅游")city()print("旅游结束")attraction = input("请输入要去的景点:")
if attraction == "云龙山" or attraction == "云龙湖":trip(xuzhou)
elif attraction == "花果山" or attraction == "水帘洞":trip(lianyungang)
elif attraction == "东方明珠" or attraction == "上海迪士尼":trip(shanghai)
else:print("没有这个景点。")
计划去旅游
去连云港了。
旅游结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL性能下降的原因

一、SQL性能下降的原因 主要是性能下降SQL慢、执行时间长、等待时间长 不是一条SQL抓出来就要优化&#xff0c;在真实的生产环境下这种故障第一个要去复线&#xff0c;有可能去排查的时候没&#xff0c;所以没法复线。 可能需要它跑半天或者一天来缩小筛查的范围&#xff0c…

ThingsBoard本地windows环境启动

提示&#xff1a;以下内容只是本人自己在环境运行情况&#xff0c;不同环境或许会有区别请注意甄别 本地部署 前言简介正文实现总结 前言 前置环境的配置&#xff0c;首先电脑需要配置了git、maven、JDK17 本人使用的maven版本号为3.8.4 软件版本号git2.42.0maven3.8.4jdk17n…

three-tile开发: 5. 取得地图的地面信息

three-tile 是一个开源的轻量级三维瓦片库&#xff0c;它基于threejs使用typescript开发&#xff0c;提供一个三维地形模型&#xff0c;能轻松给你的应用增加三维瓦片地图。 项目地址&#xff1a;GitHub - sxguojf/three-tile: 3D tile map using threejs 示例地址&#xff1a;…

JVM:自动垃圾回收

文章目录 一、C/C的内存管理二、Java的内存管理1、方法去的回收2、堆回收&#xff08;1&#xff09;引用计数法和可达性分析法&#xff08;2&#xff09;五种对象引用&#xff08;3&#xff09;垃圾回收算法&#xff08;4&#xff09;垃圾回收器 一、C/C的内存管理 在C和C没有…

uni-app 蓝牙传输

https://www.cnblogs.com/ckfuture/p/16450418.html https://www.cnblogs.com/yangxiaobai123/p/16021058.html 字符串转base64&#xff1a;https://www.cnblogs.com/sunny3158/p/17312158.html 将 ArrayBuffer 对象转成 Base64 字符串&#xff1a;基础 - uni.arrayBufferT…

IT运维也有自己的节日 724向日葵IT运维节,三大版本如何选?

“724运维节”&#xff0c;是2016年由开放运维联盟发起倡议&#xff0c;广大运维人员共同投票产生的属于运维人自己的节日。 对于运维人最大的印象&#xff0c;那就是工作都需要7x24小时待命&#xff0c;是名副其实的“日不落骑士”&#xff0c;这也是大家选择724这一天作为运…

原理图大结局

一、总结哪些地方是5V供电&#xff1f;哪些地方是4V供电&#xff1f;哪些地方是3.3V供电&#xff1f;为什么会这样&#xff1f;根据什么原则来划分供电区域&#xff1f; 二、 5V 供电为什么有的地方要100uF&#xff0b; 0.1uF 滤波&#xff1f;有的地方只要 10uF 滤波&#xff…

RabbitMQ - 延迟消息 - 死信交换机

目录 1、怎么理解延迟消息&#xff1f; 2、如何实现延迟消息&#xff1f; 2.1、方案一&#xff1a;死信交换机 2.1.1、什么是死信&#xff1a; 2.1.2、什么是死信交换机&#xff1f; 2.2、方案二&#xff1a;延迟消息插件 2.2.1、插件安装&#xff1a; 2.2.2、代码实现 …

AndroidStudio2023.3版本avd manager模拟器无法创建

创建到最后一步的时候提示WARN - #com.android.sdklib.internal.avd.AvdManager - com.android.prefs.AndroidLocationsException: Can’t locate Android SDK installation directory for the AVD .ini file. 前提&#xff1a; 1.sdk路径没问题 2.安装了下图内容 那是什么原因…

提高项目透明度:有效的跟踪软件

国内外主流的10款项目进度跟踪软件对比&#xff1a;PingCode、Worktile、Teambition、Tower、Asana、Trello、Jira、ClickUp、Notion、Liquid Planner。 在项目管理中&#xff0c;确保进度跟踪的准确性与效率是每位项目经理面临的主要挑战之一。选用合适的项目进度跟踪软件不仅…

VUE2用elementUI实现父组件中校验子组件中的表单

需求是VUE2框架用elementUI写复杂表单组件&#xff0c;比如&#xff0c;3个相同功能的表单共用一个提交按钮&#xff0c;把相同功能的表单写成一个子组件&#xff0c;另一个父组件包含子组件的重复调用和一个提交按钮&#xff0c;并且要求提交时校验必填项。 注意&#xff1a; …

【Python进阶】正则表达式、pymysql模块

目录 一、正则表达式的概述 1、基本介绍 2、快速使用re模块 二、正则的常见规则 1、匹配单个字符 2、原始字符串 3、匹配多个字符 4、匹配开头和结尾 5、匹配分组 三、Python与MySQL交互 1、pymysql模块的安装 2、pymysql的操作步骤 3、connection对象 4、cursor…

记录一点mybatis的坑

1. mybatis的分页插件 startPage执行后&#xff0c;紧跟的一个查询语句 会被加上limit对应的参数&#xff0c;然后自动执行clearPage&#xff08;&#xff09;&#xff0c;以免其他语句受到 分页的影响。 但是如果我们没有 执行查询语句&#xff0c;那么&#xff0c;这个分页可…

可重入锁深入学习(有码)

【摘要】 ​今天&#xff0c;梳理下java中的常用锁&#xff0c;但在搞清楚这些锁之前&#xff0c;先理解下 “临界区”。临界区在同步的程序设计中&#xff0c;临界区段活称为关键区块&#xff0c;指的是一个访问共享资源&#xff08;例如&#xff1a;共享设备或是共享存储器&a…

数据湖仓一体(二) 安装kafka

上传安装包到/opt/software目录并解压 [bigdatanode106 software]$ tar -zxvf kafka_2.12-3.5.2.tgz -C /opt/services/ 重命名kafka [bigdatanode106 software]$ mv kafka_2.12-3.5.2 kafka_3.5.2 配置环境变量 [bigdatanode106 ~]$ sudo vim /etc/profile.d/bigdata_…

深度学习调参

此文整理总结github上的一个资料&#xff0c;结尾附上链接。对于工程应用很有现实参考&#xff0c;带入实际工作场景中会有不少的收获。 这份文档旨在帮助工程师和研究人员系统性地优化深度学习模型的性能。它涵盖了从项目启动到模型部署的各个环节&#xff0c;包括&#xff1a…

6、evil box one

低—>中 目标&#xff1a;获取root权限以及2个flag 主机发现 靶机 192.168.1100.40 或者使用fping -gaq 192.168.100.1/24发现主机使用ping的方式。 端口扫描 发现开放了22和80 可以使用-A参数&#xff0c;-A参数会得到更多的扫描细节 访问80端口就是一个apache的基本的…

基于Python/MATLAB长时间序列遥感数据处理及在全球变化、植被物候提取、植被变绿与生态系统固碳分析、生物量估算与趋势分析应用

植被是陆地生态系统中最重要的组分之一&#xff0c;也是对气候变化最敏感的组分&#xff0c;其在全球变化过程中起着重要作用&#xff0c;能够指示自然环境中的大气、水、土壤等成分的变化&#xff0c;其年际和季节性变化可以作为地球气候变化的重要指标。此外&#xff0c;由于…

怎么安装Manim库在Windows环境下的Jupyter Notebook上

Manim 是解释性数学视频的动画引擎。 您可以使用它来制作数学视频&#xff08;或其他字段&#xff09;。也许你们会在有有些平台上会看过特别好看的数学动画&#xff0c;例如 3Blue1Brown等。这些动画特别好看&#xff0c;还特别丝滑&#xff0c;基本找不到太大的毛病。 我当初…

在 WebSocket 连接建立之前进行身份验证

要在 WebSocket 连接建立之前进行身份验证,可以采用以下常见方法: 基于 token 的鉴权:客户端在连接请求中携带 token,服务器端接收后验证 token 的合法性。例如,使用 ws 库时,可以在建立 WebSocket 连接时设置请求头: const socket = new WebSocket(ws://localhost:…