1. 项目概述:打造个性化天气问候程序
这个Python小项目特别适合编程初学者和AI课程学员练手,它能根据用户输入的名字和城市,生成带有彩色显示的个性化问候语,并附上当地的实时天气信息。我在教授Python入门课程时,发现这类结合实用功能和视觉效果的案例最能激发学员兴趣。
程序的核心价值在于:
- 掌握基础输入输出操作
- 学习调用第三方API获取实时数据
- 实现终端彩色文本输出
- 构建完整的命令行交互流程
- 理解异常处理机制
2. 核心功能拆解与技术选型
2.1 用户信息收集模块
python复制def get_user_info():
"""收集用户姓名和城市信息"""
print("\033[1;36m" + "="*40 + "\033[0m")
name = input("\033[1;33m请输入您的名字:\033[0m")
city = input("\033[1;33m请输入您所在的城市:\033[0m")
return name, city
关键点说明:
- 使用标准input()函数获取用户输入
- ANSI转义码实现彩色提示(\033[1;36m为青色,\033[1;33m为黄色)
- 函数返回元组形式的数据,便于后续处理
2.2 天气数据获取实现
推荐使用免费的OpenWeatherMap API:
python复制import requests
def get_weather(city):
API_KEY = "your_api_key" # 需自行申请
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)
data = response.json()
if response.status_code == 200:
weather = {
'temp': data['main']['temp'],
'desc': data['weather'][0]['description'],
'humidity': data['main']['humidity']
}
return weather
else:
return None
except Exception as e:
print(f"\033[1;31m获取天气数据出错:{e}\033[0m")
return None
注意事项:
- 必须到OpenWeatherMap官网申请免费API Key
- 使用requests库简化HTTP请求
- 设置units=metric获取摄氏温度
- 添加完善的异常处理机制
- API有调用频率限制(免费版60次/分钟)
2.3 彩色输出与格式化展示
python复制def display_greeting(name, city, weather):
"""显示彩色个性化问候"""
colors = {
'header': '\033[1;35m', # 品红
'name': '\033[1;32m', # 绿色
'city': '\033[1;34m', # 蓝色
'weather': '\033[1;33m', # 黄色
'reset': '\033[0m' # 重置颜色
}
greeting = f"""
{colors['header']}✨ 个性化天气问候 ✨{colors['reset']}
您好,{colors['name']}{name}{colors['reset']}!
您所在的城市 {colors['city']}{city}{colors['reset']} 当前天气:
{colors['weather']}• 温度:{weather['temp']}°C
• 天气状况:{weather['desc']}
• 湿度:{weather['humidity']}%{colors['reset']}
祝您有愉快的一天!
"""
print(greeting)
设计要点:
- 使用字典管理颜色代码,提高可维护性
- 多行f-string实现复杂格式化
- 每个颜色使用后及时重置
- 采用项目符号(•)提升可读性
3. 完整实现与代码整合
3.1 主程序逻辑
python复制import requests
from datetime import datetime
def main():
print("\033[1;36m" + "="*40)
print(" 个性化天气问候程序")
print("="*40 + "\033[0m")
name, city = get_user_info()
weather = get_weather(city)
if weather:
display_greeting(name, city, weather)
else:
print("\033[1;31m无法获取天气信息,请检查城市名称或稍后再试\033[0m")
print("\033[1;36m" + "="*40)
print(f" 程序执行于 {datetime.now().strftime('%Y-%m-%d %H:%M')}")
print("="*40 + "\033[0m")
if __name__ == "__main__":
main()
3.2 依赖安装与配置
创建requirements.txt文件:
code复制requests==2.28.1
python-dotenv==0.21.0
建议使用.env文件管理API密钥:
ini复制# .env文件内容
OWM_API_KEY=your_actual_api_key
修改get_weather函数读取环境变量:
python复制from dotenv import load_dotenv
import os
load_dotenv()
def get_weather(city):
API_KEY = os.getenv("OWM_API_KEY")
# 其余代码不变...
4. 进阶优化与功能扩展
4.1 异常处理增强
python复制def get_user_info():
while True:
try:
name = input("\033[1;33m请输入您的名字(2-20个字符):\033[0m")
if not 2 <= len(name) <= 20:
raise ValueError("名字长度应在2-20个字符之间")
city = input("\033[1;33m请输入您所在的城市:\033[0m")
if not city.strip():
raise ValueError("城市不能为空")
return name, city
except ValueError as e:
print(f"\033[1;31m输入错误:{e}\033[0m")
4.2 多语言支持
python复制LANGUAGES = {
'en': {
'name_prompt': "Enter your name: ",
'city_prompt': "Enter your city: ",
'greeting': "Hello, {name}!",
'weather_info': "Current weather in {city}:"
},
'zh': {
'name_prompt': "请输入您的名字:",
'city_prompt': "请输入您所在的城市:",
'greeting': "您好,{name}!",
'weather_info': "{city}当前天气:"
}
}
def set_language():
print("请选择语言 / Select language:")
print("1. 中文")
print("2. English")
choice = input("选择 / Choice (1/2): ")
return 'zh' if choice == '1' else 'en'
4.3 天气图标显示
使用Unicode符号增强视觉效果:
python复制WEATHER_ICONS = {
'clear': '☀️',
'clouds': '☁️',
'rain': '🌧️',
'thunderstorm': '⛈️',
'snow': '❄️',
'mist': '🌫️'
}
def get_weather_icon(desc):
desc = desc.lower()
if 'clear' in desc:
return WEATHER_ICONS['clear']
elif 'cloud' in desc:
return WEATHER_ICONS['clouds']
# 其他条件判断...
else:
return '🌈'
5. 教学实践中的常见问题
5.1 API调用失败排查
常见错误及解决方案:
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
| 401 Unauthorized | API密钥无效/未设置 | 检查.env文件配置 |
| 404 Not Found | 城市名称错误 | 确认城市英文拼写 |
| 429 Too Many Requests | API调用超限 | 降低调用频率或升级套餐 |
| 连接超时 | 网络问题 | 检查代理设置或重试 |
5.2 颜色显示异常
终端兼容性问题处理:
- Windows系统需启用ANSI支持:
python复制import os os.system('') # 初始化ANSI支持 - 备用颜色方案(兼容基本终端):
python复制if os.name == 'nt': # Windows系统 colors = {'name': '', 'reset': ''} # 不使用颜色 else: colors = {'name': '\033[1;32m', 'reset': '\033[0m'}
5.3 输入验证强化
python复制import re
def validate_city(city):
"""验证城市名称格式"""
pattern = r'^[a-zA-Z\u4e00-\u9fa5\s\-]+$'
return re.match(pattern, city) is not None
def validate_name(name):
"""验证姓名格式"""
pattern = r'^[a-zA-Z\u4e00-\u9fa5]{2,20}$'
return re.match(pattern, name) is not None
6. 项目部署与分享
6.1 打包为可执行文件
使用PyInstaller创建独立exe:
- 安装PyInstaller:
bash复制
pip install pyinstaller - 打包命令:
bash复制
pyinstaller --onefile --windowed weather_greeter.py - 添加图标(可选):
bash复制
pyinstaller --onefile --windowed --icon=app.ico weather_greeter.py
6.2 创建简易GUI版本
使用Tkinter基础实现:
python复制import tkinter as tk
from tkinter import messagebox
class WeatherApp:
def __init__(self):
self.window = tk.Tk()
self.window.title("天气问候程序")
tk.Label(text="姓名:").grid(row=0, column=0)
self.name_entry = tk.Entry()
self.name_entry.grid(row=0, column=1)
tk.Label(text="城市:").grid(row=1, column=0)
self.city_entry = tk.Entry()
self.city_entry.grid(row=1, column=1)
tk.Button(text="获取问候", command=self.show_greeting).grid(row=2, columnspan=2)
def show_greeting(self):
name = self.name_entry.get()
city = self.city_entry.get()
weather = get_weather(city)
if weather:
msg = f"{name},{city}当前天气:\n"
msg += f"温度:{weather['temp']}°C\n"
msg += f"状况:{weather['desc']}\n"
msg += f"湿度:{weather['humidity']}%"
messagebox.showinfo("天气问候", msg)
else:
messagebox.showerror("错误", "无法获取天气信息")
def run(self):
self.window.mainloop()
6.3 课程教学建议
-
分阶段教学:
- 第一阶段:基础输入输出+字符串格式化
- 第二阶段:API调用与JSON数据处理
- 第三阶段:异常处理与输入验证
- 第四阶段:界面美化与功能扩展
-
典型课时安排:
课时 内容 实践任务 1 Python基础语法回顾 完成姓名输入输出 2 字符串格式化与颜色 实现彩色问候语 3 HTTP请求与API调用 获取并解析天气数据 4 异常处理与输入验证 增强程序健壮性 5 项目整合与扩展 添加新功能 -
评估标准:
- 基础功能实现(50%)
- 代码规范与注释(20%)
- 异常处理完善度(15%)
- 创新扩展功能(15%)
这个项目在实际教学中取得了很好的效果,学员不仅能掌握Python基础,还能立即看到自己创建的实用工具。建议在教学过程中鼓励学员尝试不同的扩展方向,比如添加更多天气指标、实现历史天气查询、或者整合到更大的项目中。