🔒 答案已锁定

📖 答案解析 — 数字守艺人(非遗文化) — 中等

算法应用主题赛 · Python · 共 14 题(5单选+5多选+4编程)· 满分 100 分

第 1 题 单选题 2 分
二十四节气的名称按顺序连接成一个字符串。执行以下代码后,输出结果是什么?
terms = "立春雨水惊蛰春分清明谷雨"
print(terms[2:6])
A. 立春雨水
B. 雨水惊蛰
C. 春雨水惊
D. 雨水惊蛰春分
✅ 正确答案:B
💡 考点解析:字符串切片 [start:end],包含 start 索引,不包含 end 索引;中文字符每个占一个索引位置。索引2-3是"雨水",索引4-5是"惊蛰",所以 terms[2:6] 为"雨水惊蛰"
第 2 题 单选题 2 分
中医馆用一个字典记录药材库存。以下代码中,横线处应填什么才能安全地获取"当归"的库存数量(如果不存在则返回"未找到")?
herbs = {"人参": 50, "当归": 30, "枸杞": 100, "黄芪": 80}
name = "当归"
quantity = herbs._______(name, "未找到")
print(quantity)
A. find
B. search
C. get
D. index
✅ 正确答案:C
💡 考点解析:字典的 get(key, default) 方法,键存在时返回对应值,不存在时返回默认值
第 3 题 单选题 2 分
蜡染工艺数字化管理系统在读取文件时可能遇到文件不存在的情况。假设 batik.txt 文件不存在,以下代码的输出是什么?
try:
    f = open("batik.txt", "r", encoding="utf-8")
    print("文件打开成功")
except FileNotFoundError:
    print("文件未找到")
finally:
    print("操作结束")
A. 文件打开成功
B. 文件打开成功 \n 操作结束
C. 文件未找到
D. 文件未找到 \n 操作结束
✅ 正确答案:D
💡 考点解析:try-except-finally 异常处理——finally 块中的代码无论是否发生异常都会执行
第 4 题 单选题 2 分
定义了一个计算刺绣作品总分的函数,其中 bonus 参数有默认值。执行以下代码的输出结果是什么?
def calculate_score(scores, bonus=5):
    total = sum(scores) + bonus
    return total
result = calculate_score([85, 90, 78], 10)
print(result)
A. 253
B. 263
C. 258
D. 248
✅ 正确答案:B
💡 考点解析:函数默认参数——传入实参 10 会覆盖默认值 5,总和为 85+90+78+10=263
第 5 题 单选题 2 分
皮影戏表演节目单有5个节目,需要随机打乱顺序以增加趣味性。以下代码中,横线处应填什么?
import random
programs = ["三打白骨精", "大闹天宫", "哪吒闹海", "嫦娥奔月", "武松打虎"]
random.________(programs)
print(programs)
A. shuffle
B. choice
C. randint
D. random
✅ 正确答案:A
💡 考点解析:random.shuffle(list) 原地随机打乱列表顺序
第 6 题 多选题 4 分
以下关于Python列表方法的描述,哪些是正确的?(多选)
A. list.append(x) 在列表末尾添加元素x,直接修改原列表
B. list.pop() 默认删除并返回列表最后一个元素
C. list.sort() 对列表进行原地排序,并返回排序后的新列表
D. list.reverse() 将列表元素原地反转
✅ 正确答案:ABD
💡 考点解析:列表方法——append() 原地添加(A对);pop() 默认弹出末尾元素(B对);sort() 返回 None 而非新列表(C错);reverse() 原地反转(D对)
第 7 题 多选题 4 分
关于Python字典的遍历,以下哪些代码写法是正确的?(多选)
A. for k in dict_name: ——遍历所有键
B. for v in dict_name.values(): ——遍历所有值
C. for k, v in dict_name.items(): ——遍历所有键值对
D. for i in range(len(dict_name)): print(dict_name[i]) ——用索引遍历字典
✅ 正确答案:ABC
💡 考点解析:字典遍历方式——for k in dict 遍历键(A对)、.values() 遍历值(B对)、.items() 遍历键值对(C对);字典不支持整数索引访问(D错)
第 8 题 多选题 4 分
关于Python文件操作,以下哪些描述是正确的?(多选)
A. open("data.txt", "r") 以只读模式打开文件,文件不存在时会报错
B. open("data.txt", "w") 以写入模式打开文件,如果文件已存在会清空原内容
C. open("data.txt", "a") 以追加模式打开文件,新内容写入文件末尾
D. 使用 with open(...) as f: 语句可以自动关闭文件,无需手动调用 f.close()
✅ 正确答案:ABCD
💡 考点解析:文件操作模式——"r" 只读(A对)、"w" 覆盖写入(B对)、"a" 追加(C对)、with 上下文管理自动关闭(D对)
第 9 题 多选题 4 分
关于Python字符串方法,以下哪些描述是正确的?(多选)
A. "年画,剪纸,皮影".split(",") 的结果是 ["年画", "剪纸", "皮影"]
B. " 刺绣 ".strip() 的结果是 "刺绣"
C. "abc123".isdigit() 的结果是 True
D. "Hello".lower() 的结果是 "hello"
✅ 正确答案:ABD
💡 考点解析:字符串方法——split() 按分隔符拆分(A对)、strip() 去除两端空格(B对)、isdigit() 在字符串含字母时返回 False(C错)、lower() 转小写(D对)
第 10 题 多选题 4 分
关于Python异常处理,以下哪些描述是正确的?(多选)
A. try 块中的代码发生异常时,程序会跳转到匹配的 except 块执行
B. 一个 try 语句可以有多个 except 子句,分别捕获不同类型的异常
C. finally 块中的代码无论是否发生异常都会被执行
D. else 块在 try 块没有发生任何异常时执行
✅ 正确答案:ABCD
💡 考点解析:异常处理结构——try-except 捕获异常(A对)、多个 except 捕获不同异常(B对)、finally 始终执行(C对)、else 无异常时执行(D对)
第 11 题 编程操作题 15 分

题目描述:
中医药是中华民族的伟大创造,方剂是中医治病的主要手段。小明在学习中医方剂时,记录了以下常用方剂及其组成药材:
| 方剂名称 | 组成药材 |
|---------|---------|
| 四物汤 | 当归、川芎、白芍、熟地黄 |
| 四君子汤 | 人参、白术、茯苓、甘草 |
| 麻黄汤 | 麻黄、桂枝、杏仁、甘草 |
| 桂枝汤 | 桂枝、白芍、生姜、大枣、甘草 |
请编写程序:用户输入一个方剂名称,程序输出该方剂的组成药材及药材总数;如果方剂不存在,输出"未找到该方剂"。

输入格式:

输出格式:
- 如果找到方剂,第一行输出:{方剂名}的组成:{药材列表,空格分隔},第二行输出:共{数量}种药材
- 如果未找到,输出:未找到该方剂
示例输入1:
四物汤
示例输出1:
四物汤的组成:当归 川芎 白芍 熟地黄
共4种药材
示例输入2:
银翘散
示例输出2:
未找到该方剂

示例输入:

示例输出:

✅ 参考答案:
📖 参考代码
# 预设方剂数据
prescriptions = {
    "四物汤": ["当归", "川芎", "白芍", "熟地黄"],
    "四君子汤": ["人参", "白术", "茯苓", "甘草"],
    "麻黄汤": ["麻黄", "桂枝", "杏仁", "甘草"],
    "桂枝汤": ["桂枝", "白芍", "生姜", "大枣", "甘草"]
}
# 读取输入
name = input().strip()
# 查找并输出
if name in prescriptions:
    herbs = prescriptions[name]
    print(f"{name}的组成:{' '.join(herbs)}")
    print(f"共{len(herbs)}种药材")
else:
    print("未找到该方剂")
第 12 题 编程操作题 15 分

题目描述:
皮影戏是珍贵的非物质文化遗产。某皮影戏团将剧目信息存储在文件 shadow_play.txt 中,文件每行记录一个剧目,格式为:剧目名称 时长(时长单位为分钟)。请编写程序读取该文件,完成以下功能:
1. 统计总共有多少个剧目
2. 计算所有剧目的总时长
3. 找出时长最长的剧目名称和时长

输入格式:

输出格式:
- 第一行:剧目总数:{数量}
- 第二行:总时长:{总分钟数}分钟
- 第三行:最长剧目:{剧目名称} {时长}分钟
- 如果文件不存在,输出:文件未找到,请确认shadow_play.txt存在
示例文件内容(shadow_play.txt):
三打白骨精 30
大闹天宫 45
哪吒闹海 35
嫦娥奔月 25

示例输入:

示例输出:

剧目总数:4
总时长:135分钟
最长剧目:大闹天宫 45分钟
✅ 参考答案:
📖 参考代码
try:
    with open("shadow_play.txt", "r", encoding="utf-8") as f:
        lines = f.readlines()
    count = 0
    total_time = 0
    longest_name = ""
    longest_time = 0
    for line in lines:
        line = line.strip()
        if line:  # 跳过空行
            parts = line.split()
            name = parts[0]
            time = int(parts[1])
            count += 1
            total_time += time
            if time > longest_time:
                longest_time = time
                longest_name = name
    if count > 0:
        print(f"剧目总数:{count}")
        print(f"总时长:{total_time}分钟")
        print(f"最长剧目:{longest_name} {longest_time}分钟")
    else:
        print("文件中无数据")
except FileNotFoundError:
    print("文件未找到,请确认shadow_play.txt存在")
第 13 题 编程操作题 20 分

题目描述:
蜡染(古称"蜡缬")是我国古老的少数民族民间传统纺织印染工艺,其图案中常见几何对称花纹。请编写程序,输入一个整数n,生成一个 n x n 的几何纹理图案,规则如下:
- 两条对角线(主对角线和副对角线)上的位置输出字符 "X"
- 其余位置输出字符 "O"
- 字符之间无空格

输入格式:

输出格式:

示例输入:

5

示例输出:

XOOOX
OXOXO
OOXOO
OXOXO
XOOOX
样例解释:
- 主对角线(左上到右下):当 row == col 时为X
- 副对角线(右上到左下):当 row + col == n - 1 时为X
- 两条对角线的交点(中心)也满足以上两个条件,自然为X
✅ 参考答案:
📖 参考代码
n = int(input())
for i in range(n):
    row = ""
    for j in range(n):
        # 主对角线(左上→右下)或副对角线(右上→左下)
        if i == j or i + j == n - 1:
            row += "X"
        else:
            row += "O"
    print(row)
第 14 题 编程操作题 20 分

题目描述:
某非遗陶瓷工坊有一份窑温记录文件 kiln_log.txt,记录了连续数小时的窑温数据(每行一个整数,单位:摄氏度)。正常烧制温度范围为 [800, 1200](包含边界)。请编写程序完成以下分析任务:
1. 读取文件中的所有温度数据
2. 统计低温(<800)、正常(800~1200)、高温(>1200)各有多少小时
3. 找出所有"异常段"——连续的温度不在正常范围内的段落。输出每个异常段的起始小时编号、结束小时编号(从1开始计数),以及该段的平均温度(保留1位小数)

输入格式:

输出格式:
- 第一行:低温:{数量} 正常:{数量} 高温:{数量}
- 接下来,每个异常段输出一行:异常段{编号}:{起始}-{结束} 平均{平均温度}
- 如果文件不存在,输出:文件未找到
示例文件内容(kiln_log.txt):
850
900
750
700
1100
1250
1300
1150
1000

示例输入:

示例输出:

低温:2 正常:5 高温:2
异常段1:3-4 平均725.0
异常段2:6-7 平均1275.0
样例解释:
- 9个小时数据:850(正常), 900(正常), 750(低), 700(低), 1100(正常), 1250(高), 1300(高), 1150(正常), 1000(正常)
- 低温:750, 700(2小时);正常:850, 900, 1100, 1150, 1000(5小时);高温:1250, 1300(2小时)
- 异常段1:第3-4小时,温度750、700,平均 (750+700)/2 = 725.0
- 异常段2:第6-7小时,温度1250、1300,平均 (1250+1300)/2 = 1275.0
✅ 参考答案:
📖 参考代码
try:
    # 从文件读取温度数据
    with open("kiln_log.txt", "r", encoding="utf-8") as f:
        data = []
        for line in f:
            line = line.strip()
            if line:
                data.append(int(line))
    # 统计低温、正常、高温时数
    low = 0
    normal = 0
    high = 0
    for t in data:
        if t < 800:
            low += 1
        elif t > 1200:
            high += 1
        else:
            normal += 1
    print(f"低温:{low} 正常:{normal} 高温:{high}")
    # 查找所有异常段(温度不在[800, 1200]范围内)
    seg_id = 0
    i = 0
    while i < len(data):
        # 判断当前小时是否为异常温度
        if data[i] < 800 or data[i] > 1200:
            seg_id += 1
            start = i + 1  # 起始编号(从1开始)
            total = 0
            count = 0
            # 收集连续的异常段
            while i < len(data) and (data[i] < 800 or data[i] > 1200):
                total += data[i]
                count += 1
                i += 1
            end = i  # 结束编号(i已指向异常段后的第一个正常位置)
            avg = total / count
            print(f"异常段{seg_id}:{start}-{end} 平均{avg:.1f}")
        else:
            i += 1
except FileNotFoundError:
    print("文件未找到")