好的!以下是**严格围绕你提供的17个知识点**(函数、参数、作用域、算法、二维列表、异常处理、字典/列表嵌套、文件操作、时间模块等),并**深度融合“丝绸之路”与“丝绸文化”主题**,设计的一套**高难度Python综合应用试卷**。
---
# 🐫 丝绸之路 × Python 高级实战能力测试卷
> **考试时间:150分钟**
> **总分:100分**
> **难度:★★★★☆(高阶综合)**
---
## 一、单项选择题(每题3分,共15分)
**(考察基础语法 + 丝绸文化常识)**
1. 在Python中,若定义一个全局变量 `silk_route = ["长安", "敦煌", "撒马尔罕"]`,并在函数内使用 `global silk_route` 修改它,以下说法正确的是:
A. 函数内修改不会影响全局变量 ❌
B. 必须用 `global` 声明才能修改全局变量 ✅
C. 局部变量会自动覆盖全局变量 ❌
D. `global` 只能用于读取不能写入 ❌
2. 丝绸之路上某段路程距离数据存储在二维列表中:`distances = [[120, 85], [200, 150]]`,表示两段路各有两个子路段。要获取第二段路的第一个子路段距离,应使用:
A. `distances[1][0]` ✅
B. `distances[0][1]`
C. `distances[2][1]`
D. `distances[1,0]`
3. 若有一个函数 `calculate_profit(cost, price, qty=1)`,其中 `qty` 是默认参数。调用 `calculate_profit(50, 80)` 时,返回值为:
A. `(80-50)*1 = 30` ✅
B. 报错,缺少参数
C. `(80-50)*0 = 0`
D. 返回元组 `(50,80,1)`
4. 以下哪个关键字用于在 `try-except` 块中无论是否发生异常都执行的代码?
A. `else`
B. `finally` ✅
C. `raise`
D. `assert`
5. 使用 `with open("silk_trade.txt", "w") as f:` 打开文件,以下描述错误的是:
A. 文件自动关闭 ✅
B. 如果文件不存在会创建
C. 写入内容后需手动调用 `f.close()` ❌
D. “w”模式会清空原文件内容
---
## 二、多项选择题(每题4分,共20分;少选得2分,错选不得分)
6. 关于Python中的作用域规则,以下正确的有:(可多选)
A. 局部变量优先于全局变量 ✅
B. `global` 关键字可在函数内修改全局变量 ✅
C. 嵌套函数可以访问外层函数的局部变量(闭包)✅
D. 所有变量都是全局的 ❌
E. `nonlocal` 可用于修改外层非全局变量 ✅
7. 以下哪些算法可用于解决“商队路径规划”或“货物最优装载”问题?(可多选)
A. 递归(如DFS找路径)✅
B. 动态规划(如0/1背包)✅
C. 贪心算法(如按价值密度排序)✅
D. 枚举法(暴力搜索)✅
E. 二分查找(不适用此类问题)❌
8. 关于二维列表的操作,以下正确的有:(可多选)
A. 可通过 `[i][j]` 访问元素 ✅
B. 可用列表推导式生成二维列表 ✅
C. 二维列表本质是“列表的列表”✅
D. `len(matrix)` 返回行数 ✅
E. `matrix[0]` 返回第一列 ❌(返回第一行)
9. 以下关于异常处理的说法,正确的有:(可多选)
A. `try-except-finally` 结构中 `finally` 总是执行 ✅
B. 可以捕获特定异常如 `FileNotFoundError` ✅
C. `except Exception as e:` 可捕获所有派生自Exception的异常 ✅
D. `raise` 只能抛出系统内置异常 ❌(可自定义)
E. 不建议裸 `except:` 捕获所有异常 ✅
10. 关于文件操作和时间模块,以下正确的有:(可多选)
A. `open(..., "a")` 追加写入 ✅
B. `readlines()` 返回每行为元素的列表 ✅
C. `datetime.now()` 获取当前时间 ✅
D. `time.sleep(1)` 暂停1秒 ✅
E. `with` 语句仅适用于文件操作 ❌(也适用于锁、数据库连接等)
---
## 三、编程题(共65分)
### 11. 【函数与作用域】丝绸商品价格计算器(10分)
编写一个函数 `calc_total_price(item_name, unit_price, quantity, discount_rate=0.0)`,计算总价(含折扣)。
要求:
- 使用全局变量 `TAX_RATE = 0.05` 表示税率;
- 函数内部使用 `global TAX_RATE` 读取税率;
- 总价 = (unit_price * quantity * (1 - discount_rate)) * (1 + TAX_RATE)
- 返回格式化字符串:“{item_name}: {total:.2f} 银两”
**示例调用:**
```python
print(calc_total_price("丝绸", 80, 10, 0.1))
# 输出:丝绸: 756.00 银两
```
---
### 12. 【算法+二维列表】丝绸之路城市距离矩阵(15分)
给定一个二维列表表示城市间距离(对称矩阵,对角线为0):
```python
cities = ["长安", "敦煌", "喀什", "撒马尔罕"]
distance_matrix = [
[0, 120, 200, 350],
[120, 0, 180, 230],
[200, 180, 0, 150],
[350, 230, 150, 0]
]
```
编写函数 `find_shortest_path(start_idx, end_idx)`,使用**贪心算法**(每次选最近未访问城市)找出从起点到终点的一条近似最短路径(不要求全局最优),返回路径索引列表。
**示例调用:**
```python
print(find_shortest_path(0, 3)) # 长安→撒马尔罕
# 可能输出:[0, 1, 2, 3] 或 [0, 2, 3] 等
```
---
### 13. 【异常处理+文件操作】丝绸贸易记录日志系统(20分)
编写程序模拟丝绸贸易记账系统:
1. 定义函数 `log_trade(filename, item, cost, price, qty)`,将一条贸易记录追加写入文件;
2. 每条记录格式:`YYYY-MM-DD HH:MM:SS | {item} | 成本:{cost} | 售价:{price} | 数量:{qty} | 利润:{profit}`;
3. 使用 `try-except-finally` 处理文件打开失败、权限错误等异常;
4. 使用 `with` 语句确保文件关闭;
5. 使用 `datetime` 模块记录时间戳;
6. 如果文件不存在则创建,存在则追加。
**示例调用:**
```python
log_trade("trade_log.txt", "瓷器", 30, 45, 100)
```
---
### 14. 【字典/列表嵌套+算法】丝绸商品库存管理系统(20分)
设计一个嵌套数据结构管理丝绸商品库存:
```python
inventory = {
"丝绸": {"江南": 100, "长安": 50},
"瓷器": {"景德镇": 200, "洛阳": 80},
"香料": {"泉州": 150}
}
```
编写函数 `update_stock(category, location, amount)`:
- 若类别和地点存在,则增加库存;
- 若类别不存在,添加该类别及地点;
- 若类别存在但地点不存在,添加该地点;
- 使用 `try-except` 处理非法输入(如负数数量);
- 返回更新后的库存字典。
再编写函数 `get_total_stock(category)` 计算某类商品总库存。
**示例调用:**
```python
update_stock("丝绸", "成都", 30)
print(get_total_stock("丝绸")) # 输出:180
```
---
## ✅ 参考答案(编程题部分)
### 11. 丝绸商品价格计算器
```python
TAX_RATE = 0.05
def calc_total_price(item_name, unit_price, quantity, discount_rate=0.0):
global TAX_RATE
total = unit_price * quantity * (1 - discount_rate) * (1 + TAX_RATE)
return f"{item_name}: {total:.2f} 银两"
# 测试
print(calc_total_price("丝绸", 80, 10, 0.1))
```
---
### 12. 丝绸之路城市距离矩阵(贪心路径)
```python
cities = ["长安", "敦煌", "喀什", "撒马尔罕"]
distance_matrix = [
[0, 120, 200, 350],
[120, 0, 180, 230],
[200, 180, 0, 150],
[350, 230, 150, 0]
]
def find_shortest_path(start_idx, end_idx):
n = len(cities)
visited = [False] * n
path = [start_idx]
current = start_idx
visited[current] = True
while current != end_idx:
next_city = -1
min_dist = float('inf')
for i in range(n):
if not visited[i] and distance_matrix[current][i] < min_dist:
min_dist = distance_matrix[current][i]
next_city = i
if next_city == -1:
break # 无法到达
visited[next_city] = True
path.append(next_city)
current = next_city
return path if current == end_idx else []
# 测试
print(find_shortest_path(0, 3))
```
---
### 13. 丝绸贸易记录日志系统
```python
from datetime import datetime
def log_trade(filename, item, cost, price, qty):
try:
profit = (price - cost) * qty
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
record = f"{timestamp} | {item} | 成本:{cost} | 售价:{price} | 数量:{qty} | 利润:{profit}\n"
with open(filename, "a", encoding="utf-8") as f:
f.write(record)
print("记录成功写入")
except FileNotFoundError:
print("文件路径错误")
except PermissionError:
print("无写入权限")
except Exception as e:
print(f"发生未知错误: {e}")
finally:
print("日志操作完成")
# 测试
log_trade("trade_log.txt", "瓷器", 30, 45, 100)
```
---
### 14. 丝绸商品库存管理系统
```python
inventory = {
"丝绸": {"江南": 100, "长安": 50},
"瓷器": {"景德镇": 200, "洛阳": 80},
"香料": {"泉州": 150}
}
def update_stock(category, location, amount):
try:
if amount < 0:
raise ValueError("数量不能为负")
if category not in inventory:
inventory[category] = {}
if location not in inventory[category]:
inventory[category][location] = 0
inventory[category][location] += amount
return inventory
except Exception as e:
print(f"更新失败: {e}")
return inventory
def get_total_stock(category):
if category not in inventory:
return 0
return sum(inventory[category].values())
# 测试
update_stock("丝绸", "成都", 30)
print(get_total_stock("丝绸")) # 输出:180
```
---
## 📝 评分标准建议:
- 选择题:每题3~4分,严格按答案给分;
- 编程题:
- 功能完整:60%
- 代码规范(命名、注释、结构):20%
- 异常处理健壮性:10%
- 创意/优化(如效率、用户体验):10%
---
## 💡 教学建议:
本试卷适合:
- 高中信息学竞赛选手
- 大学计算机专业低年级学生
- 成人编程进阶学习者
可作为:
- 期末综合考试
- 项目实战考核
- 自学成果检验
---
如需:
- **Word/PDF排版版**
- **在线自动判题脚本(OJ风格)**
- **详细解析视频脚本**
- **扩展题库(更多丝绸之路场景)**
欢迎继续提出,我可为你定制生成!
---
🌿 **让代码穿越千年丝路,用Python织就文明经纬!**