Day01 AI智能体筑基打卡

当 Python 首次登顶 TIOBE 榜首、取代霸榜多年的 Java,AI 时代的编程版图已然改写。语法易学只是入场券,真正的分水岭在于智能体应用开发中的落地能力。无论你是在校园里学着与现实脱节的旧知识,还是身处传统前后端领域面临被替代的焦虑——这个系列不绕弯子、不讲废话,只聚焦那些真正会卡住你的痛点,记录一步步踩坑与补全认知的过程。

AI 浪潮下,我们都是摸着石头过河的同行者。与其被焦虑裹挟,不如把学习日常摊开来,一起查缺补漏、扎实成长。希望这些记录能陪你在这场技术变革中,走得更稳、更远。

一、今日学习内容

规范

PEP8编码规范

  • 缩进规范:

    统一使用4 个空格缩进,禁止 Tab 与空格混用(一直爆红找不到原因,可以全局格式化)

    函数、循环、判断内部代码强制缩进。

  • 命名规范:

    • 变量、函数:蛇形命名法 user_name / get_data(),全小写 + 下划线分割
    • 类:大驼峰 UserInfoRecord,每个单词首字母大写
    • 常量:全大写 MAX_RETRY_TIMES = 10
  • 注释书写规范:

    • 行内注释:代码后方空两格再写#,用于简短说明单行逻辑

    • 块注释:单独一行#开头,描述下方整块代码功能

    • 函数 / 类文档注释:三引号"“” “”",说明入参、返回值、功能

基础(异常)

异常就是程序运行过程中出现的错误,它会中断程序的正常执行流程,保证数据和逻辑的正确性

异常有捕获异常主动抛出异常之分。

异常捕获(try...except...else...finally):(为了程序不崩,接住错误)

  1. try-except-else-finally 异常捕获基础结构:

    try:
        可能出现异常的业务代码1
        可能出现异常的业务代码2
        ...
    except [异常类型 as 变量名]:  # 把异常报错装进变量,便于查看具体原因
        出现异常时的预案
        ...
    else:  # 没有发生任何异常时才执行
        ...
    finally:  # 无论如何都会执行,释放资源
        ...
    

    注:try...finally 是一种异常处理结构,其中的 finally 子句用于定义 无论是否发生异常,都会被执行 的清理/资源释放代码(不常用)。

    注: 把**“没有异常时才该做的事”**放进 else,可以让 try 块里只放“高危代码”,逻辑更干净。

  2. 区分不同报错:

    Exception:兜底异常,是常见异常的父类,可以承接所有异常情况。

    异常名字中文直译碰到就想起一句话
    IndexError下标越界“列表就那么长,你指太远了”
    KeyError键不存在“字典里没这个标签”
    ValueError值错误“内容是垃圾,转不了数字”
    TypeError类型错误“字符串和数字别瞎拼凑”
    NameError名字未定义“变量名拼错了或没赋值”
    AttributeError属性不存在“对象身上没这件衣服(属性)”
    ZeroDivisionError除以零“别跟数学规则对着干”

异常传递就是异常在函数调用中层层上报的过程,直到有人处理它,或者程序崩溃。

主动抛出异常(raise):(为了更好的实现业务逻辑,回报上层代码处理)

有时候,Python 自己不会报错,但业务逻辑不允许。这时候你需要主动 raise(抛出)异常

raise 异常类型("错误描述信息")

这时候,一些逻辑问题就可以通过异常抛出来解决,而不是单纯的print一句,“借阅失败,图书数量已达上限!”

这样做的好处是:raise 可以通过 try...except 被精准捕获,让上层代码判断执行失败,从而决定下一步操作,提高了代码的健壮性

自定义业务异常(最优雅):(俺们这群敲代码的不就图个优雅嘛!)

Python 内置的异常(如 ValueErrorTypeError)太泛了,无法精准表达业务错误。这时候我们可以自定义异常类

# 自定义异常:只需继承 Exception(或其子类)
class BorrowLimitError(Exception):
    """借阅数量超限异常"""
    pass

class BookStockError(Exception):
    """书籍库存不足异常"""
    pass

class BookNotFoundError(Exception):
    """书籍不存在异常"""
    pass

最后用一个完整的图书借阅系统总结三种异常:

# ------- 1. 定义自定义异常 -------
class BorrowLimitError(Exception):
    pass

class BookStockError(Exception):
    pass

# ------- 2. 在业务逻辑中主动抛出 -------
class Member:
    def borrow_book(self, book: Book):
        if len(self.__borrowed_books) >= self.get_max_books():
            # 主动抛出异常(raise)
            raise BorrowLimitError(f"已达上限 {self.get_max_books()} 本")
        if book.get_available_num() <= 0:
            raise BookStockError(f"《{book.title}》库存不足")
        
        # 正常借阅
        book.decrease_stock()
        self.__borrowed_books.append(book)
        print(f"借阅《{book.title}》成功")

# ------- 3. 在调用层细分捕获 -------
class LibrarySystem:
    def handle_borrow_book(self):
        book_id = input("请输入图书编号:")
        book = self.books.get(book_id)
        if not book:
            print("图书编号不存在")
            return
        
        try:
            # 尝试借书(内部可能抛出自定义异常)
            self.current_member.borrow_book(book)
        except BorrowLimitError as e:  # 异常捕获,但是自定义异常
            print(f"{e},无法继续借阅")
        except BookStockError as e:
            print(f"{e},请选择其他书籍")
        except Exception as e:
            # 兜底捕获所有未知错误
            print(f"系统异常:{e}")
        else:
            # 借书成功,没有异常
            print("🎉 借书流程完成")
        finally:
            print("--- 本次操作结束 ---")

快捷键

  • ctrl + alt +L = 格式化

  • ctrl + D = 快速复制一行

  • ctrl + / = 注释

  • shift + 回车 = 光标换行

  • ctrl + alt + V = 快速使用变量接收

  • ctrl + alt + M = 选中代码,把代码抽取到函数中

  • ctrl + alt + T = 选中代码,把代码抽取到一个代码块中

  • ctrl + alt +左右键 = 上下代码切换位置

  • ctrl + F = 搜索

  • ctrl + R = 替换

  • ctrl + . = 切换中英文输入法

二、今日核心代码

# Day01 PEP8规范 + 多场景异常捕获5组案例
# 案例1: 列表索引越界
def get_list_item(data_list,index):
    # try块,存放可能会出错的代码
    try:
        res = data_list[index]
        return res
    except IndexError as e:
        print(f"索引越界异常:{e}")
    finally:
        print("列表查询流程执行完毕!")

# 案例2: 字典键不存在
def get_dict_key(data_dict,key):
    # 存放可能出错的代码
    try:
        res = data_dict[key]
        return res
    except KeyError as e:
        print(f"key不存在:{e}")
    finally:
        print("key查询流程执行完毕!")

# 案例3: 除数为0
def get_avg(data_list):
    try:
        avg_num = sum(data_list) / len(data_list)
        return avg_num
    except ZeroDivisionError as e:
        print(f"求值运算异常:{e}")
    except Exception as e:  # 兜底异常
        print(f"未知运算异常:{e}")
    finally:
        print("平均值计算流程执行完毕!")

# 案例4: 文件读取
def read_file(file_path):
    try:
        with open(file_path,"r",encoding="utf-8") as f:  # 把open()返回的东西赋值给f
            return f.read()
    except FileNotFoundError as e:
        print(f"文件不存在:{e}")

# 案例5: 类型转换异常
def str_to_int(text):
    try:
        return int(text)
    except ValueError as e:
        print(f"数值转换失败:{e}")

# 调用测试
if __name__ == '__main__':
    lst = [10,20,30]
    get_list_item(lst,99)  # 触发IndexError

    info = {"name":"小明"}
    get_dict_key(info,"age")  # 触发KeyError

三、每日三件事

  1. 今日代码实操完成情况:

    完成 5 组不同业务场景异常捕获案例,覆盖列表索引、字典键读取、除法运算、文件读取、字符串转数字。

  2. 今日踩坑Bug+原因+解决方案:

    今天还真就没报错,真是美好的一天~

  3. GitHub当日代码仓库地址:Day01 异常Demo

四、今日优质代码习惯

精准捕获细分异常

首先有一种低效的写法,只使用except返回报错,不便于排查错误,于是:

lst = [1,2,3]
try:
    print(lst[10])
except:
    print("出错了")

一种更好的写法诞生了:

lst = [1,2,3]
try:
    print(lst[10])
except IndexError as err:
    print(f"列表索引越界,错误详情:{err}")

技术的路,没有捷径。这篇文字是一个起点。阅读量高低不重要,每一次记录,都是在为未来的自己铺路。路虽远,行则将至。继续写,别停。共勉。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐