Day01 AI智能体筑基打卡
当 Python 首次登顶 TIOBE 榜首、取代霸榜多年的 Java,AI 时代的编程版图已然改写。语法易学只是入场券,真正的分水岭在于智能体应用开发中的落地能力。无论你是在校园里学着与现实脱节的旧知识,还是身处传统前后端领域面临被替代的焦虑——这个系列不绕弯子、不讲废话,只聚焦那些真正会卡住你的痛点,记录一步步踩坑与补全认知的过程。
AI 浪潮下,我们都是摸着石头过河的同行者。与其被焦虑裹挟,不如把学习日常摊开来,一起查缺补漏、扎实成长。希望这些记录能陪你在这场技术变革中,走得更稳、更远。
一、今日学习内容
规范
PEP8编码规范
-
缩进规范:
统一使用4 个空格缩进,禁止 Tab 与空格混用(一直爆红找不到原因,可以全局格式化)
函数、循环、判断内部代码强制缩进。
-
命名规范:
- 变量、函数:蛇形命名法 user_name / get_data(),全小写 + 下划线分割
- 类:大驼峰 UserInfoRecord,每个单词首字母大写
- 常量:全大写 MAX_RETRY_TIMES = 10
-
注释书写规范:
-
行内注释:代码后方空两格再写#,用于简短说明单行逻辑
-
块注释:单独一行#开头,描述下方整块代码功能
-
函数 / 类文档注释:三引号"“” “”",说明入参、返回值、功能
-
基础(异常)
异常就是程序运行过程中出现的错误,它会中断程序的正常执行流程,保证数据和逻辑的正确性。
异常有捕获异常和主动抛出异常之分。
异常捕获(try…except…else…finally):(为了程序不崩,接住错误)
try-except-else-finally 异常捕获基础结构:
try:
可能出现异常的业务代码1
可能出现异常的业务代码2
...
except [异常类型 as 变量名]: # 把异常报错装进变量,便于查看具体原因
出现异常时的预案
...
else: # 没有发生任何异常时才执行
...
finally: # 无论如何都会执行,释放资源
...
注:try…finally 是一种异常处理结构,其中的 finally 子句用于定义 无论是否发生异常,都会被执行 的清理/资源释放代码(不常用)。
注: 把**“没有异常时才该做的事”**放进 else,可以让 try 块里只放“高危代码”,逻辑更干净。
区分不同报错:
Exception:兜底异常,是常见异常的父类,可以承接所有异常情况。
| IndexError | 下标越界 | “列表就那么长,你指太远了” |
| KeyError | 键不存在 | “字典里没这个标签” |
| ValueError | 值错误 | “内容是垃圾,转不了数字” |
| TypeError | 类型错误 | “字符串和数字别瞎拼凑” |
| NameError | 名字未定义 | “变量名拼错了或没赋值” |
| AttributeError | 属性不存在 | “对象身上没这件衣服(属性)” |
| ZeroDivisionError | 除以零 | “别跟数学规则对着干” |
异常传递就是异常在函数调用中层层上报的过程,直到有人处理它,或者程序崩溃。
主动抛出异常(raise):(为了更好的实现业务逻辑,回报上层代码处理)
有时候,Python 自己不会报错,但业务逻辑不允许。这时候你需要主动 raise(抛出)异常。
raise 异常类型("错误描述信息")
这时候,一些逻辑问题就可以通过异常抛出来解决,而不是单纯的print一句,“借阅失败,图书数量已达上限!”
这样做的好处是:raise 可以通过 try…except 被精准捕获,让上层代码判断执行失败,从而决定下一步操作,提高了代码的健壮性。
自定义业务异常(最优雅):(俺们这群敲代码的不就图个优雅嘛!)
Python 内置的异常(如 ValueError、TypeError)太泛了,无法精准表达业务错误。这时候我们可以自定义异常类。
# 自定义异常:只需继承 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
三、每日三件事
今日代码实操完成情况:
完成 5 组不同业务场景异常捕获案例,覆盖列表索引、字典键读取、除法运算、文件读取、字符串转数字。
今日踩坑Bug+原因+解决方案:
今天还真就没报错,真是美好的一天~
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}")
技术的路,没有捷径。这篇文字是一个起点。阅读量高低不重要,每一次记录,都是在为未来的自己铺路。路虽远,行则将至。继续写,别停。共勉。

