20254221 实验四《Python程序设计》实验报告
实验项目:天气助手
学生姓名:张祖贤
学号:20254221
班级:2542
指导教师:王志强
完成日期:2026年5月26日
一、实验概述
(1)实验目的
本次实验基于Python语言开发一款多功能天气助手程序,综合运用网络请求、数据解析、文件读写、数据统计、数据可视化等编程知识,完成一体化应用开发。具体实验目的如下:
1.掌握requests库的使用方法,实现第三方开放API调用
2.掌握json格式数据解析、本地文件读写操作,实现数据的持久存储
3.运用matplotlib库完成数据可视化,将统计数据以折线图形式直观展示
4.将不同功能拆分为独立区域,提升代码的可读性与可维护性
5.掌握异常捕获与程序调教方法,提升程序容错能力与问题排查能力
(2)实验环境
1.操作系统:Windows11
2.开发工具:PyCharm Community Edition
3.编程语言:Python3.10
4.核心依赖库:requests,json,datetime,matplotlib
(3)实验背景/全课总结
本学期,我系统地学习了Python程序设计的核心知识体系。以下是我对这门课程的全面梳理与总结:
一、Python简介与开发环境
Python是一门跨平台、解释型的高级编程语言。相比于机器更能理解的“低级语言”,Python的语法更贴近人类自然语言,具有极高的可读性。
核心特性:Python具备强大的跨平台能力,能在多种操作系统上无缝运行。
行业地位:在TIOBE编程语言流行度排行榜中,Python常年稳居榜首
二、基础语法与流程控制
基础规范:单行注释使用#,多行注释使用""" """。if、else、for、def等不能作为变量名或函数名使用。
数据类型与运算:掌握了整型(整数)、浮点型(小数)、复数、字符串以及布尔型等基本数据类型。能运用算术运算符(+、-、*、/、%)、比较运算符(==、<=、>=、!=)以及逻辑运算符进行数据处理。
输入输出:通过input()获取用户输入,利用print()展示结果。
循环:学会了使用if-elif-else进行条件分支判断;通过for和while循环处理重复逻辑,并配合break(跳出循环)、continue(跳过本次循环)和pass(占位符)制作程序。
三、序列、容器与字符串处理
列表 (List): 使用[]表示,元素可变。list.sort()是直接修改原列表,而sorted()则是创建一个新的排序副本。
元组 (Tuple):使用()表示,一旦创建不可修改
字典 (Dict): 使用{}表示,以“键值对”形式存储,查找效率极高。
集合 (Set): 使用{}表示,具有无序且元素不重复的特性,常用于去重。
切片操作:这是访问序列元素的好手,语法为Sname[start:end:step]。其中start为起始位置(包含),end为截止位置(不包含),step为步长。
字符串与正则:字符串是用引号包裹的一串字符。除了基础的索引与切片,还学习了split(分割)、join(拼接)等常用方法。同时,引入了正则表达式(Regular Expression),能够高效地进行复杂的字符串匹配(如匹配手机号、邮箱等)。
四、函数:
使用def关键字定义。掌握了位置参数、关键字参数、默认参数以及可变参数(*args, **kwargs)的灵活运用。
面向对象:
核心概念:“类”是具有相同属性和行为对象的统称(集合),而“对象”是类的具体实例。类的实例化就是根据蓝图创造具体事物的过程。
三要素:封装(隐藏内部细节)、继承(代码复用与扩展)、多态(不同对象对同一消息做出不同响应)。
方法:__init__构造方法用于初始化对象属性,self代表实例本身。此外,还学习了模块(Module)与包(Package)的导入与管理,以实现代码的模块化。
五、异常处理、调试与文件操作
程序的健壮性和数据持久化是工程实践中的关键。
异常处理:通过try-except-else-finally结构捕获并处理程序运行时的错误(如ValueError、FileNotFoundError等),防止程序意外崩溃。
计算机原理:结合冯·诺依曼体系架构(运算器、控制器、存储器、输入设备、输出设备),理解了数据在内存与外存之间的流转,以及二进制运算的底层逻辑。
文件操作:掌握了使用open()打开文件,read()/write()进行读写,seek()移动文件指针,以及close()关闭文件。
六、网络爬虫与数据库
网络爬虫:爬虫(网络蜘蛛)是一种按照特定规则自动抓取互联网信息的脚本。其基本原理是模拟浏览器向服务器发送请求(Request),获取响应(Response),并对网页数据进行解析与提取。
法律边界:学习爬虫必须严守法律底线。必须遵守《网络安全法》,不得非法获取公民个人信息或破坏目标网站系统。
数据库:了解了数据库的基本概念,并掌握了基础的增删改查(CRUD)操作,为数据的存储与管理打下了基础。
二、实验分析与设计
(1)结合实验要求与实际使用场景,我们可以知道程序实现五个核心功能所需要的条件与流程内容
1.实时天气查询:支持输入城市名称,调用天气API,获取并展示城市、时间、天气状况、温度等实时气象信息
2.历史数据存储:将每一次查询的天气数据自动保存至本地json文件,实现数据持久化,关闭程序后数据不丢失
3.历史记录查看:读取本地json文件,按顺序展示历史查询记录
4.气象数据分析:对历史温度数据进行运算,统计出最高温度、最低温度和平均温度
5.数据可视化展示:基于历史查询时间与对应温度,绘制温度变化折线图,直观反映温度变化趋势
6.天气预报:向天气API发送访问即可
7.天气情况分析:调取选中城市15天的污染情况并绘制饼状图
(2)实验设计
依照实验要求,我基于API的数据获取,分别制作了五个相对独立的模块,在从心知天气获取了相应数据后,可独立运行,避免了一锅端的问题。以下是用到的相应的函数
1.天气查询模块
(get_weather函数,调用心知天气API,发送网络请求,解析返回的json数据)
相应技术:requests网络请求、try-except异常捕获、json多层解析、字典get()容错取值、字符串格式化

2.数据存储模块
(save_history函数,将查询到的天气数据写入本地json文件,实现数据持久化)
相应技术:列表追加、文件读写、json.dump写入文件、utf-8编码、中文乱码处理

3.数据加载模块
(load_history函数,在程序启动时读取本地json文件,加载历史天气记录;文件不存在则初始化空列表)
相应技术:文件读取、json.load解析文件、FileNotFoundError异常捕获、全局变量修改

4.数据分析模块
(analyze_history函数,提取历史温度数据,计算最高温、最低温与平均温度)
相应技术:列表推导式、数值类型转换、内置函数 max/min/sum/len 、小数四舍五入

5.数据可视化模块
(plot_weather函数,提取时间、温度数据,利用matplotlib绘制温度变化折线图)
相应技术:图表创建、折线绘制、坐标轴/标题设置、标签旋转、布局自适应

6.主交互模块
(main主函数,程序入口,循环菜单、接收用户输入、调度所有功能函数)
相应技术:while无限循环、分支判断if-elif-else、控制台输入input()、遍历for-enumerate

三、实验成果
(2)源代码






(3)问题与解决
1.问题:API无法调用,导致没有数据来源
解决方案:找到可以免费提供天气信息的网站,并分清相应的公钥、密钥(选择密钥作为API Key)
2.问题:本地json文件缺失,查询不到历史记录
解决方案:找到相应存储路径,恢复文件
3.问题:无法绘制饼状图
解决方案:将调取的城市天气从30天改为15天
心得体会与课程建议
(1)体会
1.我对Python初步的了解其实是通过一个叫编码农场的游戏,在知道了循环,输入输出的用法后,基本就停下了。而在Python课上,我就进一步深化了对编程的理解,能够制作一些相对简单的游戏或小程序。在制作这个天气助手时,遇到了蛮多问题,又是没有API,要是没有装相应的依赖包,又是分不清公钥密钥,但最后也都是解决了(干事儿也一样,总得全面地想,少了哪个环节都不行)。
2.其实在我眼中Python这门课跟学一个自然语言差不了多少,都拥有固定语法规则,依靠单元组合表达含义,这应该也跟英语一样,平时可能用不到,等到关键时候会有大用吧。
3.这里特别想说一下实验三,自己因为乱改注册表导致做的很勉强,但老师您也是帮了很多,非常尽责,非常美味
4.其实咱们日常生活中有很多东西都是以代码为基础的,只是我不会往那方面想罢了。学习了Python后我偶尔也会想想这个程序是怎么运行的,用到了什么函数的了,说不定我以后会去尝试搞一下可视化编程?
(2)建议
1.老师讲的非常细致,点赞点赞
2.其实我觉得Python这门课可以讲的更有趣,更有参与感一些。比如说可以先给大家展示一下这个能做成什么程序,放宽一些加分条件什么的。这样大家的参与感会更好,会更积极,学的东西也更扎实
3.可以再多一些小组任务,会更有意思,也可以相互促进。
4.可以讲慢一些,有点跟不上()
参考资料
《零基础学python》

浙公网安备 33010602011771号