1. 项目概述:打造个性化天气问候程序
这个Python小项目非常适合编程初学者和AI课程学员练手,它能根据用户输入的名字和城市,生成带有彩色显示的个性化问候语,并附加当地实时天气信息。我去年在教授Python入门课时就采用了这个案例,学生们反馈这种结合实用功能和视觉效果的练习特别能激发学习兴趣。
程序的核心逻辑并不复杂,但涉及多个Python基础知识点:用户输入处理、API调用、字符串格式化、终端色彩控制等。通过这个项目,学员可以掌握如何将分散的知识点串联成一个完整的小应用。下面我会拆解每个环节的实现细节,并分享教学过程中总结的优化技巧。
2. 核心功能拆解与技术选型
2.1 用户信息收集模块
python复制def get_user_info():
"""收集用户姓名和城市信息"""
print("\033[1;36m" + "="*40 + "\033[0m")
name = input("\033[1;33m请输入您的姓名:\033[0m").strip()
city = input("\033[1;33m请输入所在城市:\033[0m").strip()
return name, city
这里使用了ANSI转义码实现彩色提示(\033[1;36m是青色,\033[1;33m是黄色)。实际教学中发现,很多初学者会忽略.strip()去空格的操作,导致后续API请求失败。建议在输入后立即添加验证:
python复制while not name:
print("\033[1;31m姓名不能为空!\033[0m")
name = input("\033[1;33m请重新输入姓名:\033[0m").strip()
2.2 天气数据获取方案
推荐使用免费的OpenWeatherMap API(免费套餐足够教学使用)。注册后获取API key,建议将其存储在环境变量中而非代码里:
bash复制# 在终端设置环境变量
export OWM_API_KEY='your_api_key_here'
API请求示例:
python复制import os
import requests
def get_weather(city):
api_key = os.getenv("OWM_API_KEY")
base_url = "http://api.openweathermap.org/data/2.5/weather"
try:
params = {'q': city, 'appid': api_key, 'units': 'metric'}
response = requests.get(base_url, params=params)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"\033[1;31m天气查询失败: {e}\033[0m")
return None
教学提示:建议提前准备几个城市的静态天气数据JSON文件,当API不可用时作为fallback方案,避免课堂演示时因网络问题卡壳。
3. 完整实现与效果优化
3.1 问候语生成逻辑
结合天气数据生成动态问候语:
python复制def generate_greeting(name, weather_data):
if not weather_data:
return f"你好{name}!今天无法获取天气信息"
temp = weather_data['main']['temp']
weather = weather_data['weather'][0]['description']
# 根据温度选择问候语
if temp > 30:
remark = "记得多喝水哦!"
elif temp > 20:
remark = "今天天气真不错!"
else:
remark = "注意保暖~"
return f"""
\033[1;35m你好 {name}!\033[0m
当前{weather_data['name']}天气:{weather}
温度:{temp}°C
{remark}
"""
3.2 终端颜色增强方案
除了基本的ANSI颜色代码,可以使用colorama库实现跨平台兼容:
python复制from colorama import init, Fore, Back, Style
init() # Windows下需要初始化
def colored_print(text, color=Fore.WHITE, bg=Back.RESET):
print(f"{color}{bg}{text}{Style.RESET_ALL}")
推荐的颜色组合方案:
- 姓名:洋红色(Fore.MAGENTA)
- 城市:青色(Fore.CYAN)
- 温度:动态颜色(高于30度红色,低于10度蓝色)
- 天气描述:黄色(Fore.YELLOW)
4. 教学实践中的常见问题
4.1 API调用相关错误
-
401 Unauthorized错误
- 检查API key是否正确
- 确认是否设置了环境变量
- 免费账号每小时60次调用限制
-
404 City Not Found
- 检查城市名拼写
- 尝试英文城市名
- 添加国家代码(如"Beijing,CN")
4.2 终端显示问题
-
颜色不生效
- Windows需安装colorama
- 确保终端支持ANSI颜色(现代终端基本都支持)
- 检查转义码是否完整(必须以\033[0m结束)
-
中文乱码
- 文件开头添加编码声明:# -- coding: utf-8 --
- 确保终端使用UTF-8编码
5. 项目扩展方向
在基础功能实现后,可以引导学员尝试以下扩展:
-
多语言支持
- 使用googletrans库翻译问候语
- 根据系统语言自动切换
-
可视化图表
- 使用matplotlib绘制温度趋势图
- 显示天气图标(ASCII art或unicode符号)
-
定时提醒功能
- 结合schedule库定时推送天气
- 添加异常天气预警
-
GUI版本
- 使用tkinter或PyQt创建窗口程序
- 添加地理位置自动检测
这个项目的魅力在于它的可扩展性。去年有个学生在此基础上开发了桌面小工具,后来甚至整合到了智能家居系统中。教学时建议先确保核心功能稳定,再鼓励学生发挥创意自由扩展。
6. 完整代码参考
python复制#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import requests
from colorama import init, Fore, Back, Style
init()
def get_user_info():
"""收集用户信息并验证"""
print(Fore.CYAN + "="*40 + Style.RESET_ALL)
while True:
name = input(Fore.YELLOW + "请输入您的姓名:" + Style.RESET_ALL).strip()
if name:
break
print(Fore.RED + "姓名不能为空!" + Style.RESET_ALL)
while True:
city = input(Fore.YELLOW + "请输入所在城市:" + Style.RESET_ALL).strip()
if city:
break
print(Fore.RED + "城市不能为空!" + Style.RESET_ALL)
return name, city
def get_weather(city):
"""获取天气数据"""
api_key = os.getenv("OWM_API_KEY")
if not api_key:
print(Fore.RED + "请设置OWM_API_KEY环境变量" + Style.RESET_ALL)
return None
base_url = "http://api.openweathermap.org/data/2.5/weather"
try:
params = {'q': city, 'appid': api_key, 'units': 'metric', 'lang': 'zh_cn'}
response = requests.get(base_url, params=params, timeout=5)
response.raise_for_status()
return response.json()
except Exception as e:
print(Fore.RED + f"天气查询失败: {e}" + Style.RESET_ALL)
return None
def generate_greeting(name, weather_data):
"""生成个性化问候"""
if not weather_data:
return f"{Fore.RED}无法获取天气信息{Style.RESET_ALL}"
city = weather_data.get('name', '未知城市')
temp = weather_data['main']['temp']
weather = weather_data['weather'][0]['description']
# 温度颜色
temp_color = Fore.RESET
if temp > 30:
temp_color = Fore.RED
remark = "记得多喝水哦!"
elif temp > 20:
temp_color = Fore.GREEN
remark = "今天天气真不错!"
else:
temp_color = Fore.BLUE
remark = "注意保暖~"
return f"""
{Fore.MAGENTA}你好 {name}!{Style.RESET_ALL}
当前{Fore.CYAN}{city}{Style.RESET_ALL}天气:{Fore.YELLOW}{weather}{Style.RESET_ALL}
温度:{temp_color}{temp}°C{Style.RESET_ALL}
{remark}
"""
def main():
name, city = get_user_info()
weather_data = get_weather(city)
greeting = generate_greeting(name, weather_data)
print(greeting)
if __name__ == "__main__":
main()
在教学中使用这个案例时,建议分阶段实现:
- 先完成基础输入输出
- 添加颜色显示
- 整合天气API
- 最后处理各种异常情况
这种渐进式教学法能让学员更好地理解每个模块的作用,避免一次性面对太多概念产生畏难情绪。