🔒 答案已锁定

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

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

第 1 题 单选题 2 分
非遗技艺数据库使用嵌套字典存储各流派的传承信息。执行以下代码,输出结果是什么?
inheritors = {
    "剪纸": {"蔚县": 120, "扬州": 85, "佛山": 60},
    "皮影": {"唐山": 95, "华县": 72, "海宁": 50}
}
print(inheritors["剪纸"]["扬州"])
A. 120
B. 85
C. 72
D. 报错
✅ 正确答案:B
💡 考点解析:嵌套字典访问——inheritors["剪纸"] 获取内层字典,再 ["扬州"] 获取值 85
第 2 题 单选题 2 分
蜡染图案设计师用列表推导式快速生成图案单元编号。以下代码的输出结果是什么?
patterns = [i * i for i in range(1, 6) if i % 2 == 0]
print(patterns)
A. [1, 4, 9, 16, 25]
B. [1, 9, 25]
C. [4, 16]
D. [2, 4]
✅ 正确答案:C
💡 考点解析:列表推导式——range(1, 6) 产生1~5,筛选 i % 2 == 0(偶数)得到2和4,再计算 i * i 得到 [4, 16]
第 3 题 单选题 2 分
定义一个函数来分析皮影戏剧目的时长信息。执行以下代码,a 和 b 的值分别是什么?
def analyze_show(name, minutes):
    hours = minutes // 60
    remain = minutes % 60
    return hours, remain
a, b = analyze_show("大闹天宫", 125)
print(a, b)
A. 2 5
B. 2 0
C. 125 0
D. 2 125
✅ 正确答案:A
💡 考点解析:函数的多个返回值——Python函数可以返回多个值(实际是返回一个元组),125 // 60 = 2(小时),125 % 60 = 5(剩余分钟)
第 4 题 单选题 2 分
节气时间查询系统需要获取当前日期并计算距离下一个节气的天数。以下哪个模块是处理日期和时间的最佳选择?
import ______
today = ______.date.today()
print(today)
A. time 模块
B. random 模块
C. datetime 模块
D. math 模块
✅ 正确答案:C
💡 考点解析:时间处理模块——datetime 模块提供了 date、datetime、timedelta 等类,适合进行日期计算;time 模块主要用于时间戳和睡眠等操作
第 5 题 单选题 2 分
木雕作坊对一批作品按评分排序。关于以下两种排序方式,哪个说法是正确的?
scores = [85, 92, 78, 90, 88]
# 方式一
result1 = sorted(scores)
# 方式二
scores.sort()
result2 = scores
A. sorted(scores) 会修改原列表 scores 的顺序
B. scores.sort() 返回一个新的已排序列表
C. sorted(scores) 返回一个新列表,原列表不变
D. 两种方式的执行结果完全相同,没有区别
✅ 正确答案:C
💡 考点解析:sorted() 与 list.sort() 的区别——sorted() 是内置函数,返回新列表,不改变原列表(A错、C对);sort() 是列表的方法,原地排序,返回 None(B错);二者功能相似但行为不同(D错)
第 6 题 多选题 4 分
关于Python中列表嵌套(二维列表),以下哪些描述是正确的?(多选)
grid = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
A. grid[0][1] 的值是 2
B. len(grid) 的值是 3
C. grid[2] 的值是 [7, 8, 9]
D. grid[1][2] 的值是 6
✅ 正确答案:ABCD
💡 考点解析:二维列表——grid[0] 是第一行 [1,2,3],其索引1为 2(A对);len(grid) 返回行数3(B对);grid[2] 是第3行(C对);grid[1] 是第2行 [4,5,6],其索引2为 6(D对)
第 7 题 多选题 4 分
关于Python中函数的作用域(局部变量与全局变量),以下哪些描述是正确的?(多选)
A. 在函数内部定义的变量称为局部变量,只能在函数内部使用
B. 在函数外部定义的变量称为全局变量,函数内部可以直接读取其值
C. 如果要在函数内部修改全局变量的值,需要使用 global 关键字声明
D. 局部变量在函数执行完毕后会被销毁,全局变量在整个程序运行期间都存在
✅ 正确答案:ABCD
💡 考点解析:函数作用域——局部变量作用域限于函数内(A对);函数可读取全局变量(B对);修改全局变量需要 global 声明(C对);生命周期不同(D对)
第 8 题 多选题 4 分
关于Python中集合(set)的操作,以下哪些描述是正确的?(多选)
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
A. a | b(或 a.union(b))的结果是 {1, 2, 3, 4, 5, 6}(并集)
B. a & b(或 a.intersection(b))的结果是 {3, 4}(交集)
C. a - b(或 a.difference(b))的结果是 {1, 2}(差集)
D. a ^ b(或 a.symmetric_difference(b))的结果是 {1, 2, 5, 6}(对称差集)
✅ 正确答案:ABCD
💡 考点解析:集合运算——并集 |(A对)、交集 &(B对)、差集 -(C对)、对称差集 ^(D对)
第 9 题 多选题 4 分
关于Python字符串的进阶方法,以下哪些描述是正确的?(多选)
A. "年画-剪纸-皮影".split("-") 的结果是 ["年画", "剪纸", "皮影"]
B. "-".join(["春", "夏", "秋", "冬"]) 的结果是 "春-夏-秋-冬"
C. "非遗文化".encode("utf-8") 返回字符串的UTF-8编码字节序列
D. "Hello".swapcase() 的结果是 "hELLO"
✅ 正确答案:ABCD
💡 考点解析:字符串进阶方法——split() 拆分(A对);join() 连接(B对);encode() 编码(C对);swapcase() 大小写互换(D对)
第 10 题 多选题 4 分
关于Python文件读写方法,以下哪些描述是正确的?(多选)
A. f.read() 读取文件的全部内容,返回一个字符串
B. f.readline() 每次读取文件的一行,返回一个字符串(包含行尾换行符)
C. f.readlines() 读取文件的所有行,返回一个字符串列表
D. f.write(s) 将字符串 s 写入文件,并自动在末尾添加换行符
✅ 正确答案:ABC
💡 考点解析:文件读写方法——read() 读全部(A对);readline() 读一行(B对);readlines() 读所有行返回列表(C对);write() 不会自动添加换行符,需手动添加 \n(D错)
第 11 题 编程操作题 15 分

题目描述:
舞龙是中华民族传统民俗文化活动。在一次非遗文化节上,需要编排一个 n 行 m 列的舞龙方阵。每位表演者的位置用一个数字编号表示,从1开始按先行后列的顺序依次编号。请编写程序,输入行数 n 和列数 m,输出完整的方阵编号(二维列表形式),并计算方阵四个角落位置的编号之和。

输入格式:

输出格式:
- 先输出完整的方阵,每行数字空格分隔
- 最后一行:四个角落编号之和:{和}
四个角落:左上角(第1行第1列)、右上角(第1行第m列)、左下角(第n行第1列)、右下角(第n行第m列)

示例输入:

3 4

示例输出:

1 2 3 4
5 6 7 8
9 10 11 12
四个角落编号之和:26
样例说明:四个角落:左上=1,右上=4,左下=9,右下=12,和=1+4+9+12=26
✅ 参考答案:
📖 参考代码
# 读取行列数
n, m = map(int, input().split())
# 生成方阵
grid = []
num = 1
for i in range(n):
    row = []
    for j in range(m):
        row.append(num)
        num += 1
    grid.append(row)
# 输出方阵
for row in grid:
    print(' '.join(map(str, row)))
# 计算四个角落编号之和
top_left = grid[0][0]
top_right = grid[0][m - 1]
bottom_left = grid[n - 1][0]
bottom_right = grid[n - 1][m - 1]
corner_sum = top_left + top_right + bottom_left + bottom_right
print(f"四个角落编号之和:{corner_sum}")
第 12 题 编程操作题 15 分

题目描述:
某非遗保护中心需要为每项非遗技艺生成档案文件。请编写程序,输入一项非遗技艺的基本信息,将格式化后的档案内容写入文件 heritage_record.txt 中。
档案格式如下:
========== 非遗技艺档案 ==========
项目名称:{名称}
所属类别:{类别}
传承地区:{地区}
保护等级:{等级}
建档日期:{日期}
==================================

输入格式:
- 第一行:项目名称
- 第二行:所属类别
- 第三行:传承地区
- 第四行:保护等级(国家级/省级/市级)
- 第五行:建档日期(格式如 2024-08-15)

输出格式:
- 屏幕输出:档案已保存至 heritage_record.txt
- 文件内容:按上述格式生成的档案文本

示例输入:

蔚县剪纸
传统美术
河北省蔚县
国家级
2024-08-15
示例输出(屏幕):
档案已保存至 heritage_record.txt
示例输出(heritage_record.txt 文件内容):
========== 非遗技艺档案 ==========
项目名称:蔚县剪纸
所属类别:传统美术
传承地区:河北省蔚县
保护等级:国家级
建档日期:2024-08-15
==================================

示例输出:

✅ 参考答案:
📖 参考代码
# 读取非遗技艺信息
name = input().strip()
category = input().strip()
region = input().strip()
level = input().strip()
date = input().strip()
# 构建档案内容
content = "========== 非遗技艺档案 ==========\n"
content += f"项目名称:{name}\n"
content += f"所属类别:{category}\n"
content += f"传承地区:{region}\n"
content += f"保护等级:{level}\n"
content += f"建档日期:{date}\n"
content += "==================================\n"
# 写入文件
with open("heritage_record.txt", "w", encoding="utf-8") as f:
    f.write(content)
# 屏幕提示
print("档案已保存至 heritage_record.txt")
第 13 题 编程操作题 20 分

题目描述:
某非遗传承基地记录了不同工艺项目所需的材料清单,数据以嵌套字典形式存储,格式如下:
- 外层字典的键是工艺名称,值是内层字典
- 内层字典的键是材料名称,值是所需数量(整数)
请编写程序完成以下任务:
1. 列出每个工艺项目所需的总材料种类数
2. 统计所有项目中,哪种材料被使用得最多(按总数量计算),输出材料名称和总数量
3. 按工艺名称的字母升序输出所有工艺及其材料清单
已知数据(程序内置):
crafts = {
"剪纸": {"红纸": 10, "剪刀": 2, "刻刀": 1},
"刺绣": {"丝线": 20, "绣布": 5, "绣针": 3, "绣绷": 1},
"陶艺": {"陶土": 15, "釉料": 8, "转盘": 1},
"蜡染": {"白布": 6, "蜂蜡": 3, "染料": 5, "蜡刀": 2}
}

输入格式:

输出格式:
- 第一部分:每个工艺一行,格式为 {工艺名}共需{数量}种材料
- 第二部分:一行,格式为 使用最多的材料:{材料名}(共{数量}个单位)
- 第三部分:按工艺名升序输出完整清单,每种工艺一行,格式为 {工艺名}:{材料1}×{数量}, {材料2}×{数量}, ...

示例输入:

示例输出:

剪纸共需3种材料
刺绣共需4种材料
陶艺共需3种材料
蜡染共需4种材料
使用最多的材料:丝线(共20个单位)
刺绣:丝线×20, 绣布×5, 绣针×3, 绣绷×1
剪纸:红纸×10, 剪刀×2, 刻刀×1
蜡染:白布×6, 蜂蜡×3, 染料×5, 蜡刀×2
陶艺:陶土×15, 釉料×8, 转盘×1
✅ 参考答案:
📖 参考代码
# 内置工艺材料数据
crafts = {
    "剪纸": {"红纸": 10, "剪刀": 2, "刻刀": 1},
    "刺绣": {"丝线": 20, "绣布": 5, "绣针": 3, "绣绷": 1},
    "陶艺": {"陶土": 15, "釉料": 8, "转盘": 1},
    "蜡染": {"白布": 6, "蜂蜡": 3, "染料": 5, "蜡刀": 2}
}
# 任务1:统计每种工艺的材料种类数
for name, materials in crafts.items():
    print(f"{name}共需{len(materials)}种材料")
# 任务2:统计所有材料的总使用量
material_total = {}
for name, materials in crafts.items():
    for mat, qty in materials.items():
        if mat in material_total:
            material_total[mat] += qty
        else:
            material_total[mat] = qty
# 找使用最多的材料
max_mat = ""
max_qty = 0
for mat, qty in material_total.items():
    if qty > max_qty:
        max_qty = qty
        max_mat = mat
print(f"使用最多的材料:{max_mat}(共{max_qty}个单位)")
# 任务3:按工艺名升序输出完整清单
for name in sorted(crafts.keys()):
    materials = crafts[name]
    parts = []
    for mat, qty in materials.items():
        parts.append(f"{mat}×{qty}")
    print(f"{name}:{', '.join(parts)}")
第 14 题 编程操作题 20 分

题目描述:
二十四节气是中国古代订立的一种用来指导农事的补充历法。在公历中,每个节气对应的日期大致固定,前后相差不过1~2天。请编写程序,使用 datetime 模块完成以下任务:
1. 用户输入一个年份(如2024)、一个月份(如3)和一个日期(如20)
2. 程序判断该日期属于哪个节气(根据节气的大致日期范围判断)
3. 输出该日期对应的节气名称,以及距离下一个节气的天数
简化起见,以3~5月(春季)的节气为例,各节气的公历大致日期范围如下:
| 节气 | 大致日期范围 |
|------|------------|
| 立春 | 2月3日~2月5日 |
| 雨水 | 2月18日~2月20日 |
| 惊蛰 | 3月5日~3月7日 |
| 春分 | 3月20日~3月22日 |
| 清明 | 4月4日~4月6日 |
| 谷雨 | 4月19日~4月21日 |
| 立夏 | 5月5日~5月7日 |
| 小满 | 5月20日~5月22日 |
判断规则:输入日期在哪个节气的日期范围内(前后允许1天误差),即属于该节气。如果输入日期不在上表中任何节气的范围内,判断该日期处于哪两个节气之间,输出"位于{前一节气}与{后一节气}之间",并计算距离后一个节气(后续的那个节气的大致日期)的天数。

输入格式:

输出格式:
- 如果命中某个节气:第一行输出 {月}月{日}日是{节气名称},第二行输出 距离下一个节气还有约{天数}天
- 如果处于两个节气之间:第一行输出 {月}月{日}日位于{前一节气}与{后一节气}之间,第二行输出 距离{后一节气}还有约{天数}天
示例输入1:
2024 3 20
示例输出1:
3月20日是春分
距离下一个节气还有约15天
示例输入2:
2024 3 15
示例输出2:
3月15日位于惊蛰与春分之间
距离春分还有约5天

示例输入:

示例输出:

✅ 参考答案:
📖 参考代码
from datetime import date, timedelta
# 读取日期
y, m, d = map(int, input().split())
# 节气的基础日期(取大致中间的日期,即范围的首日)
# 格式:(月, 日, 节气名称)
terms = [
    (2, 3, "立春"),
    (2, 18, "雨水"),
    (3, 5, "惊蛰"),
    (3, 20, "春分"),
    (4, 4, "清明"),
    (4, 19, "谷雨"),
    (5, 5, "立夏"),
    (5, 20, "小满")
]
# 判断输入日期属于哪个节气(±1天容差)
input_date = date(y, m, d)
found = None
for i, (tm, td, name) in enumerate(terms):
    term_date = date(y, tm, td)
    diff = abs((input_date - term_date).days)
    if diff <= 1:
        found = i
        break
if found is not None:
    # 命中某个节气
    term_name = terms[found][2]
    print(f"{m}月{d}日是{term_name}")
    # 下一个节气(如果不是最后一个)
    if found < len(terms) - 1:
        next_tm, next_td, next_name = terms[found + 1]
        next_date = date(y, next_tm, next_td)
        days_left = (next_date - input_date).days
        print(f"距离下一个节气还有约{days_left}天")
    else:
        print("这是本季最后一个节气")
else:
    # 未命中,判断处于哪两个节气之间
    for i in range(len(terms) - 1):
        prev_term = date(y, terms[i][0], terms[i][1])
        next_term = date(y, terms[i + 1][0], terms[i + 1][1])
        if prev_term < input_date < next_term:
            print(f"{m}月{d}日位于{terms[i][2]}与{terms[i+1][2]}之间")
            days_left = (next_term - input_date).days
            print(f"距离{terms[i+1][2]}还有约{days_left}天")
            break