1 Commits

Author SHA1 Message Date
lele555 ac362fc9ac 添加 q1/main.py
q1 题 main.py
2026-10-03 07:57:29 +08:00
4 changed files with 28 additions and 110 deletions
+26 -34
View File
@@ -1,46 +1,38 @@
import json import json
import os
def analyze_log(filepath: str) -> dict: def analyze_log(filepath: str) -> dict:
if not os.path.exists(filepath): result = {
return {} "total": 0,
"by_level": {},
total = 0 "by_user": {},
by_level = {} "last_error": None
by_user = {} }
last_error = None
try: try:
with open(filepath, 'r', encoding="utf-8") as f: with open(filepath, 'r', encoding='utf-8') as f:
first_line = f.readline()
if not first_line.strip():
return {}
f.seek(0)
for line in f: for line in f:
line = line.strip() line = line.strip()
if not line: if not line:
continue continue
try: try:
log_entry = json.loads(line) log_data = json.loads(line)
level = log_entry["level"] except json.JSONDecodeError:
user = log_entry["user"]
message = log_entry["message"]
except (json.JSONDecodeError, TypeError, KeyError):
continue continue
result["total"] += 1
total += 1 level = log_data.get("level")
by_level[level] = by_level.get(level, 0) + 1 if level:
by_user[user] = by_user.get(user, 0) + 1 result["by_level"][level] = result["by_level"].get(level, 0) + 1
user = log_data.get("user")
if user:
result["by_user"][user] = result["by_user"].get(user, 0) + 1
if level == "ERROR": if level == "ERROR":
last_error = message result["last_error"] = log_data.get("message")
except OSError: except FileNotFoundError:
return {} pass
return result
return {
"total": total, if __name__ == "__main__":
"by_level": by_level,
"by_user": by_user, res = analyze_log("app.jsonl")
"last_error": last_error print(res)
} print("成功")
-5
View File
@@ -1,5 +0,0 @@
{"timestamp":"2026-10-01 10:23:45","level":"INFO","message":"用户登录成功","user":"老三"}
{"timestamp":"2026-10-02 10:24:01","level":"ERROR","message":"数据库连接失败","user":"老四"}
{"timestamp":"2026-10-03 10:25:12","level":"INFO","message":"用户登出","user":"老八"}
{"timestamp":"2026-10-04 10:26:30","level":"ERROR","message":"超时","user":"老六"}
{"timestamp":"2026-10-05 10:27:00","level":"INFO","message":"任务完成","user":"老王"}
-55
View File
@@ -1,55 +0,0 @@
import json
class UserManager:
def __init__(self):
self.users = []
self.next_id = 1
def add_user(self, name: str, age: int) -> dict:
user = {
"id": self.next_id,
"name": name,
"age": age
}
self.users.append(user)
self.next_id += 1
return user
def get_user(self, user_id: int):
for u in self.users:
if u["id"] == user_id:
return u
return None
def update_age(self, user_id: int, new_age: int) -> bool:
user = self.get_user(user_id)
if user is None:
return False
user["age"] = new_age
return True
def remove_user(self, user_id: int) -> bool:
for idx, u in enumerate(self.users):
if u["id"] == user_id:
self.users.pop(idx)
return True
return False
def list_users(self):
return self.users.copy()
def save_to_json(self, file_path: str):
with open(file_path, "w", encoding="utf-8") as f:
json.dump(self.users, f, ensure_ascii=False, indent=2)
def load_from_json(self, file_path: str):
with open(file_path, "r", encoding="utf-8") as f:
loaded_users = json.load(f)
self.users = loaded_users
if self.users:
max_id = max(u["id"] for u in self.users)
self.next_id = max_id + 1
else:
self.next_id = 1
+2 -16
View File
@@ -163,7 +163,7 @@
### 答案 ### 答案
(在此填写,格式:`1. B 2.B 3. B 4. B 5. A 6. B 7. B 8. B 9. B 10. B ) (在此填写,格式:`1. A 2. B 3. C 4. D 5. A 6. B 7. C 8. D 9. A 10. B`)
--- ---
@@ -182,8 +182,7 @@ import copy
c = copy.deepcopy(a) c = copy.deepcopy(a)
``` ```
(在此作答)b是a的浅层copy,而c则是a的深层copy,c相对而言更独立(不受a的影响),所以最后b是[[1, 2, 99], [3, 4]] (在此作答)
而c没变
### 第 2 题:字典与列表的综合应用 ### 第 2 题:字典与列表的综合应用
@@ -204,9 +203,6 @@ logs = [
3. 解释为什么第 2 问不能直接用 `len(logs)` 得到结果,需要什么遍历结构? 3. 解释为什么第 2 问不能直接用 `len(logs)` 得到结果,需要什么遍历结构?
(在此作答) (在此作答)
1.[log for log in logs if log["level"] == "ERROR"]
2.{user: sum(1 for log in logs if log["user"] == user) for user in set(log["user"] for log in logs)}
3.因为len(logs)是在计算元素数量(5),应该先for遍历提取user的值(先创建空字典),没则计
### 第 3 题:异常处理设计 ### 第 3 题:异常处理设计
@@ -222,13 +218,3 @@ Day_10 中你写过 `safe_int(s)` 函数:能转就返回整数,不能转就
请写出函数代码,并说明:为什么这里用 `try/except` 比先用 `if` 判断再计算更好? 请写出函数代码,并说明:为什么这里用 `try/except` 比先用 `if` 判断再计算更好?
(在此作答) (在此作答)
def safe_divide(a, b):
try:
num_a = float(a)
num_b = float(b)
result = num_a / num_b
return result
except (ValueError, ZeroDivisionError):
return None
因为if干的活try/except也可以干,不用if可以让代码更简洁