20224210郑楷隆 实验四《Python程序设计》实验报告

20224210郑楷隆 2024-05-28 23:09:12

20224210 2022-2023-2 《Python程序设计》实验4报告

课程:《Python程序设计》
班级: 2242
姓名: 郑楷隆
学号:20224210
实验教师:王志强
实验日期:2024年5月14日
必修/选修: 专选课

1.实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。

本次实验做了三个实验分别是:1、编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。(失败)

2、用python画一只小熊猫

3、编写小游戏:贪吃蛇

2. 实验过程及结果

实验一:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。(失败)

我们可以使用新浪微博作为数据源,来实现舆情监控或情感分析。

步骤 1: 安装必要的 Python 库

 步骤 2: 编写爬虫脚本

import requests
from snownlp import SnowNLP
import matplotlib.pyplot as plt

def fetch_weibo_data():
    url = 'https://s.weibo.com/top/summary?cate=realtimehot'
    response = requests.get(url)
    if response.status_code == 200:
        # 提取热门话题
        hot_topics = response.json()['data']['list']
        # 获取第一个话题的微博列表
        if hot_topics:
            topic_url = hot_topics[0]['scheme']
            topic_response = requests.get(topic_url)
            if topic_response.status_code == 200:
                # 提取微博内容
                weibo_content = topic_response.json()['data']['cards'][1]['card_group']
                return [weibo['mblog']['text'] for weibo in weibo_content]
    return None

def analyze_sentiments(weibo_data):
    sentiments = []
    for text in weibo_data:
        s = SnowNLP(text)
        sentiments.append(s.sentiments)
    return sentiments

# 获取微博数据
weibo_data = fetch_weibo_data()

# 分析情感
if weibo_data:
    sentiments = analyze_sentiments(weibo_data)

    # 绘制情感分析结果的直方图
    plt.hist(sentiments, bins=10)
    plt.title('Sentiment Analysis of Top Weibo Topics')
    plt.xlabel('Sentiment Score')
    plt.ylabel('Number of Posts')
    plt.show()
else:
    print("Failed to fetch Weibo data.")

实验结果:失败

 实验2:用python画一只小熊猫

结果如下:

实验分析及设计:

源代码

import matplotlib.pyplot as plt

def draw_panda():
    
    body = plt.Circle((0.5, 0.5), 0.4, color='black')  
    plt.gca().add_patch(body)  
   
    left_ear = plt.Circle((0.3, 0.8), 0.1, color='black') 
    plt.gca().add_patch(left_ear)  
   
    right_ear = plt.Circle((0.7, 0.8), 0.1, color='black') 
    plt.gca().add_patch(right_ear)  


    left_eye_white = plt.Circle((0.4, 0.6), 0.08, color='white')  
    plt.gca().add_patch(left_eye_white) 

 
    right_eye_white = plt.Circle((0.6, 0.6), 0.08, color='white') 
    plt.gca().add_patch(right_eye_white)  

    left_eye_pupil = plt.Circle((0.4, 0.6), 0.04, color='black') 
    plt.gca().add_patch(left_eye_pupil)  


    right_eye_pupil = plt.Circle((0.6, 0.6), 0.04, color='black')
    plt.gca().add_patch(right_eye_pupil) 

    left_hand = plt.Rectangle((0.2, 0.3), 0.1, 0.2, color='black') 
    plt.gca().add_patch(left_hand) 

    
    right_hand = plt.Rectangle((0.7, 0.3), 0.1, 0.2, color='black')  
    plt.gca().add_patch(right_hand)  


if __name__ == "__main__":
    draw_panda()
    plt.axis('scaled')  
    plt.axis('off')  
    plt.show()

 分析

  1. 导入 Matplotlib 库:首先导入了 Matplotlib 库,这是一个用于绘制图表和图形的 Python 库。

  2. 定义绘制函数

    • draw_panda():绘制小熊猫的各个部分,包括身体、耳朵、眼睛和手臂等。
  3. 绘制小熊猫图像

    • draw_panda() 函数中,使用 Matplotlib 库的基本图形函数来绘制小熊猫的各个部分,例如圆形和矩形。
    • 调用 plt.gca().add_patch() 函数将每个图形添加到当前绘图区域。
  4. 主函数

    • if __name__ == "__main__"::这是 Python 的惯用写法,表示当代码作为主程序执行时,以下代码块将会被执行。
    • 调用 draw_panda() 函数绘制小熊猫图像。
    • 使用 plt.axis('scaled') 设置坐标轴比例为1:1,以保证绘制出的图像不会出现拉伸或压缩。
    • 使用 plt.axis('off') 关闭坐标轴,使绘制出的图像不显示坐标轴。
    • 最后调用 plt.show() 显示绘制出的小熊猫图像

 实验3:编写小游戏:贪吃蛇

成果如下:

实验分析及设计:

源代码

import pygame
import time
import random

pygame.init()

white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)

dis_width = 800
dis_height = 600
dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Snake Game by Edureka')

clock = pygame.time.Clock()

snake_block = 10
snake_speed = 30

font_style = pygame.font.SysFont(None, 50)


def message(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width / 6, dis_height / 3])


def gameLoop():
    game_over = False
    game_close = False

    x1 = dis_width / 2
    y1 = dis_height / 2

    x1_change = 0
    y1_change = 0

    snake_List = []
    Length_of_snake = 1

    foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
    foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0

    while not game_over:

        while game_close == True:
            dis.fill(blue)
            message("You Lost! Press Q-Quit or C-Play Again", red)
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_c:
                        gameLoop()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN:
                    y1_change = snake_block
                    x1_change = 0

        if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
            game_close = True
        x1 += x1_change
        y1 += y1_change
        dis.fill(blue)
        pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
        snake_Head = []
        snake_Head.append(x1)
        snake_Head.append(y1)
        snake_List.append(snake_Head)
        if len(snake_List) > Length_of_snake:
            del snake_List[0]

        for x in snake_List[:-1]:
            if x == snake_Head:
                game_close = True

        for segment in snake_List:
            pygame.draw.rect(dis, black, [segment[0], segment[1], snake_block, snake_block])

        pygame.display.update()

        if x1 == foodx and y1 == foody:
            foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
            foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
            Length_of_snake += 1

        clock.tick(snake_speed)

    pygame.quit()
    quit()


gameLoop()

 

  1. 导入模块

    • import pygame: 导入 Pygame 库,用于游戏开发。
    • import time: 导入 time 模块,用于控制游戏速度。
    • import random: 导入 random 模块,用于生成随机数。

     

  2. 初始化 Pygame 和设置游戏参数

    • pygame.init(): 初始化 Pygame 库。
    • 设置游戏窗口的尺寸、标题和时钟。
  3. 定义游戏需要使用的颜色和变量

    • 定义了白色、黄色、黑色、红色、绿色和蓝色的 RGB 颜色值。
    • 定义了游戏窗口的宽度和高度、蛇的尺寸和速度等变量。
  4. 定义游戏中需要使用的函数

    • message(msg, color): 显示消息在游戏窗口中,用于显示游戏结束信息。
    • gameLoop(): 游戏主循环函数,包括游戏逻辑和事件处理。
  5. 游戏主循环

    • gameLoop() 函数中,使用了多个循环来处理游戏的逻辑和事件。
    • 游戏结束时,显示游戏结束信息,并根据用户的输入决定是退出游戏还是重新开始游戏。
    • 在游戏进行中,不断检测用户的输入来控制贪吃蛇的移动方向,同时更新贪吃蛇的位置和长度,并检测是否吃到了食物。
  6. 游戏退出

    • 当游戏结束时,调用 pygame.quit()quit() 函数退出 Pygame,并终止 Python 程序的执行。

3.遇到的问题及实验体会

1. 未安装 Pygame

  • 问题描述:尝试运行贪吃蛇游戏代码时,Python 报错提示没有找到 Pygame 模块。
  • 解决方案:确保安装了 Pygame 库。可以在命令行中运行 pip install pygame 来安装。

2. 未安装 Matplotlib

  • 问题描述:尝试运行绘制小熊猫的代码时,出现错误提示未找到 Matplotlib 模块。
  • 解决方案:安装 Matplotlib 库,使用命令 pip install matplotlib

3. 坐标计算错误

  • 问题描述:在绘制小熊猫时,如果坐标计算错误,可能导致图形部件错位。
  • 解决方案:检查每个绘图函数中的坐标和尺寸参数,确保它们正确反映了你想要的设计。

4. 游戏速度不适宜

  • 问题描述:贪吃蛇游戏的速度太快或太慢,影响游戏体验。
  • 解决方案:调整 clock.tick() 函数中的参数,这个参数控制了游戏的帧率,从而影响贪吃蛇的移动速度。

5. 界面尺寸不合适

  • 问题描述:游戏界面或绘图界面太大或太小,不适合显示器的显示尺寸。
  • 解决方案:调整 pygame.display.set_mode() 或 Matplotlib 绘图窗口的尺寸参数,以适应不同的屏幕和需求。

6. 键盘响应延迟

  • 问题描述:在贪吃蛇游戏中,键盘响应有明显延迟,影响控制。
  • 解决方案:优化事件处理循环,确保及时处理键盘事件。另外,检查其他代码部分是否有性能瓶颈,如不必要的大循环或复杂的逻辑。

7. 代码结构不清晰

  • 问题描述:随着功能增加,原始代码可能变得难以维护和扩展。
  • 解决方案:重构代码,使用函数或类来组织相关功能,使代码更加模块化和易于管理。

感悟与思考

在完成贪吃蛇游戏和小熊猫绘制的实验中,我遇到了不少挑战,这些经历让我对Python有了更深的认识和理解。Python作为一种编程语言,它的简洁性和灵活性让我能够较快地上手和实现想法,尤其是在处理游戏逻辑和图形界面时。通过实际操作,我体会到了Python强大的功能和广泛的应用范围。通过这些实验,我意识到编程不仅仅是写代码,更多的是解决问题的过程。每次遇到问题,我需要思考问题的原因,查找解决方案,并实际应用到我的项目中。这个过程让我学会了如何有效地使用搜索引擎,如何阅读和理解官方文档,这对于任何编程语言的学习都是非常重要的。

此外,我也体会到了代码的组织和规划的重要性。在项目初期,由于缺乏经验,我的代码经常变得混乱和难以管理。通过学习和实践,我逐渐学会了如何结构化我的代码,使其更加模块化,从而易于维护和扩展。这不仅提高了我的编程效率,也让整个项目更加稳定和可靠。

总体来说,通过这两个实验,我不仅提升了自己的编程技能和解决问题的能力,还加深了对Python的理解。这些经历让我认识到持续学习和实践的重要性,无论是在学术还是职业生涯中,这种积极主动的学习态度都将是我最宝贵的资产。

课程总结与建议

在我不断学习和探索的过程中,我对Python这一编程语言有了更深层次的认识。我发现Python不仅简洁易学,而且功能强大,能够通过简单的几行代码完成复杂的任务,从而极大地提高工作和学习的效率。我渴望在未来能继续深入学习Python,掌握更多高级功能,并应用这些技能来解决实际问题,达到将所学知识应用于实践的目的。

为了帮助学生更好地理解Python的实际应用,我建议在未来的教学安排中,教师们可以适当增加对Python在现实世界中应用的讲解和实战演练。通过这种方式,学生不仅可以看到Python编程在解决具体问题中的实际效用,而且能够通过动手实践,增进对Python技能的掌握。这种教学模式不仅可以激发学生们对编程学习的兴趣,还可以帮助他们更好地理解理论知识与实践应用之间的联系,从而在学习中获得更多的动力和成就感。

增加实际案例和应用练习,将使学生们在实际操作中遇到问题,并通过解决这些问题来加深对Python编程的理解。这种学以致用的教学方法将有助于学生们建立起更加扎实的技术基础,同时培养他们的问题解决能力和创新思维。这样的课程设计不仅能够促进学生的个人成长,还能为他们将来的职业生涯奠定坚实的基础。

 

 

 

 

...全文
296 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文研究基于粒子群算法(PSO)优化模糊C均值聚类(FCM)的居民用电行为分析方法,提出一种改进的FCM聚类算法,通过引入粒子群优化机制,有效提升聚类性能与收敛效率,克服传统FCM算法易陷入局部最优、对初始聚类中心敏感等缺陷。研究基于Matlab平台实现算法代码,对居民用电负荷数据进行聚类分析,识别不同用户的典型用电模式与行为特征,进而支持电力系统的需求侧精细化管理、用户分群运营、个性化用电服务推荐以及中长期负荷预测。该方法在智能电网与大数据背景下展现出良好的应用前景,特别适用于大规模居民用电数据的行为挖掘与模式识别任务。; 适合人群:具备一定电力系统基础知识、数据挖掘或智能优化算法背景的科研人员及工程技术人员,尤其适合从事智能电网、负荷特性分析、需求响应、用户行为研究等方向的硕士、博士研究生及高校教师。; 使用场景及目标:①实现居民用户用电行为的有效分类与典型负荷曲线提取;②优化电力客户细分策略,支撑差异化电价、需求响应激励政策的设计与实施;③为负荷预测、电网规划、配电台区管理提供数据驱动的决策依据;④作为高水平学术论文(如EI、SCI期刊)的研究基础,用于算法复现、性能对比与创新改进。; 阅读建议:建议读者结合提供的Matlab代码深入理解PSO-FCM算法的具体实现流程,重点关注粒子编码方式、适应度函数构建、聚类有效性评价指标(如轮廓系数、误差平方和)的应用,鼓励在真实用电数据集上进行实验验证,并尝试引入其他优化策略或评估维度以进一步提升模型鲁棒性与实用性。
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
代码转载自:https://pan.quark.cn/s/a1913ccaa47a 在信息技术领域中,图像处理占据着核心地位,特别是在嵌入式系统以及移动设备上,由于受到资源条件的制约,常常需要将高分辨率的图像格式转化为低分辨率的格式,以此来提升显示效能和存储容量。"bmp格式转为rgb565格式图片转换工具"正是为了应对这种需求而研发的。BMP(Bitmap)是一种广泛应用的位图格式,它完整地记录了图像的每一个像素点信息,涵盖了色彩深度、透明度等参数。然而,这种格式在内存消耗和处理速率方面并不具备优势,尤其是在需要高速渲染的情境下。RGB565是一种16位的色彩编码格式,普遍应用于嵌入式系统,例如由微控制器控制的LCD显示屏。它通过分配5位红色、6位绿色以及5位蓝色分量来表现色彩,总共能够呈现2^16 = 65536种色彩,尽管其色彩数量(约1670万种)少于BMP的24位色彩,但足以满足绝大多数显示场景,并且显著降低了数据存储和传输的负担。这种转换工具的运作机制在于读取BMP文件中的每一个像素点,然后依照RGB565的编码规范重新组织色彩信息。在BMP文件中,像素数据一般以行为单位进行存储,遵循从左到右、自下而上的顺序。而在RGB565格式中,每个像素点由两个字节构成,其中红色和蓝色各占5位,绿色占据6位,这样的布局旨在提升内存中的对齐效率。转换流程通常包括以下几个环节:1. 分析BMP文件头部:BMP文件头部包含了图像的宽度、高度、色彩深度等关键数据,这是进行转换的依据。2. 获取像素数据:按照BMP文件的结构读取每一行的像素点信息。3. 色彩转换:将每个24位RGB色彩点转换为16位RGB565格式。4. 输出新格式:将转换后的RGB565数据写入新的...
内容概要:本文系统研究了基于合作博弈理论的综合能源系统利益分配优化调度方法,并配套提供了完整的Matlab代码实现。针对多个能源主体协同运行场景下的利益分配难题,文章构建了严谨的合作博弈模型,结合优化调度算法,在实现系统整体经济效益最大化的同时,确保各参与方之间的利益分配公平合理。研究内容涵盖模型的数学建模、理论推导、求解流程设计及仿真验证全过程,重点突出了Shapley值等经典博弈分配方法在能源系统中的应用,具有较强的理论深度与工程实践价值,适用于致力于高水平学术研究(如EI/SCI论文撰写)的科研人员。; 适合人群:具备电力系统、优化理论及博弈论基础知识,从事综合能源系统调度、分布式能源协同管理、能源互联网经济性分析等方向研究的硕士、博士研究生及高校科研人员。; 使用场景及目标:①用于多主体综合能源系统中利益分配机制的设计与仿真分析;②支撑高质量学术论文的撰写、复现与创新;③为实际能源项目中的协调调度决策与经济性评估提供理论依据与技术工具支持。; 阅读建议:建议读者结合Matlab代码逐模块研读,深入理解合作博弈模型与优化调度算法的耦合逻辑,重点关注Shapley值等分配机制的计算实现,并可通过调整参数或拓展模型结构进行二次开发与对比实验

93

社区成员

发帖
与我相关
我的任务
社区描述
Python程序设计作业
软件构建 高校 北京·丰台区
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧