python第五次作业

1.请实现一个装饰器,每次调用函数时,将函数名字以及调用此函数的时间点写入文件中
python 复制代码
# 导入datetime模块,用于获取当前时间并格式化输出
import datetime

# 定义一个装饰器工厂函数log_funcName_time,它接受一个参数time
def log_funcName_time(time):
    # 定义一个装饰器函数log_decorator,它将被用来装饰目标函数
    def log_decorator(func):
        # 定义一个包装器wrapper,它将替换原始函数的行为
        def wrapper(*args, **kwargs):
            # 首先调用原始函数,执行其功能
            func(*args, **kwargs)
            # 使用with语句打开文件"decorator.txt"以追加模式('a')
            with open("decorator.txt", "a") as f:
                # 向文件写入函数名和给定的时间点信息
                f.write(f"函数名:{func.__name__}----时间点:{time}\n")  # 添加换行符以便于阅读

        # 返回包装器函数,使其可以替代原函数
        return wrapper

    # 返回装饰器函数
    return log_decorator


# 使用装饰器工厂函数log_funcName_time,传入当前时间(格式化为字符串)
@log_funcName_time(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# 定义一个被装饰的函数test
def test():
    # 函数执行内容:打印一条消息指示操作完成
    print("已写入文件中")

# 调用test函数,触发装饰器的行为
test()

2.编写一个装饰器,每执行一个函数,记录函数名称及函数执行时间,并写入log.text文件中

python 复制代码
import time


def calculate_execution_time(func):
    """这是一个装饰器,用于计算并打印被装饰函数的执行时间"""

    def wrapper(*args, **kwargs):
        start_time = time.time()  # 记录函数开始执行的时间
        res = func(*args, **kwargs)  # 执行函数
        end_time = time.time()  # 记录函数结束执行的时间
        execution_time = end_time - start_time  # 计算执行时间
        with open("log.txt", "a") as f:
            f.write(f"{func.__name__} 函数执行时间: {execution_time:.6f} 秒")
        return res

    return wrapper


# 使用装饰器
@calculate_execution_time
def test(n):
    """示例函数,执行一些操作"""
    total = 0
    for i in range(n):
        total += i
    return total


# 调用示例函数
res = test(1000000)
print(f"结果: {res}")

3.使用with语法完成文件的复制

python 复制代码
with open("file.txt", "r+") as f1, open("file_copy.txt", "r+") as f2:#打开文件
    f2.write(f1.read())#复制文件

4.完成登录系统,登录时数据使用序列化和反序列化

python 复制代码
import pickle

# 使用pickle模块对用户名和密码进行序列化模拟数据库中存储的状态
# 注意:真实场景中不应直接存储明文密码,此处仅为示例
username_mysql = pickle.dumps("zhangsan")  # 序列化用户名
password_mysql = pickle.dumps("123")      # 序列化密码

# 定义一个装饰器login_serizl,用于序列化登录函数的参数
def login_serizl(func):
    # 定义内层函数wrapper,它会在装饰器被应用时替代原函数
    def wrapper(*args, **kwargs):
        # 获取传入的用户名和密码参数
        username, password = args  # 假设装饰的函数只接受两个位置参数
        
        # 对传入的用户名和密码进行序列化处理
        username = pickle.dumps(username)
        password = pickle.dumps(password)
        
        # 重新打包序列化后的参数,准备传递给被装饰的函数
        args = (username, password)  # 注意:此处直接赋值为元组,无需使用**解包
        
        # 调用被装饰的函数,并传递序列化后的参数,返回其执行结果
        return func(*args, **kwargs)
    
    # 返回装饰过的函数
    return wrapper

# 使用装饰器login_serizl修饰login函数
@login_serizl
def login(username, password):
    # 打印接收到的(已序列化)用户名和密码,实际操作中应进行解序列化比较
    print(username, password)
    
    # 模拟验证过程,比较序列化的输入与预设的序列化数据库值
    # 注意:此处比较逻辑应先进行反序列化,这里为了简化直接比较序列化后的值
    return "success" if username == username_mysql and password == password_mysql else "failure"

# 主程序入口
if __name__ == '__main__':
    # 从用户处获取输入的用户名和密码
    username = input("请输入用户名:").strip()
    password = input("请输入密码:").strip()
    
    # 调用login函数进行登录验证,装饰器会自动处理参数序列化
    result = login(username, password)
    
    # 打印登录结果
    print(result)
相关推荐
第九序言T3 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Java后端的Ai之路3 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_426003963 小时前
UI自动化高频次登录login限流解决方案
python·ui·自动化
Sakura_j_h_3 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
龙亘川4 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人4 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
quantdash_cc5 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash
I Am a robert girl5 小时前
当智能体学会“串通”:从长程交互中读懂涌现式合谋
python·多智能体系统·多智能体协作·llm agent·涌现式合谋·对齐问题·激励机制设计
Raas1005 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
云和数据.ChenGuang5 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain