恭喜你完成了第二天的实战挑战!你已经亲手创建了第一个交互式游戏,并初识了函数和列表。今天,我们将深入探索Python中处理数据的核心工具,并学习如何让程序在面对错误时依然“优雅”运行。
今日目标:玩转字符串 & 字典 & 让程序更健壮
项目实战:开发一个“个性化名言图书馆”
我们将编写一个程序:程序内置几条激励名言,用户可以输入自己的名字和心情,程序会随机返回一条专属名言,并将用户的“点播记录”(包含日期、名字、心情和名言)保存起来。用户可以随时查看所有历史记录。
这个项目将串联起第二天的列表、函数,并重点引入字典、字符串方法和异常处理。
1. 项目分析与知识准备
数据结构升级:使用字典 (Dict) 来表示每条记录的详细信息(日期、名字、心情、名言)。
字符串处理:使用字符串的 split, join, format 等方法,处理用户输入和格式化输出。
异常处理:使用 try...except 防止因用户输入格式错误(比如选择时输入字母)导致程序崩溃。
模块复用:再次使用 random 模块随机选择名言,并引入 datetime 模块获取当前时间。
2. 编写代码:分步实现
打开编辑器,新建文件 quote_library.py,分步输入以下代码。
第一步:导入模块并准备数据
python
import randomfrom datetime import datetime# 名言库(列表)quotes =["专注是成功的秘诀。","行动是治愈恐惧的良药。","每一天都是一个新的开始。","不要等待机会,而要创造机会。","坚持下去,不是因为坚强,而是因为别无选择。"]# 历史记录库(这是一个列表,里面的每个元素将是一个字典)history =[]
第二步:定义核心函数
我们将用函数来组织不同的功能。
python
defget_random_quote():"""随机返回一条名言"""return random.choice(quotes)defsave_record(name, mood, quote):"""保存一条点播记录到history列表"""# 获取当前时间,并格式化为字符串,例如:2026-03-01 14:30 now = datetime.now().strftime("%Y-%m-%d %H:%M")# 创建一个字典来存放一条完整记录 record ={"date": now,"name": name,"mood": mood,"quote": quote} history.append(record)print("✅ 记录已保存!")第三步:编写主程序逻辑(引入异常处理)
这是程序的主要流程,我们将在一个 while 循环中提供菜单,并使用 try...except 来处理用户输入错误。
python
defmain():print("🌟 欢迎来到个性化名言图书馆 🌟")whileTrue:# 显示菜单print("\n请选择功能:")print("1. 获取专属名言")print("2. 查看历史记录")print("3. 退出程序") choice =input("请输入你的选择 (1/2/3):")# ----- 功能1:获取名言 -----if choice =='1':try:# 获取用户输入,并使用strip()去除首尾空格 name =input("请输入你的名字:").strip()# 简单验证:名字不能为空if name =='':print("❌ 名字不能为空哦。")continue mood =input("你今天的心情怎么样? (例如:开心、迷茫、充满干劲): ").strip()# 获取随机名言 selected_quote = get_random_quote()# 使用f-string和字符串方法,创建个性化信息 personalized_message =f"✨ {name} 同学,看到你{mood}的样子,送你一句话:\"{selected_quote}\""print("\n"+"="*50)print(personalized_message)print("="*50)# 保存记录 save_record(name, mood, selected_quote)except Exception as e:# 如果在try代码块中发生任何未预料到的错误,会执行这里print(f"❌ 处理时出现了一个意外错误:{e}")# ----- 功能2:查看历史记录 -----elif choice =='2':ifnot history:# 如果history列表为空print("📭 目前还没有任何历史记录。")else:print("\n📜 历史点播记录:")# 遍历history列表,每条记录record是一个字典for i, record inenumerate(history,1):# enumerate可以同时获取序号和内容# 使用字典的键来获取值,并用字符串方法format格式化输出 line ="{0}. [{1}] {2} ({3}) 点播了:{4}".format( i, record['date'], record['name'], record['mood'], record['quote'])print(line)# ----- 功能3:退出程序 -----elif choice =='3':print("👋 谢谢使用,再见!")break# ----- 处理无效输入 -----else:print("❌ 无效的选择,请输入 1、2 或 3。")# 确保只有直接运行这个脚本时才会执行main函数if __name__ =="__main__": main()3. 运行与测试
运行你的代码!尝试输入名字和心情,获取几条名言,然后查看历史记录。故意输入空白名字或错误的菜单选项,看看程序如何响应。
今日核心知识拆解
完成项目后,我们来深入理解今天用到的几个关键概念。
1. 字典 (Dict):有标签的“收纳盒”
第二天的列表像一排按顺序编号的盒子(索引0,1,2…),而字典则像每个盒子都贴了独特的标签(键)。
python
# 列表:通过位置编号访问student_list =["小明",18,"北京"]print(student_list[1])# 输出 18,但必须记住1号位置是年龄# 字典:通过有意义的标签(键)访问student_dict ={"name":"小明","age":18,"city":"北京"}print(student_dict["age"])# 输出 18,非常清晰!print(student_dict.get("age"))# 使用get方法更安全,键不存在时返回None在项目中,我们用字典 {"date": now, "name": name, ...} 来组织一条记录,让数据含义一目了然。
2. 字符串方法:文本的“瑞士军刀”
Python的字符串自带许多实用方法,今天我们用了:
python
# .format() 示例print("我叫{0},今年{1}岁。".format("小明",18))当然,f-string (f"...") 是更简洁的选择,两者都很好用。
3. 异常处理:程序的“安全网”
代码中用 try...except 包裹了可能出错的输入和处理部分。当用户可能输入非数字(虽然本项目没用)或发生其他意外时,程序不会直接崩溃,而是执行 except 块中的代码,优雅地给出提示并继续运行。
python
try:# 尝试执行可能出错的代码 number =int(input("请输入一个数字:"))except:# 如果出错,执行这里的代码print("输入无效,这不是一个数字!")# 无论是否出错,程序都会从这里继续执行今日总结与后续建议
恭喜你,你已经成功驾驭了更复杂的数据和用户交互!今天你:
开发了更实用的“名言图书馆”项目,它能够记录并展示历史数据。
深入学习了核心数据结构——字典,明白了如何用键值对组织关联数据。
玩转了字符串的实用方法,学会了清理和格式化文本。
为程序加上了“安全网”——异常处理,让程序更健壮。
明日的学习方向:
你已经从单纯的代码执行者,变成了一个能设计数据结构和处理异常的程序设计者。这个转变非常关键!如果在尝试代码或理解新概念时有任何疑问,随时和我讨论。