备考题目¶
综合练习:类、文件读写、NumPy(13题)¶
本练习根据课程内容重新设计,按你指定的结构编排:
- 第1部分:类相关(4题)
- 第2部分:文件读写相关(3题)
- 第3部分:NumPy相关(3题)
- 第4部分:类 + NumPy结合(2题)
- 第5部分:类 + 文件读写 + NumPy综合(1题)
使用建议¶
- 先只看题目,自己完成。
- 写完后再看“参考解答”。
- 建议尝试:
- 先不运行答案,自己独立写
- 再对照参考解答优化写法
- 最后总结每题考了什么
第1部分:类相关(4题)¶
题1:设计一个 Book 类,并编写借阅逻辑¶
请设计一个 Book 类,要求:
- 属性包括:
title、author、is_borrowed - 方法包括:
borrow():如果书未借出,则借出并提示成功;否则提示已借出return_book():归还图书show_info():输出图书信息
- 创建两本图书对象,并模拟借阅、重复借阅、归还等过程
book1 = Book('Python入门', 'Alice')
book2 = Book('数据结构基础', 'Bob')
book1.show_info()
book1.borrow()
book1.borrow()
book1.return_book()
book1.show_info()
book2.show_info()
本题知识点:类的定义、对象创建、属性、方法、条件判断
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
self.is_borrowed = False
def borrow(self):
if not self.is_borrowed:
self.is_borrowed = True
print(f'《{self.title}》借阅成功')
else:
print(f'《{self.title}》当前已被借出')
def return_book(self):
self.is_borrowed = False
print(f'《{self.title}》已归还')
def show_info(self):
status = '已借出' if self.is_borrowed else '可借阅'
print(f'书名: {self.title}, 作者: {self.author}, 状态: {status}')
book1 = Book('Python入门', 'Alice')
book2 = Book('数据结构基础', 'Bob')
book1.show_info()
book1.borrow()
book1.borrow()
book1.return_book()
book1.show_info()
book2.show_info()
书名: Python入门, 作者: Alice, 状态: 可借阅 《Python入门》借阅成功 《Python入门》当前已被借出 《Python入门》已归还 书名: Python入门, 作者: Alice, 状态: 可借阅 书名: 数据结构基础, 作者: Bob, 状态: 可借阅
题2:设计一个 Student 类,并拆分出成绩判断方法¶
请设计一个 Student 类,要求:
- 属性包括:
name、score - 方法包括:
get_level():根据成绩返回等级- 90及以上:A
- 80~89:B
- 70~79:C
- 60~69:D
- 60以下:E
show_info():输出学生姓名、成绩、等级
- 创建三个学生对象并输出信息
students = [ Student('Tom', 95), Student('Jerry', 82), Student('Lucy', 67) ]
本题知识点:类、方法设计、返回值、分支判断
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
def get_level(self):
if self.score >= 90:
return 'A'
elif self.score >= 80:
return 'B'
elif self.score >= 70:
return 'C'
elif self.score >= 60:
return 'D'
else:
return 'E'
def show_info(self):
print(f'姓名: {self.name}, 成绩: {self.score}, 等级: {self.get_level()}')
students = [
Student('Tom', 95),
Student('Jerry', 82),
Student('Lucy', 67)
]
for stu in students:
stu.show_info()
姓名: Tom, 成绩: 95, 等级: A 姓名: Jerry, 成绩: 82, 等级: B 姓名: Lucy, 成绩: 67, 等级: D
题3:设计一个 Rectangle 类,计算面积和周长¶
请设计一个 Rectangle 类,要求:
- 属性包括:
width、height - 方法包括:
area():返回面积perimeter():返回周长is_square():判断是否为正方形
- 创建多个对象并输出结果
rectangles = [ Rectangle(3, 4), Rectangle(5, 5), Rectangle(2, 8) ]
本题知识点:类、实例方法、返回值、逻辑判断
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return 2 * (self.width + self.height)
def is_square(self):
return self.width == self.height
rectangles = [
Rectangle(3, 4),
Rectangle(5, 5),
Rectangle(2, 8)
]
for i, rect in enumerate(rectangles, start=1):
print(f'矩形{i}: 面积={rect.area()}, 周长={rect.perimeter()}, 是否正方形={rect.is_square()}')
矩形1: 面积=12, 周长=14, 是否正方形=False 矩形2: 面积=25, 周长=20, 是否正方形=True 矩形3: 面积=16, 周长=20, 是否正方形=False
题4:设计一个 BankAccount 类,模拟存取款¶
请设计一个 BankAccount 类,要求:
- 属性包括:
owner、balance - 方法包括:
deposit(amount):存款withdraw(amount):取款,余额不足时提示失败show_balance():显示余额
- 创建一个账户对象,完成几次存款与取款
account = BankAccount('Ran', 500)
account.show_balance()
account.deposit(200)
account.withdraw(100)
account.withdraw(1000)
account.show_balance()
本题知识点:类、对象状态变化、方法参数、条件判断
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance
def deposit(self, amount):
self.balance += amount
print(f'{self.owner} 存款 {amount} 元,当前余额 {self.balance} 元')
def withdraw(self, amount):
if amount <= self.balance:
self.balance -= amount
print(f'{self.owner} 取款 {amount} 元,当前余额 {self.balance} 元')
else:
print(f'取款失败:余额不足,当前余额 {self.balance} 元')
def show_balance(self):
print(f'{self.owner} 的账户余额为 {self.balance} 元')
account = BankAccount('Ran', 500)
account.show_balance()
account.deposit(200)
account.withdraw(100)
account.withdraw(1000)
account.show_balance()
Ran 的账户余额为 500 元 Ran 存款 200 元,当前余额 700 元 Ran 取款 100 元,当前余额 600 元 取款失败:余额不足,当前余额 600 元 Ran 的账户余额为 600 元
第2部分:文件读写相关(3题)¶
题5:读取文本文件并统计行数与单词数¶
请完成下面任务:
- 先创建一个文本文件
article.txt - 向文件中写入多行英文句子
- 重新读取文件内容
- 统计:
- 总行数
- 总单词数
- 输出统计结果
content = """Python is easy to learn.
It is widely used in data analysis.
File handling is an important skill."""
本题知识点:文件写入、文件读取、字符串处理、统计
content = """Python is easy to learn.
It is widely used in data analysis.
File handling is an important skill."""
with open('article.txt', 'w', encoding='utf-8') as f:
f.write(content)
with open('article.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
line_count = len(lines)
word_count = sum(len(line.strip().split()) for line in lines)
print('文件内容:')
for line in lines:
print(line.strip())
print(f'总行数: {line_count}')
print(f'总单词数: {word_count}')
文件内容: Python is easy to learn. It is widely used in data analysis. File handling is an important skill. 总行数: 3 总单词数: 18
题6:将用户列表写入文件,再读取并格式化输出¶
已知一个列表:
users = ['Alice,18', 'Bob,20', 'Cindy,19']
请完成:
- 将列表内容逐行写入
users.txt - 读取该文件
- 将每一行拆分成“姓名”和“年龄”
- 格式化输出,例如:
Alice is 18 years old.
本题知识点:文件写入、逐行读取、字符串分割、循环处理
users = ['Alice,18', 'Bob,20', 'Cindy,19']
with open('users.txt', 'w', encoding='utf-8') as f:
for user in users:
f.write(user + '\n')
with open('users.txt', 'r', encoding='utf-8') as f:
for line in f:
name, age = line.strip().split(',')
print(f'{name} is {age} years old.')
Alice is 18 years old. Bob is 20 years old. Cindy is 19 years old.
题7:批量创建文本文件并统计文件夹中的文本文件数量¶
请完成:
- 创建一个文件夹
text_data - 在其中批量创建 5 个
.txt文件 - 每个文件写入一行不同内容
- 遍历该文件夹,统计其中
.txt文件的数量 - 输出所有文件名
本题知识点:文件夹创建、文件写入、目录遍历、条件筛选
import os
folder = 'text_data'
os.makedirs(folder, exist_ok=True)
for i in range(1, 6):
file_path = os.path.join(folder, f'file_{i}.txt')
with open(file_path, 'w', encoding='utf-8') as f:
f.write(f'This is file {i}.')
file_names = []
for name in os.listdir(folder):
if name.endswith('.txt'):
file_names.append(name)
print('txt 文件数量:', len(file_names))
print('文件名列表:')
for name in file_names:
print(name)
txt 文件数量: 5 文件名列表: file_1.txt file_2.txt file_3.txt file_4.txt file_5.txt
第3部分:NumPy相关(3题)¶
题8:创建数组并统计基本信息¶
请使用 NumPy 完成:
- 创建一个 3×4 的数组,元素为 1~12
- 输出数组的:
- 维度
ndim - 形状
shape - 元素总数
size
- 维度
- 计算数组元素的总和、平均值、最大值、最小值
本题知识点:数组创建、数组属性、统计函数
import numpy as np
arr = np.arange(1, 13).reshape(3, 4)
print('数组:')
print(arr)
print('ndim =', arr.ndim)
print('shape =', arr.shape)
print('size =', arr.size)
print('sum =', arr.sum())
print('mean =', arr.mean())
print('max =', arr.max())
print('min =', arr.min())
数组: [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] ndim = 2 shape = (3, 4) size = 12 sum = 78 mean = 6.5 max = 12 min = 1
题9:数组切片与行列统计¶
请使用 NumPy 完成:
- 创建一个 4×5 的数组,元素为 1~20
- 取出:
- 第2行
- 第3列
- 左上角 2×2 子数组
- 计算每一行的和
- 计算每一列的平均值
本题知识点:数组索引切片、按轴统计
import numpy as np
arr = np.arange(1, 21).reshape(4, 5)
print('原数组:')
print(arr)
print('第2行:', arr[1])
print('第3列:', arr[:, 2])
print('左上角2x2子数组:')
print(arr[:2, :2])
print('每一行的和:', arr.sum(axis=1))
print('每一列的平均值:', arr.mean(axis=0))
原数组: [[ 1 2 3 4 5] [ 6 7 8 9 10] [11 12 13 14 15] [16 17 18 19 20]] 第2行: [ 6 7 8 9 10] 第3列: [ 3 8 13 18] 左上角2x2子数组: [[1 2] [6 7]] 每一行的和: [15 40 65 90] 每一列的平均值: [ 8.5 9.5 10.5 11.5 12.5]
题10:使用布尔索引筛选数组数据¶
请使用 NumPy 完成:
- 创建一个一维数组:
[56, 72, 89, 45, 91, 67, 100, 38] - 找出所有及格(>=60)的成绩
- 找出所有优秀(>=90)的成绩
- 统计及格人数和优秀人数
本题知识点:NumPy数组、条件筛选、布尔索引、统计
import numpy as np
scores = np.array([56, 72, 89, 45, 91, 67, 100, 38])
pass_scores = scores[scores >= 60]
excellent_scores = scores[scores >= 90]
print('原始成绩:', scores)
print('及格成绩:', pass_scores)
print('优秀成绩:', excellent_scores)
print('及格人数:', len(pass_scores))
print('优秀人数:', len(excellent_scores))
原始成绩: [ 56 72 89 45 91 67 100 38] 及格成绩: [ 72 89 91 67 100] 优秀成绩: [ 91 100] 及格人数: 5 优秀人数: 2
第4部分:类 + NumPy结合(2题)¶
题11:设计一个 ScoreAnalyzer 类,分析成绩数组¶
请设计一个 ScoreAnalyzer 类,要求:
- 初始化时传入一个 NumPy 成绩数组
- 方法包括:
show_scores():输出原始成绩average_score():返回平均分max_score():返回最高分count_passed():返回及格人数
- 创建对象并测试
[78, 92, 56, 81, 67, 49]
本题知识点:类、对象方法、NumPy数组、统计计算
import numpy as np
class ScoreAnalyzer:
def __init__(self, scores):
self.scores = scores
def show_scores(self):
print('成绩数组:', self.scores)
def average_score(self):
return self.scores.mean()
def max_score(self):
return self.scores.max()
def count_passed(self):
return np.sum(self.scores >= 60)
analyzer = ScoreAnalyzer(np.array([78, 92, 56, 81, 67, 49]))
analyzer.show_scores()
print('平均分:', analyzer.average_score())
print('最高分:', analyzer.max_score())
print('及格人数:', analyzer.count_passed())
成绩数组: [78 92 56 81 67 49] 平均分: 70.5 最高分: 92 及格人数: 4
题12:设计一个 MatrixTool 类,处理二维数组¶
请设计一个 MatrixTool 类,要求:
- 初始化时传入一个二维 NumPy 数组
- 方法包括:
show_matrix():输出矩阵row_sums():返回每一行的和col_means():返回每一列的平均值transpose_matrix():返回转置矩阵
- 创建对象并测试
本题知识点:类、NumPy二维数组、按轴计算、矩阵转置
import numpy as np
class MatrixTool:
def __init__(self, matrix):
self.matrix = matrix
def show_matrix(self):
print('矩阵:')
print(self.matrix)
def row_sums(self):
return self.matrix.sum(axis=1)
def col_means(self):
return self.matrix.mean(axis=0)
def transpose_matrix(self):
return self.matrix.T
matrix_tool = MatrixTool(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))
matrix_tool.show_matrix()
print('每行和:', matrix_tool.row_sums())
print('每列平均值:', matrix_tool.col_means())
print('转置矩阵:')
print(matrix_tool.transpose_matrix())
矩阵: [[1 2 3] [4 5 6] [7 8 9]] 每行和: [ 6 15 24] 每列平均值: [4. 5. 6.] 转置矩阵: [[1 4 7] [2 5 8] [3 6 9]]
第5部分:类 + 文件读写 + NumPy综合(1题)¶
题13:设计一个 ScoreFileManager 类,读取文件并用 NumPy 计算成绩统计¶
请完成一个综合题:
- 先创建一个文本文件
scores.txt,内容如下(每行一个成绩):
78
85
92
60
49
100
73
- 设计一个
ScoreFileManager类,要求:- 初始化时接收文件名
read_scores():从文件中读取所有成绩,并保存为 NumPy 数组show_scores():输出成绩数组average_score():返回平均分max_score():返回最高分count_passed():返回及格人数
- 创建对象并调用这些方法
本题知识点:类设计、文件读取、类型转换、NumPy统计
import numpy as np
with open('scores.txt', 'w', encoding='utf-8') as f:
f.write("""78
85
92
60
49
100
73
""")
class ScoreFileManager:
def __init__(self, filename):
self.filename = filename
self.scores = None
def read_scores(self):
with open(self.filename, 'r', encoding='utf-8') as f:
data = [int(line.strip()) for line in f if line.strip()]
self.scores = np.array(data)
def show_scores(self):
print('成绩数组:', self.scores)
def average_score(self):
return self.scores.mean()
def max_score(self):
return self.scores.max()
def count_passed(self):
return np.sum(self.scores >= 60)
manager = ScoreFileManager('scores.txt')
manager.read_scores()
manager.show_scores()
print('平均分:', manager.average_score())
print('最高分:', manager.max_score())
print('及格人数:', manager.count_passed())
成绩数组: [ 78 85 92 60 49 100 73] 平均分: 76.71428571428571 最高分: 100 及格人数: 6
总结¶
这份练习按你指定的结构组织,共 13题。建议你接下来这样使用:
- 先做 第1部分,巩固类的基础
- 再做 第2、3部分,分别练熟文件操作和 NumPy
- 最后做 第4、5部分,训练模块之间的结合能力
如果你后面还想继续细化,我可以再给你做一个:
- 只保留题目、不放答案版
- 答案折叠提示更少版
- 更像考试卷的排版版