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常年稳居榜首

二、基础语法与流程控制

基础规范:单行注释使用#,多行注释使用""" """ifelsefordef等不能作为变量名或函数名使用。

数据类型与运算:掌握了整型(整数)、浮点型(小数)、复数、字符串以及布尔型等基本数据类型。能运用算术运算符(+-*/%)、比较运算符(==<=>=!=)以及逻辑运算符进行数据处理。

输入输出:通过input()获取用户输入,利用print()展示结果。

循环:学会了使用if-elif-else进行条件分支判断;通过forwhile循环处理重复逻辑,并配合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结构捕获并处理程序运行时的错误(如ValueErrorFileNotFoundError等),防止程序意外崩溃。

计算机原理:结合冯·诺依曼体系架构(运算器、控制器、存储器、输入设备、输出设备),理解了数据在内存与外存之间的流转,以及二进制运算的底层逻辑。

文件操作:掌握了使用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()容错取值、字符串格式化

屏幕截图 2026-05-31 203938

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

屏幕截图 2026-05-31 203950

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

屏幕截图 2026-05-31 203956

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

屏幕截图 2026-05-31 204002

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

屏幕截图 2026-05-31 204009

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

屏幕截图 2026-05-31 204026

三、实验成果

(1)运行视频
https://www.bilibili.com/video/BV1XsVU64E3y/?spm_id_from=333.1387.homepage.video_card.click&vd_source=e1e5d01174a62223caaab800aac1e829

(2)源代码

屏幕截图 2026-05-31 211016

屏幕截图 2026-05-31 211034

屏幕截图 2026-05-31 211058

屏幕截图 2026-05-31 211111

屏幕截图 2026-05-31 211122

屏幕截图 2026-05-31 211130

(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》

posted @ 2026-06-06 15:44  DANTE2026  阅读(2)  评论(0)    收藏  举报