Python 入门实战:30 行代码写一个命令行天气查询工具
为什么从“小工具”开始学 Python
很多新手学 Python 的路径是先啃语法书:变量、循环、类与对象……概念记了一堆,却不知道能拿来做点什么,很快就失去了动力。其实更有效的办法是先定一个小目标,比如“写一个能查天气的命令行工具”,在完成它的过程中,把网络请求、数据解析、函数组织这些核心能力一次串起来。本文就带你用不到 30 行代码完成这个小工具,全程只用 Python 标准库,不需要安装第三方包,也不需要注册任何账号。
准备工作
只需要准备两样东西:
- 安装 Python 3.10 以上版本,在终端执行
python --version能输出版本号即可; - 一个免费的天气数据接口。本文使用 Open-Meteo,它免 Key、免注册,返回标准的 JSON 数据,非常适合练手。
动手前建议顺手养成使用虚拟环境的习惯,避免把系统环境装乱:
python -m venv .venv
# Windows 激活:.venv\Scripts\activate
# macOS / Linux 激活:source .venv/bin/activate
完整代码
import json
import urllib.request
import urllib.parse
CITIES = {
"北京": (39.90, 116.40),
"上海": (31.23, 121.47),
"深圳": (22.55, 114.06),
}
def fetch_weather(city):
lat, lon = CITIES[city]
params = urllib.parse.urlencode({
"latitude": lat,
"longitude": lon,
"current": "temperature_2m,relative_humidity_2m,wind_speed_10m",
"timezone": "Asia/Shanghai",
})
url = f"https://api.open-meteo.com/v1/forecast?{params}"
with urllib.request.urlopen(url, timeout=10) as resp:
return json.loads(resp.read().decode("utf-8"))
def main():
city = input("请输入城市(北京/上海/深圳):").strip()
if city not in CITIES:
print("暂不支持该城市,可在 CITIES 字典里自行添加经纬度。")
return
try:
cur = fetch_weather(city)["current"]
except Exception as e:
print(f"查询失败,请检查网络后重试:{e}")
return
print(f"{city} 当前气温 {cur['temperature_2m']}°C,"
f"相对湿度 {cur['relative_humidity_2m']}%,"
f"风速 {cur['wind_speed_10m']} km/h")
if __name__ == "__main__":
main()
把代码保存为 weather.py,这个小工具就已经成型了。
代码里藏着的 4 个知识点
1. 字典是最常用的数据结构。 CITIES 用城市名映射经纬度元组,查表速度快,也特别方便后续扩展:想支持更多城市,往字典里加一行就行。
2. f-string 让字符串拼接变简单。 f"{city} 当前气温 …" 把变量直接嵌进字符串,比老式的 % 格式化和 + 号拼接都更易读,出错也更少。
3. 标准库就能发网络请求。 urllib.request.urlopen 配合 with 语句自动关闭连接,不用操心资源释放;拿到响应后用 json.loads 把文本解析成字典,之后就可以用键来取值,这正是处理一切 API 返回数据的通用套路。
4. 异常处理让程序不怕意外。 网络超时、接口临时异常都很常见,用 try/except 兜底,并给用户一句能看懂的提示,是小工具从“能跑”走向“能用”的关键一步。
运行效果与扩展方向
在终端执行 python weather.py,按提示输入城市名,就能看到类似“深圳 当前气温 29.5°C,相对湿度 78%,风速 12.3 km/h”的输出。
练熟之后可以沿着几个方向继续扩展:接入更多城市的经纬度、把查询结果缓存到本地文件避免重复请求、换成 requests 库对比两种写法的差异,或者再加一个定时任务,每天早上自动把天气发到自己的邮箱。学编程最怕“只看不用”,先让第一个小工具真正跑起来,后面的路会越走越顺。
- 点赞
- 收藏
- 关注作者
评论(0)