1.請實現一個裝飾器,每次調用函數時,將函數名字以及調用此函數的時間點寫入文件中
# 導入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文件中
import timedef 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 resreturn wrapper# 使用裝飾器
@calculate_execution_time
def test(n):"""示例函數,執行一些操作"""total = 0for i in range(n):total += ireturn total# 調用示例函數
res = test(1000000)
print(f"結果: {res}")

3.使用with語法完成文件的復制
with open("file.txt", "r+") as f1, open("file_copy.txt", "r+") as f2:#打開文件f2.write(f1.read())#復制文件


4.完成登錄系統,登錄時數據使用序列化和反序列化
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)
