题目
1. 找出5000以内(含5000)符合下列条件的所有的正整数,将它们放入一个列表。其中每个正整数符合的条件为:该数是3的倍数,且该数的平方是偶数。最后,计算这个列表中所有元素的和。
2.写一个函数,并写一个调用示例。该函数的参数为一个列表,列表的元素为一些英文单词。该函数的功能为,对于该列表,只看每个单词的最后一个字母,使用字典统计该字母出现的次数,并返回该字典。也就是在统计该列表中以某一字母结尾的单词的个数。例如:对于[‘hello’,’morning’,’evening’],三个单词的最后一个字母分别为’o’,’g’,’g’,所以应返回字典{‘o’:1,’g’:2}。
3. 文本文件price.txt中,存有一些股票在五个日期的价格,其中部分内容如下,未展示的部分格式相同。读取文件内容,计算每只股票的平均股价,最大股价,最小股价,并将结果保存在一个新的文本文件price_restult.txt中,price_restult.txt中内容格式应该如下。读取和写入的文件编码都为’utf-8’。
4.定义一个电商平台类,类名为EComPlat,并创建一个该类型的对象,并且使用其方法。该EComPlat类的属性为买家列表buyer_list(列表,其元素为字符串类型的买家名,该列表默认值为空列表),卖家列表seller_list(列表,其元素为字符串类型的卖家名,默认值为空列表),平台名称plat_name(字符串类,默认值为空字符串)。该EComPlat类有2个方法,一个是初始化方法,参数对应上述三个属性。另外一个的方法名add_buyer,功能是添加新买家,参数为buyer(类型为字符串),表示被添加的买家,该方法会判断该buyer是否在既有的buyer_list里,如果不在才将buyer添加进buyer_list。该方法最终返回最新的买家数目。
解答
第一题:数值筛选与求和
题目要求: 找出 5000 以内(含)的正整数,满足:
- 是 3 的倍数。
- 该数的平方是偶数。 最后计算这些数的和。
思路分析:
- 遍历范围:使用
range(1, 5001)来覆盖 1 到 5000。 - 条件逻辑:
- 条件 A:
num % 3 == 0。 - 条件 B:
num ** 2是偶数。 - 数学优化思路:若一个数的平方是偶数,则该数本身必然是偶数。因此,题目实际上是找 既是 3 的倍数又是 2 的倍数 的数,即 6 的倍数。不过为了严格贴合题意,我们在代码中直接写平方判断即可。
- 条件 A:
- 结果存储:将符合条件的数
append到列表中,最后用sum()求和。
代码:
a = []
for n in range(1, 5001):
if n % 3 == 0 and n % 2 == 0:
a.append(n)
sum = sum(a)
print("符合条件的数共有:", len(a), "个")
print("它们的和为:", sum)
第二题:单词尾字母统计函数
题目要求: 编写一个函数,统计列表中每个单词最后一个字母出现的次数,返回一个字典。
思路分析:
- 函数定义:接收一个列表参数。
- 初始化字典:创建一个空字典
counts = {}用于存储结果。 - 遍历列表:
- 获取当前单词的最后一个字符:
char = word[-1]。 - 健壮性考虑:最好判断一下单词是否为空字符串,防止报错。
- 获取当前单词的最后一个字符:
- 更新字典:
- 如果该字符已在字典中,值
+1。 - 如果不在,初始化为
1。 - 技巧:可以使用
dict.get(key, 0) + 1来简化逻辑。
- 如果该字符已在字典中,值
代码:
def con_num(words):
lc = {}
for word in words:
if word: #
last_word = word[-1].lower() # 转为小写以统一处理
lc[last_word] = lc.get(last_word, 0) + 1
return lc
# 调用示例
example_words = ['hello', 'morning', 'evening']
result = con_num(example_words)
print(result)
第三题:股票数据文件处理
题目要求: 读取 price.txt(UTF-8),计算每行股票的平均值、最大值、最小值,按指定格式写入 price_result.txt(UTF-8)。
思路分析:
- 读取文件:使用
utf-8编码读取。 - 解析数据:
- 跳过第一行表头。
- 使用
.split(',')按逗号分割每行数据。 - 第一项是股票代码,后续项转换为
float类型及其列表。
- 计算统计值:
- 平均值:总和除以数量(5天)。
- 最大/最小值:使用
max()和min()。
- 格式化输出:
- 目标表头固定为:
股票代码,平均股价,最大股价,最小股价。 - 数值处理:图片显示
10.576(3位小数)和85.5(1位小数),这符合 Python 默认的str()转换逻辑(自动去除无意义的0)。为了防止浮点数计算出现.00000001的误差,我们可以稍微round一下,但直接转字符串通常也能满足此题示例。
- 目标表头固定为:
- 写入文件:拼接成逗号分隔的字符串并写入。
- 代码实现:
Python
import re
# 读取原始文件
with open('price.txt', 'r', encoding='utf-8') as f:
content = f.read().strip()
pattern = r'(SZ\d{6})'
matches = re.split(pattern, content)
data_parts = matches[1:]
#分析股票数据
results = []
i = 0
while i < len(data_parts):
if data_parts[i].startswith('SZ') and len(data_parts[i]) == 8:
code = data_parts[i]
if i + 1 < len(data_parts):
price_str = data_parts[i + 1]
# 按逗号分开数据,包含空格
prices_raw = price_str.split(',')
prices = []
for p in prices_raw:
p = p.strip()
if p.replace('.', '', 1).isdigit(): # 判断是否为数字(支持小数)
prices.append(float(p))
if len(prices) == 5: # 必须有5个有效价格
avg = sum(prices) / 5
max_p = max(prices)
min_p = min(prices)
results.append((code, round(avg, 2), max_p, min_p))
i += 2
else:
i += 1
# 写入结果文件
with open('price_result.txt', 'w', encoding='utf-8') as f:
f.write("股票代码,平均股价,最大股价,最小股价\n")
for code, avg, max_p, min_p in results:
f.write(f"{code},{avg},{max_p},{min_p}\n")
print("处理完成,结果见 price_result.txt")
第四题:电商平台类 (OOP)
题目要求: 定义 EComPlat 类,包含属性(买家列表、卖家列表、平台名)和方法(初始化、添加买家)。
思路分析:
- 类定义:
class EComPlat:。 - 初始化方法
__init__:- 接收
buyer_list,seller_list,plat_name。 - 重要细节:在 Python 中,不要使用可变对象(如列表)作为函数的默认参数值。如果写
def __init__(self, buyer_list=[]),会导致所有使用默认参数的对象共享同一个列表。 - 正确做法是默认值设为
None,并在函数内部判断赋值为空列表。
- 接收
- 添加买家方法
add_buyer:- 接收
buyer字符串。 - 检查
if buyer not in self.buyer_list。 - 如果不在,
append。 - 返回
len(self.buyer_list)。
- 接收
代码:
class EComPlat:
def __init__(self, buyer_list=None, seller_list=None, plat_name=""):
self.buyer_list = buyer_list if buyer_list is not None else []
self.seller_list = seller_list if seller_list is not None else []
self.plat_name = plat_name
def add_buyer(self, buyer):
# 如果买家不在列表中
if buyer not in self.buyer_list:
self.buyer_list.append(buyer)
# 返回当前买家总数
return len(self.buyer_list)
# 创建一个 EComPlat 对象
my_platform = EComPlat(plat_name="MyShop")
# 调用 add_buyer 方法添加买家
print(my_platform.add_buyer("张三"))
print(my_platform.add_buyer("李四"))
print(my_platform.add_buyer("张三"))
# 查看当前买家列表
print("当前买家列表:", my_platform.buyer_list)