python期末作业分析

题目

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 以内(含)的正整数,满足:

  1. 是 3 的倍数。
  2. 该数的平方是偶数。 最后计算这些数的和。

思路分析:

  1. 遍历范围:使用 range(1, 5001) 来覆盖 1 到 5000。
  2. 条件逻辑
    • 条件 A:num % 3 == 0
    • 条件 B:num ** 2 是偶数。
    • 数学优化思路:若一个数的平方是偶数,则该数本身必然是偶数。因此,题目实际上是找 既是 3 的倍数又是 2 的倍数 的数,即 6 的倍数。不过为了严格贴合题意,我们在代码中直接写平方判断即可。
  3. 结果存储:将符合条件的数 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)

第二题:单词尾字母统计函数

题目要求: 编写一个函数,统计列表中每个单词最后一个字母出现的次数,返回一个字典。

思路分析:

  1. 函数定义:接收一个列表参数。
  2. 初始化字典:创建一个空字典 counts = {} 用于存储结果。
  3. 遍历列表
    • 获取当前单词的最后一个字符:char = word[-1]
    • 健壮性考虑:最好判断一下单词是否为空字符串,防止报错。
  4. 更新字典
    • 如果该字符已在字典中,值 +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)。

思路分析:

  1. 读取文件:使用 utf-8 编码读取。
  2. 解析数据
    • 跳过第一行表头。
    • 使用 .split(',') 按逗号分割每行数据。
    • 第一项是股票代码,后续项转换为 float 类型及其列表。
  3. 计算统计值
    • 平均值:总和除以数量(5天)。
    • 最大/最小值:使用 max()min()
  4. 格式化输出
    • 目标表头固定为:股票代码,平均股价,最大股价,最小股价
    • 数值处理:图片显示 10.576(3位小数)和 85.5(1位小数),这符合 Python 默认的 str() 转换逻辑(自动去除无意义的0)。为了防止浮点数计算出现 .00000001 的误差,我们可以稍微 round 一下,但直接转字符串通常也能满足此题示例。
  5. 写入文件:拼接成逗号分隔的字符串并写入。
  6. 代码实现:

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 类,包含属性(买家列表、卖家列表、平台名)和方法(初始化、添加买家)。

思路分析:

  1. 类定义class EComPlat:
  2. 初始化方法 __init__
    • 接收 buyer_list, seller_list, plat_name
    • 重要细节:在 Python 中,不要使用可变对象(如列表)作为函数的默认参数值。如果写 def __init__(self, buyer_list=[]),会导致所有使用默认参数的对象共享同一个列表。
    • 正确做法是默认值设为 None,并在函数内部判断赋值为空列表。
  3. 添加买家方法 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)
博客内容均系原创,未经允许严禁转载!
您可以通过 RSS 订阅本站文章更新,订阅地址:https://blog.abco.fun
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇