大一新生 × AI Coding:从本地到云端,我如何用DeepSeek做出一个天气查询助手
大一新生借助DeepSeek,从零开始调用免费天气API,用不到100行Python代码做出一个命令行天气查询助手。本文完整记录从环境搭建、代码生成到调试优化的全过程,并附上“中文城市名查不到”的真实踩坑与解决方案,代码复制即用,零基础友好。
·
前言 如果你是从上一篇《大一新生 × AI Coding:从游戏到记账本,我如何用DeepSeek写出第二个Python项目》过来的,那么恭喜你,你已经掌握了逻辑判断和数据持久化两项核心技能。 但说实话,前两个项目都有一个共同的“局限”——它们的数据都是自己玩自己的。猜数字的答案是自己随机生成的,记账本的数据是存在本地文件里的。它们和互联网这个巨大的数据世界,还没有产生任何连接。 我一直在想:能不能写一个程序,让它主动去互联网上“抓”数据回来? 于是,就有了这第三个实践小项目——天气查询助手。 这篇文章会记录我如何借助 DeepSeek,从零开始理解 API 的概念,并成功调用免费的天气服务,最终做出一个能查询全球城市实时天气的命令行工具。全程不超过100行代码,零基础也能看懂,代码依然复制即用。 一、项目功能说明 这个命令行天气查询助手支持以下功能: 1. 输入城市名(中英文都行),自动联网获取实时天气 2. 显示当前温度、天气状况(晴天、小雨、多云等) 3. 显示湿度和风速 4. 支持连续查询多个城市,输入 quit 退出 5. 如果城市名输错或网络不好,程序会友好提示而不是直接崩溃 运行起来的效果长这样: ☀️ 欢迎使用天气查询助手! ☀️ 输入城市名即可查询实时天气。输入 'quit' 退出。 请输入您要查询的城市名 (输入 'quit' 退出程序): 北京 查询中,请稍候... ------------------------------ 城市: 北京 温度: 15.3°C 天气: 局部多云 湿度: 45% 风速: 12.3 km/h ------------------------------ 是不是有点像一个真正的天气 App 的命令行版本?实际上它的核心代码同样不到100行。 二、实现思路:从“本地数据”到“云端数据” 这次的项目和前两个最大的不同是:我们需要和互联网上的服务器“对话”。 这个“对话”在编程里有一个专业名词,叫 API 调用。 你可以把 API 想象成一个线上的“自动售货机”: 我们不需要知道售货机里面怎么运作,只要按照它的规则投币(发送 HTTP 请求),它就会把商品(天气数据)吐出来给我们。 整个流程是这样的: 用户输入城市名 → 程序把城市名转成经纬度(地理编码 API) → 用经纬度去问天气 API → 拿到 JSON 格式的天气数据 → 解析并友好地打印出来 这个项目做完,你就正式迈入“能写联网程序”的行列了。 三、第一步:安装 requests 库 前两个项目只用到了 Python 自带的库,但这次我们需要一个叫 requests 的第三方库来发送网络请求。 打开命令提示符(Win+R 输入 cmd),输入以下命令然后回车: pip install requests 如果看到 Successfully installed 的字样,说明安装成功。四、第二步:选择免费的天气 API 我一开始完全不知道去哪找天气数据,于是问 DeepSeek: “有没有免费、不用注册、适合新手的天气 API?” DeepSeek 推荐了 Open-Meteo,一个开源免费的天气 API。它的优点是: - 完全免费,无需注册,无需 API 密钥 - 全球天气数据覆盖,中英文城市都支持 - 数据格式简洁,非常适合新手 这一步的启发是:AI 不仅能帮你写代码,还能帮你做技术选型。不知道怎么选工具的时候,直接问它就行。
五、第三步:创建项目文件 和前两次一样,我们需要新建一个 .py 文件。 1. 在桌面右键 → 新建 → 文本文档 2. 确保能看到文件扩展名(如果看不到 .txt,打开任意文件夹 → 顶部“查看” → 勾选“文件扩展名”) 3. 把 新建文本文档.txt 重命名为 weather_helper.py 注意:后缀一定要从 .txt 变成 .py,系统提示“改变扩展名可能导致文件不可用”,点“是”就行。
六、第四步:向 DeepSeek 提问,生成初版代码 打开 DeepSeek,选择专家模式,把下面这段话复制进去: 我想用 Python 写一个命令行天气查询程序,使用 Open-Meteo API,用户输入城市名,程序输出当前温度、天气描述、湿度和风速。代码要附带详细注释,适合大一新生阅读。
DeepSeek 会返回一段完整的代码。全选复制,然后右键 weather_helper.py → 打开方式 → 记事本,把代码粘贴进去,Ctrl+S 保存。
七、第五步:运行演示 在桌面空白处按住 Shift 键,点击鼠标右键,选择“在此处打开 PowerShell 窗口”,输入: python weather_helper.py (城市名) 比如,python weather_helper.py wuhan

八、第六步:运行并调试——和 DeepSeek 协作优化 我满怀期待地运行了 python weather_helper.py,输入“北京”,结果…… 程序确实返回了数据,但有两个问题: 1. 有时候输入中文城市名查不到。 2. 输出的天气是数字代码(比如 0、61),完全看不懂什么意思。于是我把问题描述给 DeepSeek: 中文城市名有时候查不到,而且天气显示的是数字代码,能不能优化一下? DeepSeek 立刻给出了改进方案: 1. 增加一个地理编码 API 调用,先把城市名转成经纬度,再用经纬度去查天气。这样准确率大大提高。 2. 添加一个 weather_map 字典,把天气代码映射成中文描述(“晴天”、“小雨”、“多云”等)。
我把新代码替换进去,再运行,完美! 整个过程中,我基本就是: 复制 → 运行 → 发现问题 → 把问题丢给 DeepSeek → 复制新代码 → 再运行 循环了两三次,程序就完全符合预期了。这种“AI 帮你 debug”的体验,比一个人对着报错信息干瞪眼舒服太多了。 九、第七步:完整代码(复制即用) 以下是经过我亲测、可直接运行的完整代码。你可以新建一个 Python 文件,比如 weather_helper.py,把下面的内容全部复制进去。 (下面这段是代码,粘贴到 CSDN 后,请用鼠标选中它,然后点击编辑器工具栏上的「代码块」按钮,选择 Python 语言) import requests def get_weather_description(weather_code): """根据Open-Meteo的WMO天气代码返回简单描述""" weather_map = { 0: "晴天", 1: "晴朗", 2: "局部多云", 3: "多云", 45: "有雾", 48: "有雾", 51: "小雨", 53: "中雨", 55: "中雨", 61: "小雨", 63: "中雨", 65: "大雨", 71: "小雪", 73: "中雪", 75: "中雪", 80: "阵雨", 81: "阵雨", 82: "大雨", 85: "阵雪", 95: "雷暴", 96: "雷暴", 99: "雷暴" } return weather_map.get(weather_code, "未知") def fetch_weather(city_name): """ 根据城市名获取天气数据,并返回一个包含关键信息的字典 """ # 1. 获取地理坐标 geo_url = f"https://geocoding-api.open-meteo.com/v1/search?name={city_name}" try: geo_response = requests.get(geo_url, timeout=10) geo_response.raise_for_status() geo_data = geo_response.json() if not geo_data.get("results"): print(f"❌ 错误:未找到名为 '{city_name}' 的城市。") return None location = geo_data["results"][0] latitude = location["latitude"] longitude = location["longitude"] full_city_name = location["name"] + (", " + location["admin1"] if "admin1" in location else "") except requests.exceptions.RequestException as e: print(f"❌ 网络请求失败,获取坐标时出错: {e}") return None except Exception as e: print(f"❌ 解析坐标数据时出错: {e}") return None # 2. 获取天气数据 weather_url = f"https://api.open-meteo.com/v1/forecast" params = { "latitude": latitude, "longitude": longitude, "current_weather": "true", "hourly": "relativehumidity_2m", } try: weather_response = requests.get(weather_url, params=params, timeout=10) weather_response.raise_for_status() weather_data = weather_response.json() current_weather = weather_data["current_weather"] temperature = current_weather["temperature"] wind_speed = current_weather["windspeed"] weather_code = current_weather["weathercode"] # 从hourly数据中提取当前湿度 (取第一个值作为近似) humidity = weather_data["hourly"]["relativehumidity_2m"][0] weather_description = get_weather_description(weather_code) return { "city": full_city_name, "temperature": temperature, "description": weather_description, "humidity": humidity, "wind_speed": wind_speed } except requests.exceptions.RequestException as e: print(f"❌ 网络请求失败,获取天气时出错: {e}") return None except KeyError as e: print(f"❌ 解析天气数据时出错,缺少字段: {e}") return None except Exception as e: print(f"❌ 发生未知错误: {e}") return None def main(): """主程序,负责用户交互和流程控制""" print("☀️ 欢迎使用天气查询助手! ☀️") print("输入城市名即可查询实时天气。输入 'quit' 退出。") while True: city_input = input("\n请输入您要查询的城市名 (输入 'quit' 退出程序): ").strip() if city_input.lower() == 'quit': print("感谢使用,再见!") break if not city_input: print("❌ 城市名不能为空,请重新输入。") continue print("查询中,请稍候...") weather_info = fetch_weather(city_input) if weather_info: print("\n" + "-" * 30) print(f"城市: {weather_info['city']}") print(f"温度: {weather_info['temperature']}°C") print(f"天气: {weather_info['description']}") print(f"湿度: {weather_info['humidity']}%") print(f"风速: {weather_info['wind_speed']} km/h") print("-" * 30) if __name__ == "__main__": main() (代码块结束) 十、第八步:运行演示 在桌面空白处按住 Shift 键,点击鼠标右键,选择“在此处打开 PowerShell 窗口”,输入: python weather_helper.py 程序启动后,我测试了几个城市: - 输入“北京” → 显示北京天气 - 输入“上海” → 显示上海天气 - 输入“london” → 显示伦敦天气(支持英文) - 输入一个不存在的城市名“abc” → 友好提示“未找到名为 'abc' 的城市” - 输入 quit → 退出程序 所有功能都正常!而且每次查询都是实时的,数据来自互联网,不是写死在代码里的。
十一、我学到了什么 这个项目做完,我的技能树又点亮了好几个新节点: - API 概念:理解了什么是 API,以及如何用 Python 调用它 - requests 库:会发送 GET 请求,会处理响应 - JSON 数据解析:知道怎么从一大坨返回数据里提取我想要的那几个字段 - 异常处理:用 try...except 让程序在网络出问题时不会直接崩溃 - 真实世界的编程思维:程序的数据不一定都在本地,互联网上到处是可以调用的“数据接口” 更重要的是,我开始意识到编程的边界比我想象的要大得多。只要会调用 API,我就能获取天气、汇率、新闻、电影信息……能做的东西一下子多了几百倍。 十二、三个项目复盘:我走过的路 项目 核心技能 数据来源 代码行数 猜数字游戏 变量、循环、条件判断 程序内部生成 ~50行 命令行记账本 列表、字典、文件读写、JSON 本地文件 ~100行 天气查询助手 网络请求、API调用、JSON解析 互联网 ~100行 这三个项目做下来,我发现自己已经从“对着黑框框发怵”变成“敢写、敢跑、敢改”的状态了。 AI Coding 对我来说,不是偷懒,而是让我能跳过那些让人劝退的语法细节,直接去理解“程序是怎么解决问题的”。 十三、下一步计划 三个命令行小项目做完,我打算挑战一个有图形界面的程序。 Python 自带一个叫 tkinter 的库,可以做出窗口、按钮、输入框。我打算用它给记账本加一个真正的窗口界面,或者做一个简单的计算器。 等做出来了,我会继续写成第四篇博客。这个系列会一直更新下去,记录我从零开始学编程的每一步。 如果你也照着这篇教程做出了天气查询助手,欢迎在评论区告诉我!遇到了什么问题也可以留言,我们一起讨论。 附录:常见问题排查 Q1:运行时报错 ModuleNotFoundError: No module named 'requests' A1:说明 requests 库没装上。重新在命令行执行 pip install requests 即可。 Q2:输入中文城市名查不到? A2:Open-Meteo 的地理编码 API 对部分中文城市名支持不够完善,可以尝试输入拼音(比如 beijing)或英文名。 Q3:程序能查未来几天的天气吗? A3:Open-Meteo 支持天气预报,但代码需要修改。你可以问 DeepSeek:“请在上面的天气查询代码中增加一个功能:显示未来3天的天气预报。” 本文代码由 DeepSeek 生成,作者已实际运行验证。 AI 声明: 本文由 DeepSeek 辅助生成代码和部分文案,所有步骤均经过本人实际操作验证。 ———————————————— 版权声明:本文为CSDN博主「qinrunlin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qinrunlin/article/details/(发布后会生成)
更多推荐
四、第二步:选择免费的天气 API
我一开始完全不知道去哪找天气数据,于是问 DeepSeek:
“有没有免费、不用注册、适合新手的天气 API?”
DeepSeek 推荐了 Open-Meteo,一个开源免费的天气 API。它的优点是:
- 完全免费,无需注册,无需 API 密钥
- 全球天气数据覆盖,中英文城市都支持
- 数据格式简洁,非常适合新手
这一步的启发是:AI 不仅能帮你写代码,还能帮你做技术选型。不知道怎么选工具的时候,直接问它就行。
五、第三步:创建项目文件
和前两次一样,我们需要新建一个 .py 文件。
1. 在桌面右键 → 新建 → 文本文档
2. 确保能看到文件扩展名(如果看不到 .txt,打开任意文件夹 → 顶部“查看” → 勾选“文件扩展名”)
3. 把 新建文本文档.txt 重命名为 weather_helper.py
注意:后缀一定要从 .txt 变成 .py,系统提示“改变扩展名可能导致文件不可用”,点“是”就行。
六、第四步:向 DeepSeek 提问,生成初版代码
打开 DeepSeek,选择专家模式,把下面这段话复制进去:
我想用 Python 写一个命令行天气查询程序,使用 Open-Meteo API,用户输入城市名,程序输出当前温度、天气描述、湿度和风速。代码要附带详细注释,适合大一新生阅读。
DeepSeek 会返回一段完整的代码。全选复制,然后右键 weather_helper.py → 打开方式 → 记事本,把代码粘贴进去,Ctrl+S 保存。

于是我把问题描述给 DeepSeek:
中文城市名有时候查不到,而且天气显示的是数字代码,能不能优化一下?
DeepSeek 立刻给出了改进方案:
1. 增加一个地理编码 API 调用,先把城市名转成经纬度,再用经纬度去查天气。这样准确率大大提高。
2. 添加一个 weather_map 字典,把天气代码映射成中文描述(“晴天”、“小雨”、“多云”等)。
我把新代码替换进去,再运行,完美!
整个过程中,我基本就是:
复制 → 运行 → 发现问题 → 把问题丢给 DeepSeek → 复制新代码 → 再运行
循环了两三次,程序就完全符合预期了。这种“AI 帮你 debug”的体验,比一个人对着报错信息干瞪眼舒服太多了。
九、第七步:完整代码(复制即用)
以下是经过我亲测、可直接运行的完整代码。你可以新建一个 Python 文件,比如 weather_helper.py,把下面的内容全部复制进去。
(下面这段是代码,粘贴到 CSDN 后,请用鼠标选中它,然后点击编辑器工具栏上的「代码块」按钮,选择 Python 语言)
import requests
def get_weather_description(weather_code):
"""根据Open-Meteo的WMO天气代码返回简单描述"""
weather_map = {
0: "晴天", 1: "晴朗", 2: "局部多云", 3: "多云",
45: "有雾", 48: "有雾", 51: "小雨", 53: "中雨", 55: "中雨",
61: "小雨", 63: "中雨", 65: "大雨", 71: "小雪", 73: "中雪",
75: "中雪", 80: "阵雨", 81: "阵雨", 82: "大雨", 85: "阵雪",
95: "雷暴", 96: "雷暴", 99: "雷暴"
}
return weather_map.get(weather_code, "未知")
def fetch_weather(city_name):
"""
根据城市名获取天气数据,并返回一个包含关键信息的字典
"""
# 1. 获取地理坐标
geo_url = f"https://geocoding-api.open-meteo.com/v1/search?name={city_name}"
try:
geo_response = requests.get(geo_url, timeout=10)
geo_response.raise_for_status()
geo_data = geo_response.json()
if not geo_data.get("results"):
print(f"❌ 错误:未找到名为 '{city_name}' 的城市。")
return None
location = geo_data["results"][0]
latitude = location["latitude"]
longitude = location["longitude"]
full_city_name = location["name"] + (", " + location["admin1"] if "admin1" in location else "")
except requests.exceptions.RequestException as e:
print(f"❌ 网络请求失败,获取坐标时出错: {e}")
return None
except Exception as e:
print(f"❌ 解析坐标数据时出错: {e}")
return None
# 2. 获取天气数据
weather_url = f"https://api.open-meteo.com/v1/forecast"
params = {
"latitude": latitude,
"longitude": longitude,
"current_weather": "true",
"hourly": "relativehumidity_2m",
}
try:
weather_response = requests.get(weather_url, params=params, timeout=10)
weather_response.raise_for_status()
weather_data = weather_response.json()
current_weather = weather_data["current_weather"]
temperature = current_weather["temperature"]
wind_speed = current_weather["windspeed"]
weather_code = current_weather["weathercode"]
# 从hourly数据中提取当前湿度 (取第一个值作为近似)
humidity = weather_data["hourly"]["relativehumidity_2m"][0]
weather_description = get_weather_description(weather_code)
return {
"city": full_city_name,
"temperature": temperature,
"description": weather_description,
"humidity": humidity,
"wind_speed": wind_speed
}
except requests.exceptions.RequestException as e:
print(f"❌ 网络请求失败,获取天气时出错: {e}")
return None
except KeyError as e:
print(f"❌ 解析天气数据时出错,缺少字段: {e}")
return None
except Exception as e:
print(f"❌ 发生未知错误: {e}")
return None
def main():
"""主程序,负责用户交互和流程控制"""
print("☀️ 欢迎使用天气查询助手! ☀️")
print("输入城市名即可查询实时天气。输入 'quit' 退出。")
while True:
city_input = input("\n请输入您要查询的城市名 (输入 'quit' 退出程序): ").strip()
if city_input.lower() == 'quit':
print("感谢使用,再见!")
break
if not city_input:
print("❌ 城市名不能为空,请重新输入。")
continue
print("查询中,请稍候...")
weather_info = fetch_weather(city_input)
if weather_info:
print("\n" + "-" * 30)
print(f"城市: {weather_info['city']}")
print(f"温度: {weather_info['temperature']}°C")
print(f"天气: {weather_info['description']}")
print(f"湿度: {weather_info['humidity']}%")
print(f"风速: {weather_info['wind_speed']} km/h")
print("-" * 30)
if __name__ == "__main__":
main()
(代码块结束)
十、第八步:运行演示
在桌面空白处按住 Shift 键,点击鼠标右键,选择“在此处打开 PowerShell 窗口”,输入:
python weather_helper.py
程序启动后,我测试了几个城市:
- 输入“北京” → 显示北京天气
- 输入“上海” → 显示上海天气
- 输入“london” → 显示伦敦天气(支持英文)
- 输入一个不存在的城市名“abc” → 友好提示“未找到名为 'abc' 的城市”
- 输入 quit → 退出程序
所有功能都正常!而且每次查询都是实时的,数据来自互联网,不是写死在代码里的。
十一、我学到了什么
这个项目做完,我的技能树又点亮了好几个新节点:
- API 概念:理解了什么是 API,以及如何用 Python 调用它
- requests 库:会发送 GET 请求,会处理响应
- JSON 数据解析:知道怎么从一大坨返回数据里提取我想要的那几个字段
- 异常处理:用 try...except 让程序在网络出问题时不会直接崩溃
- 真实世界的编程思维:程序的数据不一定都在本地,互联网上到处是可以调用的“数据接口”
更重要的是,我开始意识到编程的边界比我想象的要大得多。只要会调用 API,我就能获取天气、汇率、新闻、电影信息……能做的东西一下子多了几百倍。
十二、三个项目复盘:我走过的路
项目 核心技能 数据来源 代码行数
猜数字游戏 变量、循环、条件判断 程序内部生成 ~50行
命令行记账本 列表、字典、文件读写、JSON 本地文件 ~100行
天气查询助手 网络请求、API调用、JSON解析 互联网 ~100行
这三个项目做下来,我发现自己已经从“对着黑框框发怵”变成“敢写、敢跑、敢改”的状态了。
AI Coding 对我来说,不是偷懒,而是让我能跳过那些让人劝退的语法细节,直接去理解“程序是怎么解决问题的”。
十三、下一步计划
三个命令行小项目做完,我打算挑战一个有图形界面的程序。
Python 自带一个叫 tkinter 的库,可以做出窗口、按钮、输入框。我打算用它给记账本加一个真正的窗口界面,或者做一个简单的计算器。
等做出来了,我会继续写成第四篇博客。这个系列会一直更新下去,记录我从零开始学编程的每一步。
如果你也照着这篇教程做出了天气查询助手,欢迎在评论区告诉我!遇到了什么问题也可以留言,我们一起讨论。
附录:常见问题排查
Q1:运行时报错 ModuleNotFoundError: No module named 'requests'
A1:说明 requests 库没装上。重新在命令行执行 pip install requests 即可。
Q2:输入中文城市名查不到?
A2:Open-Meteo 的地理编码 API 对部分中文城市名支持不够完善,可以尝试输入拼音(比如 beijing)或英文名。
Q3:程序能查未来几天的天气吗?
A3:Open-Meteo 支持天气预报,但代码需要修改。你可以问 DeepSeek:“请在上面的天气查询代码中增加一个功能:显示未来3天的天气预报。”
本文代码由 DeepSeek 生成,作者已实际运行验证。
AI 声明:
本文由 DeepSeek 辅助生成代码和部分文案,所有步骤均经过本人实际操作验证。
————————————————
版权声明:本文为CSDN博主「qinrunlin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qinrunlin/article/details/(发布后会生成)


所有评论(0)