跳至内容

2025-10-26 视觉培训作业 1

作业一:面向对象计算器

  • 文件名:calculator.py

  • 要求:

    • 使用 Calculator 类并在 __init__ 中设置状态。
    • 提供至少 `add, sub, mul, div, pow, 方法。
    • div 遇零要抛出自定义异常并在调用处捕获。
  • 提交方式:

    • 雨课堂
  • 评分:功能完整 50 / 错误优化 30 / 代码风格 20


作业二:API调用 封装为类

  • 文件名:PoetryBot.py

  • 要求:

    • ######处补充代码,使程序能实现功能,共8处。
    • 为这段代码补充注释
  • 功能:

    • 键盘按下"Enter"键,获取新诗句

    • 键盘按下"s"键,查看统计

    • 键盘按下"q"键,退出程序

  • 提交方式:

    • 雨课堂
  • 评分:功能完整 50 / 错误优化 30 / 代码风格 20

补充一:api接口

# 每日诗词 每天学一首经典古诗词,用代码表达言语的魅力,用代码书写山河的壮丽。

请求参数:

参数	类型	必填	示例值	说明
key	string	是	你的 APIKEY	

返回参数说明:

参数	类型	示例	说明
content	string	有形的东西迟早会凋零,但只有回忆是永远不会凋零的	内容
origin	object		来源出处

返回示例:

{
  "status": "success",
  "data": {
    "id": "5b8b9572e116fb3714e6fb01",
    "content": "昔人已乘黄鹤去,此地空余黄鹤楼。",
    "popularity": 1090000,
    "origin": {
      "title": "黄鹤楼 / 登黄鹤楼",
      "dynasty": "唐代",
      "author": "崔颢",
      "content": [
        "昔人已乘黄鹤去,此地空余黄鹤楼。",
        "黄鹤一去不复返,白云千载空悠悠。",
        "晴川历历汉阳树,芳草萋萋鹦鹉洲。",
        "日暮乡关何处是,烟波江上使人愁。"
      ],
      "translate": [
        "昔日的仙人已乘着黄鹤飞去,这地方只留下空荡的黄鹤楼。",
        "黄鹤一去再也没有返回这里,千万年来只有白云飘飘悠悠。",
        "汉阳晴川阁的碧树历历可辨,更能看清芳草繁茂的鹦鹉洲。",
        "时至黄昏不知何处是我家乡?看江面烟波渺渺更使人烦愁!"
      ]
    },
    "matchTags": ["华中", "黄鹤楼"],
    "recommendedReason": "",
    "cacheAt": "2025-03-08T23:24:41.066150166"
  },
  "token": "IkH7PCZQeST4T3j3LvfS/1f8iBw0Xgt",
  "warning": null
}

补充二:HitokotoBot.py 课上的模版文件

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
"""
==============================
📘 Python课堂作业模板:API调用Bot类
==============================

任务说明:
1. 编写一个 Bot 类,调用一言(Hitokoto)API;
2. 支持输出内容、来源、作者;
3. 包含异常处理、交互输入、日志记录功能;
4. 支持多次调用;
5. 使用面向对象编程思想。
"""
import requests
import time
import json
from datetime import datetime
import math


class HitokotoBot:
    """
    💬 HitokotoBot类:调用一言API并返回随机句子

    属性:
        api_url (str): API 接口地址
        api_key (str): 用户的API密钥
        logs (list): 用于记录调用历史

    方法:
        get_quote(): 调用API并返回结果
        format_quote(data): 格式化显示API返回内容
        save_logs(filename): 保存调用历史到本地文件
    """

    def __init__(self, api_key: str):
        self.api_url = "https://v1.hitokoto.cn/"  # 一言API
        self.api_key = api_key
        self.logs = []

    def get_quote(self):
        """
        调用一言API并返回随机句子内容。
        """
        try:
            headers = {"Content-Type": "application/json"}
            params = {"key": self.api_key}

            response = requests.get(self.api_url, headers=headers, params=params, timeout=5)

            # 如果HTTP响应异常则抛出异常
            response.raise_for_status()

            data = response.json()
            quote = self.format_quote(data)

            # 保存到日志
            self.logs.append({
                "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                "quote": data.get("hitokoto"),
                "from": data.get("from"),
                "from_who": data.get("from_who")
            })

            return quote

        except requests.exceptions.Timeout:
            return "⚠️ 请求超时,请检查网络连接。"
        except requests.exceptions.RequestException as e:
            return f"❌ API请求失败:{e}"
        except Exception as e:
            return f"❗ 出现未知错误:{e}"

    def format_quote(self, data):
        """
        格式化显示API返回内容
        """
        hitokoto = data.get("hitokoto", "无内容")
        from_ = data.get("from", "未知出处")
        from_who = data.get("from_who", "佚名")
        return f"💬「{hitokoto}」—— {from_who}{from_}》"

    def save_logs(self, filename="bot_logs.json"):
        """
        保存调用历史到JSON文件。
        """
        with open(filename, "w", encoding="utf-8") as f:
            json.dump(self.logs, f, ensure_ascii=False, indent=2)
        print(f"✅ 日志已保存到 {filename}")

    def run(self):
        """
        主运行逻辑,支持交互式使用。
        """
        print("🤖 欢迎使用 Hitokoto Bot!输入 q 退出。")
        while True:
            cmd = input("👉 按 Enter 获取一条新句子,或输入 q 退出:")
            if cmd.lower() == "q":
                break
            print(self.get_quote())
            time.sleep(1)
        self.save_logs()


# ========== 程序入口 ==========
if __name__ == "__main__":
    # 学生在这里填写自己的API Key
    bot1 = HitokotoBot(api_key="738b541a5f7a")
    bot2 = HitokotoBot(api_key="7")
    # 启动Bot
    bot.run()