20254111 实验四《Python程序设计》实验报告

学号 2025-2026-2 《Python程序设计》实验4报告

课程:《Python程序设计》
班级: 2541
姓名: 周笑凡
学号:20254111
实验教师:王志强
实验日期:2026年5月26日
必修/选修:专选课

一、实验要求

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

批阅:注意本次实验不算做实验总分,前三个实验每个实验15分,累计45分。本次实践算入综合实践,打分为45分。

评分标准:
(1)程序能运行,功能丰富(至少5个功能)。(需求提交源代码,并建议录制程序运行的视频)15分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。20分。
(3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。10分

二、实验过程

1、程序选择:

其实本人小时候并不是很喜欢玩小游戏,玩的话也是那种装扮类的。所以我在检索的过程中找到了这个金币游戏,感觉还挺有趣的,也有一定的操作性,所以就选择它作为我的实验对象。

2、游戏玩法设计:

玩家通过移动鼠标控制屏幕底部的篮子,在60秒内尽可能多地接住从顶部掉落的金币和钻石来获得分数(金币+10分,钻石+50分),同时要避开炸弹(-20分)。游戏难度随得分自动提升,每获得350分掉落速度加快、同时出现的物品数量增加,难度升级时屏幕会显示红色警告文字,背景颜色也逐渐变红。时间结束后显示最终得分,按R键可重新开始。

3、代码编写

(1)安装pygame,导入模块,并初始化游戏。
导入游戏所需的库(pygame做游戏、random随机、time计时、math数学计算)
初始化pygame引擎;设置游戏标题
创建800×600像素的游戏窗口;创建时钟对象(控制游戏帧率,每秒60帧)
image

(2)进行游戏基本元素设置
定义游戏中使用的各种颜色(RGB值)
确定盛金币的篮子的尺寸和位置
image

(3)三个核心数据结构
items列表用于动态管理所有正在下落的物品对象;
effects列表用于管理接物后的视觉特效动画;
score变量用于记录玩家当前得分。
定义游戏时长,总计60秒。
image

(4)游戏难度值设置
warning_message用于控制难度升级提示的显示。当难度提升时,屏幕上显示红色大号警告文字,2秒后自动清空。
background_red变量建立难度越高背景越红的视觉反馈机制。随着玩家得分增加,难度等级提升,背景由纯白色逐渐过渡到淡红色,增强游戏体验感。
image

(5)游戏音效设置
尝试加载音效文件(金币声、钻石声、炸弹声、背景音乐)
使用try-except异常处理:如果文件不存在,程序不会崩溃,只是没有声音
设置音量(0.5表示50%音量)
image

(6)三个物品绘制函数
①draw_coin() 用于绘制金币
使用两层圆形制造金币的立体感(外圈金色,内圈亮金色)
使用render()和blit()在金币中央绘制"$"符号
在左上角添加高光小圆点,模拟金属反光效果
②draw_diamond() 用于绘制钻石
使用多边形绘制4个顶点,构成菱形(钻石形状)
添加高光点模拟钻石的闪耀效果
③draw_bomb() 用于绘制炸弹
黑色圆形为主体,配以深灰色内圈增加层次
红色引线从炸弹顶部斜向伸出
image

(7)玩家(篮子)绘制函数
draw_basket()通过矩形、椭圆、线条的组合,构建了一个具有编织纹理和立体感的篮子。装饰元素的添加使游戏界面更加友好可爱。
image

(8)爆炸特效绘制函数
draw_explosion()实现了完整的爆炸动画效果。通过帧计数器控制火焰扩张、烟雾扩散和碎片飞溅,营造出强烈的视觉冲击力。
image

(9)金币收集与钻石手机特效绘制函数
draw_coin_effect()通过光圈扩散和四向星光,模拟了金币被收集时的"绽放"视觉效果,给玩家带来积极的反馈体验。
draw_diamond_effect()作为高级物品的收集特效,采用了更密集的八方向星光和蓝色渐变光圈,与钻石的高分值(50分)相匹配。
image

(10)难度控制系统
①线性难度增长:每350分提升一级,曲线平滑
②视觉反馈机制:难度升级时屏幕中央显示红色大号警告文字,2秒后自动消失
③动态掉落数量:随难度增加,一次掉落物品从1个逐渐增加到2-3个
游戏前易后难,既能吸引玩家快速上手,又能提供足够的挑战。
image

(11)事件处理设置
包含窗口关闭和键盘按键两个事件。当游戏处于结束状态且玩家按下R键时,程序会重置所有游戏状态变量——包括分数、物品列表、特效列表、掉落速度、计时起点等,实现"一键重启"功能。try-except结构用于安全地重新播放背景音乐,即使音乐文件缺失也不会导致程序崩溃。
image

(12)游戏三大驱动核心
①倒计时系统。采用time.time()函数获取系统时间戳,通过计算开始时间与当前时间的差值得到已用时长。时间耗尽时,程序自动保存最终分数并停止背景音乐。
②玩家控制采用鼠标跟随方案。通过pygame.mouse.get_pos()实时获取鼠标X坐标,并将篮子中心对齐到鼠标位置。边界检测使用max()和min()函数将篮子位置限制在窗口范围内。
③物品生成模块。采用概率触发机制,每帧有4%的概率生成新物品。生成数量由难度等级决定,难度越高同时掉落的物品越多。在高难度(≥3)下,炸弹的出现概率提升至30%,增加了游戏挑战性。
image

(13)碰撞检测与得分系统
位置更新:通过item[1] += item_speed每帧将所有物品向下移动,速度随难度递增。
碰撞箱创建:使用pygame.Rect()为篮子和每个物品创建矩形碰撞区域,位置和尺寸与视觉图形对应。
碰撞检测:调用colliderect()方法判断篮子与物品的矩形是否重叠。
反馈处理:碰撞后根据物品类型执行对应操作:金币+10分、钻石+50分、炸弹-20分,并播放音效、生成视觉特效。
物品清理:碰撞后或物品超出底部边界时,通过items.remove(item)将其从列表中移除,避免内存无限增长。
image

(14)难度调节系统
①速度升级:采用公式item_speed = 5 + score // 350,每获得350分掉落速度增加1,分数越高游戏节奏越快。
②警告显示:当难度升级时,使用big_font.render()生成警告文字,通过screen.blit()绘制在屏幕中央,持续2秒后自动清除。
image

(15)游戏渲染系统(对前面特效的补充)
①调用draw_basket()函数,在玩家当前坐标位置绘制棕色藤篮,包含编织纹理和蝴蝶结装饰。(因为最开始的篮子非常的简陋)
②根据特效类型分别调用draw_coin_effect()、draw_diamond_effect()或draw_explosion(),通过帧计数器实现动画效果。(最开始的特效很丑)
image

(16)UI信息显示系统负
显示得分:使用font.render()生成得分文本,通过screen.blit()绘制在屏幕左上角(10, 10)位置。
显示倒计时:将剩余秒数通过// 60和% 60转换为分钟和秒,格式化为MM:SS形式。计算文本宽度后采用右对齐方式绘制在屏幕右上角,确保时间始终完整显示。
显示速度:使用小号字体在屏幕左下角(10, 565)显示当前掉落速度,数值越大游戏节奏越快。
显示难度:在得分下方(10, 50)显示当前难度等级(0-5级),使用橙色字体便于识别。
image

(17)游戏结束与程序退出系统
①游戏结束画面。当倒计时归零时,程序执行else分支,使用big_font.render()生成"GAME OVER"、最终得分和"Press R to restart"三行文本。
②文字居中计算。通过get_width()获取每个文本的宽度,以屏幕中心(400, y)为基准减去宽度的一半,实现完美的居中显示。
③画面更新与帧率控制。每帧结束时调用pygame.display.update()刷新屏幕,clock.tick(60)将帧率锁定在60帧/秒,确保游戏运行流畅。
image

4、源代码

import pygame
import random
import time
import os
import math
 初始化
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Treasure Catcher")
clock = pygame.time.Clock()
pygame.mixer.init()
 Colors
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 150, 0)
GOLD = (255, 215, 0)
CYAN = (0, 255, 255)
BLACK = (0, 0, 0)
BROWN = (139, 69, 19)
DARK_BROWN = (101, 67, 33)
ORANGE = (255, 100, 0)
YELLOW = (255, 255, 0)
GRAY = (100, 100, 100)
 Player
player_width = 100
player_height = 40
player_y = 550
 Items
items = []
item_speed = 5
 Effects
effects = []
 Score
score = 0
font = pygame.font.Font(None, 36)
big_font = pygame.font.Font(None, 72)
small_font = pygame.font.Font(None, 24)
 Timer
start_time = time.time()
game_duration = 60
 Difficulty
warning_message = ""
warning_start_time = 0
background_red = 0
last_difficulty = -1
 ========== Sound Loading ==========
base_dir = os.path.dirname(file)
sounds_dir = os.path.join(base_dir, "sounds")
try:
    pygame.mixer.music.load(os.path.join(sounds_dir, "bgm.mp3"))
    pygame.mixer.music.set_volume(0.3)
    pygame.mixer.music.play(-1)
except:
    pass
try:
    coin_sound = pygame.mixer.Sound(os.path.join(sounds_dir, "coin.wav"))
    coin_sound.set_volume(0.5)
except:
    coin_sound = None
try:
    diamond_sound = pygame.mixer.Sound(os.path.join(sounds_dir, "diamond.wav"))
    diamond_sound.set_volume(0.5)
except:
    diamond_sound = None
try:
    bomb_sound = pygame.mixer.Sound(os.path.join(sounds_dir, "bomb.wav"))
    bomb_sound.set_volume(0.5)
except:
    bomb_sound = None
 ========== Drawing Functions ==========
def draw_coin(surface, x, y, size=40):
    pygame.draw.circle(surface, GOLD, (x + size // 2, y + size // 2), size // 2)
    pygame.draw.circle(surface, (255, 185, 0), (x + size // 2, y + size // 2), size // 2 - 2)
    font_small = pygame.font.Font(None, size)
    dollar = font_small.render("$", True, DARK_BROWN)
    surface.blit(dollar, (x + size // 2 - 10, y + size // 2 - 15))
    pygame.draw.circle(surface, (255, 255, 150), (x + size // 3, y + size // 3), size // 8)
def draw_diamond(surface, x, y, size=40):
    points = [
        (x + size // 2, y + 3),
        (x + size - 3, y + size // 2),
        (x + size // 2, y + size - 3),
        (x + 3, y + size // 2)
    ]
    pygame.draw.polygon(surface, CYAN, points)
    pygame.draw.polygon(surface, (0, 200, 255), points, 2)
    pygame.draw.circle(surface, (200, 255, 255), (x + size // 2 - 6, y + size // 2 - 6), 5)
def draw_bomb(surface, x, y, size=40):
    pygame.draw.circle(surface, BLACK, (x + size // 2, y + size // 2), size // 2)
    pygame.draw.circle(surface, (50, 50, 50), (x + size // 2, y + size // 2), size // 2 - 2)
    pygame.draw.line(surface, RED, (x + size // 2 + 7, y + 7), (x + size // 2 + 16, y - 4), 4)
    pygame.draw.line(surface, RED, (x + size // 2 - 6, y + size // 2 - 6), (x + size // 2 + 6, y + size // 2 + 6), 3)
    pygame.draw.line(surface, RED, (x + size // 2 + 6, y + size // 2 - 6), (x + size // 2 - 6, y + size // 2 + 6), 3)
def draw_basket(surface, x, y, width, height):
    pygame.draw.rect(surface, BROWN, (x, y, width, height), border_radius=10)
    pygame.draw.rect(surface, DARK_BROWN, (x, y, width, height), border_radius=10, width=3)
    pygame.draw.ellipse(surface, DARK_BROWN, (x + 5, y - 5, width - 10, 12))
    pygame.draw.ellipse(surface, (80, 40, 20), (x + 7, y - 3, width - 14, 8))
    for i in range(4):
        line_y = y + 8 + i * 9
        pygame.draw.line(surface, DARK_BROWN, (x + 8, line_y), (x + width - 8, line_y), 2)
    for i in range(6):
        line_x = x + 15 + i * 15
        pygame.draw.line(surface, DARK_BROWN, (line_x, y + 5), (line_x, y + height - 5), 2)
    pygame.draw.rect(surface, (180, 100, 50), (x + 3, y - 2, width - 6, 8), border_radius=4)
    bow_x = x + width - 12
    bow_y = y - 2
    pygame.draw.circle(surface, (200, 100, 100), (bow_x, bow_y), 4)
    pygame.draw.circle(surface, (255, 150, 150), (bow_x - 3, bow_y - 2), 3)
    pygame.draw.circle(surface, (255, 150, 150), (bow_x + 3, bow_y - 2), 3)
def draw_explosion(surface, x, y, frame):
    size = 10 + frame * 5
    pygame.draw.circle(surface, (255, 100, 0), (x, y), size + 6)
    pygame.draw.circle(surface, (255, 150, 0), (x, y), size + 3)
    pygame.draw.circle(surface, (255, 200, 50), (x, y), size)
    smoke_radius = 6 + frame * 2
    pygame.draw.circle(surface, (80, 80, 80), (x - 10, y - 6), smoke_radius)
    pygame.draw.circle(surface, (100, 100, 100), (x + 12, y - 4), smoke_radius)
    pygame.draw.circle(surface, (90, 90, 90), (x + 4, y + 10), smoke_radius - 2)
    debris_count = min(15, frame * 4)
    for i in range(debris_count):
        angle = (frame * 45 + i * 45) * math.pi / 180
        distance = 18 + frame * 6
        debris_x = x + distance * 0.8 * math.cos(angle)
        debris_y = y + distance * 0.8 * math.sin(angle)
        debris_size = max(2, 5 - frame // 3)
        pygame.draw.rect(surface, (100, 50, 0), (debris_x, debris_y, debris_size, debris_size))
def draw_coin_effect(surface, x, y, frame):
    size = 14 + frame * 3
    pygame.draw.circle(surface, (255, 200, 0), (x, y), size, 2)
    pygame.draw.circle(surface, (255, 255, 100), (x, y), size - 4, 1)
    for angle in [0, 90, 180, 270]:
        rad = angle * math.pi / 180
        star_x = x + (size + 4) * 0.8 * math.cos(rad)
        star_y = y + (size + 4) * 0.8 * math.sin(rad)
        pygame.draw.circle(surface, (255, 255, 150), (int(star_x), int(star_y)), 3)
def draw_diamond_effect(surface, x, y, frame):
    size = 16 + frame * 3
    pygame.draw.circle(surface, (100, 200, 255), (x, y), size, 2)
    pygame.draw.circle(surface, (150, 220, 255), (x, y), size - 4, 1)
    for angle in [0, 45, 90, 135, 180, 225, 270, 315]:
        rad = angle * math.pi / 180
        star_x = x + (size + 6) * 0.7 * math.cos(rad)
        star_y = y + (size + 6) * 0.7 * math.sin(rad)
        pygame.draw.circle(surface, (200, 230, 255), (int(star_x), int(star_y)), 3)
 ========== Game Loop ==========
running = True
game_over = False
final_score = 0
while running:
    # ========== 难度计算(每350分升一级)==========
    difficulty = score // 350
    if difficulty > 5:
        difficulty = 5
    # 难度升级时显示警告
    if difficulty != last_difficulty and difficulty >= 1:
        warning_message = f"DIFFICULTY {difficulty}!"
        warning_start_time = time.time()
        last_difficulty = difficulty
    # 检查警告是否超过2秒
    if warning_message and time.time() - warning_start_time > 2:
        warning_message = ""
    # 根据难度决定一次生成几个物品
    if difficulty == 0:
        spawn_range = (1, 1)
    elif difficulty == 1:
        spawn_range = (1, 2)
    elif difficulty == 2:
        spawn_range = (1, 3)
    else:
        spawn_range = (2, 3)
    # 背景渐变
    background_red = min(80, difficulty * 15)
    bg_color = (255 - background_red, 255 - background_red, 255)
    screen.fill(bg_color)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if game_over and event.key == pygame.K_r:
                game_over = False
                score = 0
                items = []
                effects = []
                item_speed = 5
                start_time = time.time()
                final_score = 0
                warning_message = ""
                last_difficulty = -1
                try:
                    pygame.mixer.music.play(-1)
                except:
                    pass
    if not game_over:
        # 倒计时
        elapsed = time.time() - start_time
        remaining = game_duration - elapsed
        if remaining <= 0:
            game_over = True
            final_score = score
            pygame.mixer.music.stop()
        # Mouse control
        mouse_x, _ = pygame.mouse.get_pos()
        player_x = mouse_x - player_width // 2
        player_x = max(0, min(800 - player_width, player_x))
        # 生成物品
        if random.randint(1, 25) == 1:
            num_to_spawn = random.randint(spawn_range[0], spawn_range[1])
            for _ in range(num_to_spawn):
                if difficulty >= 3 and random.random() < 0.3:
                    item_type = 'bomb'
                else:
                    item_type = random.choice(['coin', 'diamond', 'bomb'])
                item_x = random.randint(0, 800 - 50)
                size_mult = random.uniform(0.9, 1.2)
                item_size = int(40 * size_mult)
                items.append([item_x, -30, item_type, item_size])
        # 移动和碰撞
        for item in items[:]:
            item[1] += item_speed
            item_size = item[3]
            player_rect = pygame.Rect(player_x, player_y, player_width, player_height)
            item_rect = pygame.Rect(item[0], item[1], item_size, item_size)
            if player_rect.colliderect(item_rect):
                if item[2] == 'coin':
                    score += 10
                    if coin_sound:
                        coin_sound.play()
                    effects.append([item[0] + item_size // 2, item[1] + item_size // 2, 'coin', 0])
                elif item[2] == 'diamond':
                    score += 50
                    if diamond_sound:
                        diamond_sound.play()
                    effects.append([item[0] + item_size // 2, item[1] + item_size // 2, 'diamond', 0])
                elif item[2] == 'bomb':
                    score -= 20
                    if bomb_sound:
                        bomb_sound.play()
                    effects.append([item[0] + item_size // 2, item[1] + item_size // 2, 'bomb', 0])
                items.remove(item)
            elif item[1] > 600:
                items.remove(item)
        # 更新特效
        for effect in effects[:]:
            effect[3] += 1
            if effect[3] > 8:
                effects.remove(effect)
        # ========== 速度升级(每350分) ==========
        item_speed = 5 + score // 350
        # 显示警告文字
        if warning_message:
            warning_text = big_font.render(warning_message, True, RED)
            text_width = warning_text.get_width()
            screen.blit(warning_text, (400 - text_width // 2, 250))
        # 绘制篮子
        draw_basket(screen, player_x, player_y, player_width, player_height)
        # 绘制掉落物
        for item in items:
            item_size = item[3]
            if item[2] == 'coin':
                draw_coin(screen, item[0], item[1], item_size)
            elif item[2] == 'diamond':
                draw_diamond(screen, item[0], item[1], item_size)
            else:
                draw_bomb(screen, item[0], item[1], item_size)
        # 绘制特效
        for effect in effects:
            if effect[2] == 'coin':
                draw_coin_effect(screen, effect[0], effect[1], effect[3])
            elif effect[2] == 'diamond':
                draw_diamond_effect(screen, effect[0], effect[1], effect[3])
            elif effect[2] == 'bomb':
                draw_explosion(screen, effect[0], effect[1], effect[3])
        # UI
        score_text = font.render(f"Score: {score}", True, BLACK)
        screen.blit(score_text, (10, 10))
        minutes = int(remaining) // 60
        seconds = int(remaining) % 60
        time_text = font.render(f"Time: {minutes:02d}:{seconds:02d}", True, RED)
        time_width = time_text.get_width()
        screen.blit(time_text, (780 - time_width, 10))
        speed_text = small_font.render(f"Speed: {item_speed}", True, GRAY)
        screen.blit(speed_text, (10, 565))
        diff_text = small_font.render(f"Difficulty: {difficulty}", True, (200, 100, 0))
        screen.blit(diff_text, (10, 50))
    else:
        # 游戏结束画面
        game_over_text = big_font.render("GAME OVER", True, RED)
        score_text = big_font.render(f"Final Score: {final_score}", True, BLACK)
        restart_text = font.render("Press R to restart", True, BLACK)
        game_over_width = game_over_text.get_width()
        score_width = score_text.get_width()
        restart_width = restart_text.get_width()
        screen.blit(game_over_text, (400 - game_over_width // 2, 200))
        screen.blit(score_text, (400 - score_width // 2, 300))
        screen.blit(restart_text, (400 - restart_width // 2, 400))
    pygame.display.update()
    clock.tick(60)
pygame.quit()

5、运行视频

https://www.bilibili.com/video/BV1zYJp6mEQp?vd_source=8c525a7a223f435adda579956a93ce88

三、实验过程中遇到的问题和解决过程

·问题1:没想到一开始做实验就卡在了第一步。我的pygame一直安装不了。
·问题1解决方案:最后去找了老师。弄了一个半小时才装好。发现是我原来安装路径不对。总之非常的感谢老师的神手,膜拜膜拜。
·问题2:初始代码过于简单
·问题2解决方案:最开始的时候感觉游戏太简单了,我就不断加功能。一开始没有特效,然后游戏元素都特别小。我就不断修改代码,比之前的改进了一些。
·问题3:游戏界面单调。
·问题3解决方案:针对这个问题我设置了画面渐变,看上去更好看一点。

四、本次实验总结

这次实验,我在大模型的辅助下完成了一个完整的Python小游戏。
首先,我学会了用pygame这个库来写游戏。从创建窗口、画图形,到让物品掉落、检测碰撞,每一步都让我对Python的实际应用有了更深的理解。
其次,在游戏设计上,我加入了一些自己的想法。比如设置难度(分数越高掉落越快)、加入特效(接住金币有闪光、炸弹有爆炸效果)、背景渐变(难度越高背景越红)等等。这些功能提升了游戏的体验感。虽然中间调试的时候遇到过不少bug,比如物品闪现、警告文字一直闪等等,不过都一个一个解决了,还是很有成就感滴。
另外,这次实验也让我意识到编程不只是写代码,还要考虑用户体验。比如鼠标控制比键盘更顺手、倒计时放右上角右对齐更美观、难度升级给个提示让玩家知道变化……这些细节对游戏的整体感受影响挺明显的。(这也是我自己写完代码后一遍一遍去体会出来的)。
总的来说,这次实验让我把课上学到的Python知识真正用到了一个完整的程序中。虽然代码还有很多可以优化的地方,但能够把一个想法从零到一实现出来,并且能跑、能玩,这个过程本身就很值得。

五、参考资料

六、全课总结

这学期的Python课程涵盖了从基础语法到综合应用的完整知识体系。

(一)Python语言基础

Python是一种跨平台的解释型高级语言,可以在Windows、Linux、macOS等操作系统上运行。它是解释型语言,代码由解释器逐行执行,无需编译,便于调试和快速开发。Python也是一种面向对象的语言,支持类和继承等编程范式。同时,Python是动态类型语言,变量不需要事先声明类型,在运行时自动确定。关于"Python"这个名字的来历,其英文含义是"蟒蛇",得名于作者Guido van Rossum喜爱的英国喜剧团体Monty Python。

(二)Python语法与语句

Python的核心语法包括:变量与数据类型(整数、浮点数、字符串、布尔值)、运算符(算术、比较、逻辑运算符)、条件语句(if-elif-else)、循环语句(for循环、while循环)、函数的定义与调用、模块的导入与使用。

(三)序列与数据结构

Python提供了丰富的内置数据结构。序列类型包括列表(list)、元组(tuple)、字符串(str)。其中列表是可变的,元组是不可变的。集合(set)用于存储不重复的无序元素,字典(dictionary)以键值对形式存储数据,通过键快速访问值。

(四)字符串与正则表达式

字符串操作是文本处理的基础,常用方法包括count()(统计子串出现次数)、find()(查找子串位置)、lower()/upper()(大小写转换)。正则表达式是一种强大的模式匹配工具,用于从文本中提取特定格式的信息。例如,手机号码的正则表达式13[4-9]\d{8}匹配以13开头、第三位为4-9、后跟8位数字的号码;15[01289]\d{8}匹配以15开头、第三位为0/1/2/8/9的号码。

(五)函数与面向对象编程

函数是组织代码的基本单元,通过def关键字定义,可以实现代码的复用和模块化。函数可以接收参数并返回值,支持位置参数、默认参数和关键字参数等传递方式。
面向对象编程是Python的核心编程范式,其三大特性为:封装(将数据和操作封装在类中)、继承(子类继承父类的属性和方法)、多态(不同对象对同一方法的不同实现)。通过class关键字定义类,__init__方法用于初始化对象属性。

(六)异常处理、文件操作与数据库

异常处理用于捕获程序运行时的错误,避免程序崩溃。主要方式有try-except、try-except-else和try-finally。
结构化数据是指有固定格式的数据,如Excel表格、数据库表;非结构化数据是指没有固定格式的数据,如文本、图片、视频。SQLite是一种轻量级嵌入式数据库,无需服务器配置,适合本地存储。
文件操作的基本步骤包括:open()打开文件、write()写入内容、seek()移动文件指针、close()关闭文件。文件读写模式包括:r(只读)、w(只写,覆盖)、a(追加)、b(二进制模式,适用于图片、音视频等非文本文件)。数据库的四个基本操作是增、删、改、查(INSERT、DELETE、UPDATE、SELECT)。

(七)爬虫

爬虫是自动抓取网页信息的程序,广泛应用于数据采集、舆情监测、搜索引擎等领域。学爬虫需要注意法律风险,未经授权抓取他人数据可能违反《网络安全法》《著作权法》等,这也是"从入门到入狱"说法的由来。
爬虫工作分为两步:爬取和解析。常用的爬取类库有requests、urllib;常用的解析模块有BeautifulSoup、lxml、re(正则表达式)。robots.txt是网站指定的爬虫协议,规定了哪些页面允许爬取、哪些不允许。使用代理服务可以隐藏真实IP,避免被目标网站封禁。设置Headers可以模拟浏览器访问,绕过简单的反爬虫机制。

七、课程感想与体会

一开始知道要学Python的时候真的是抗拒的。本人简直是个电脑白痴,对编程代码这些东西可谓是一窍不通。但是王老师带着我们,梳理知识点,然后时不时的编一些小程序(虽然大部分都是copy老师写的)我居然真的慢慢感受到了Python的魅力。
让我印象最深刻的是我们实验三那个通讯实验。我和我的实验搭子在成功连接上的那一刻真的是非常非常开心,就像世界上第一个接到电话的那个人一样开心。
在写代码的过程中,我也深刻体会到任何事情都不是一蹴而就的。很多时候最开始写出来的代码过于简单,或是有漏洞,无法运行,就需要不断调整,直至达到理想的效果。
在整个课程的过程中王老师也帮助了我特别多。尤其是实验四的时候,一下就帮我解决了一大难题!简直是男神级别。老师人真的很好,课上有的时候抽我们起来回答问题,答不出来也不会说我们什么(虽然但是还是得好好学)。老师直接让Python课的体验感上升很多。
谢谢老师的细心解答和对我们的包容,我一定会在学弟学妹面前狠狠夸奖!

八、课程意见和建议

1、其实这门课除了做实验没有什么太大的压力,所以大家上课都会稍微有点松懈。有的时候会在干别的事情。可以看看有什么监督机制让大家上课更专心一点,向对待专业课那样对待Python课(可以多来点考试,实践出真知!)。
2、我感觉就是那种双人合作的实验可以多来一点。因为是要两个人一起完成,所以心中就会有那种我不能耽误对方的时间,我们要快快高质完成这个实验的想法,对比个人实验的话态度会更认真一点(绝对没有说我个人实验不认真的意思)。
3、还有一个点就是,我们不是上课要抄老师的代码嘛,然后老师打字有点快,有的时候唰一下这几行就过掉了,中间空了几行,我就会觉得特难受,就有点摆烂不想抄了。以后还是可以稍微慢一点滴(或者有什么别的方法:比如说直接把代码给同学们)。
4、更多的建议就没有啦,老师本人直接让课程魅力度加加加。

posted @ 2026-06-14 09:36  周笑凡  阅读(1)  评论(0)    收藏  举报