课程:《Python程序设计》

班级: 1933

姓名: 白晨阳

学号:20193314

实验教师:王志强老师

实验日期:2021年6月13日

必修/选修: 公选课

实验内容:

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

实验要求:

(1)程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)10分

(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。10分。

(3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。5分

实验过程:

1:下面是一个爬虫的程序代码:

rom bs4 import BeautifulSoup

import re

import sys

import urllib

import xlwt

import sqlite3

def main():

'''主程序'''

baseurl = "https://movie.douban.com/top250?start="

datalist = getData(baseurl)

savepath = '豆瓣电影top250.xls'

saveData(savepath, datalist)

def askURL(url):

'''访问URL'''

headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"

}

req = urllib.request.Request(url=url, headers=headers)

html = ""

try:

response = urllib.request.urlopen(req)

html = response.read().decode("utf-8")

return html

except urllib.error.URLError as e:

if hasattr(e, "code"):

print(e.code)

if hasattr(e, "reason"):

print(e.reason)

def getData(baseurl):

'''获取数据'''

findLink = re.compile(r'')

findImg = re.compile(r'<img.src="(.?)"', re.S)

findTitle = re.compile(r'(.)')

findRating = re.compile(r'(.
)')

findJudge = re.compile(r'(\d)人评价')

findInq = re.compile((r'(.
)'))

findBd = re.compile(r'

(.*?)

', re.S)

datalist = []

for i in range(0, 11):

url = baseurl + str(i * 25)

html = askURL(url)

    soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all('div', class_="item"):
# print(item)
movie_data = []
item = str(item)
link = re.findall(findLink, item)[0]
movie_data.append(link)
img = re.findall(findImg, item)[0]
movie_data.append(img)
title = re.findall(findTitle, item)
if (len(title) == 2):
ctitle = title[0]
movie_data.append(ctitle)
otitle = title[1].replace("/", "")
movie_data.append(otitle)
else:
movie_data.append(title[0])
movie_data.append("")
rating = re.findall(findRating, item)[0]
movie_data.append(rating)
judge = re.findall(findJudge, item)[0]
movie_data.append(judge) inq = re.findall(findInq, item)
if (len(inq) != 0):
inq = inq[0].replace("。", "")
movie_data.append(inq)
else:
movie_data.append("")
bd = re.findall(findBd, item)[0]
bd = re.sub('<br(\s+)?/>(\s+)?', "", bd)
bd = re.sub("/", "", bd)
movie_data.append(bd.strip())
datalist.append(movie_data) # print(datalist)
return datalist

def saveData(savepath, datalist):

'''保存数据'''

workbook = xlwt.Workbook(encoding="utf-8", style_compression=0)

worksheet = workbook.add_sheet("豆瓣电影Top250", cell_overwrite_ok=True)

col = ("电影详情链接", "图片链接", "电影中文名", "电影外文名", "评分", "评价数", "描述", "相关信息")

for i in range(0, 8):

worksheet.write(0, i, col[i])

for i in range(0, 250):

# print("第%条" %(i+1))

data = datalist[i]

for j in range(0, 8):

worksheet.write(i + 1, j, data[j])

workbook.save('豆瓣电影top250.xls')

if name == 'main':

'''程序入口'''

main()

2:下面是一个贪吃蛇的小游戏:

程序如下:

def main():

pygame.init()

snake_speed_clock = pygame.time.Clock()

screen = pygame.display.set_mode((windows_width, windows_height))

screen.fill(white)

pygame.display.set_caption("贪吃蛇~")

show_start_info(screen)

while True:

music()

running_game(screen, snake_speed_clock)

show_end_info(screen)

def running_game(screen,snake_speed_clock):

start_x = random.randint(3, map_width - 8) ##开始位置

start_y = random.randint(3, map_height - 8)

snake_coords = [{'x': start_x, 'y': start_y}, ##初始贪吃蛇

{'x': start_x - 1, 'y': start_y},

{'x': start_x - 2, 'y': start_y}]

direction = RIGHT ##开始时向右移动

food = get_random_location() ##实物随机位置

while True:

for event in pygame.event.get():

if event.type == QUIT:

terminate()

elif event.type == KEYDOWN:

if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:

direction = LEFT

elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:

direction = RIGHT

elif (event.key == K_UP or event.key == K_w) and direction != DOWN:

direction = UP

elif (event.key == K_DOWN or event.key == K_s) and direction != UP:

direction = DOWN

elif event.key == K_ESCAPE:

terminate()

move_snake(direction, snake_coords) ##移动蛇

ret = snake_is_alive(snake_coords)
if not ret:
gameover_music()
break ##蛇死了. 游戏结束
snake_is_eat_food(snake_coords, food) ##判断蛇是否吃到食物 screen.fill(BG_COLOR)
draw_snake(screen, snake_coords)
draw_food(screen, food)
show_score(screen, len(snake_coords) - 3)
pygame.display.update()
snake_speed_clock.tick(snake_speed) ##控制fps

def draw_food(screen, food):

x = food['x'] * cell_size

y = food['y'] * cell_size

appleRect = pygame.Rect(x, y, cell_size, cell_size)

pygame.draw.rect(screen, red, appleRect)

def draw_snake(screen, snake_coords):

for coord in snake_coords:

x = coord['x'] * cell_size

y = coord['y'] * cell_size

wormSegmentRect = pygame.Rect(x,y,cell_size,cell_size)

pygame.draw.rect(screen, dark_blue, wormSegmentRect)

wormInnerSegmentRect = pygame.Rect(x+4,y+4,cell_size - 8, cell_size - 8)

pygame.draw.rect(screen, blue, wormInnerSegmentRect)

def move_snake(direction, snake_coords):

if direction == UP:

newHead = {'x':snake_coords[HEAD]['x'], 'y':snake_coords[HEAD]['y'] - 1}

elif direction == DOWN:

newHead = {'x':snake_coords[HEAD]['x'], 'y':snake_coords[HEAD]['y'] + 1}

elif direction == LEFT:

newHead = {'x':snake_coords[HEAD]['x'] - 1, 'y':snake_coords[HEAD]['y']}

elif direction == RIGHT:

newHead = {'x':snake_coords[HEAD]['x'] + 1, 'y':snake_coords[HEAD]['y']}

snake_coords.insert(0, newHead)

def snake_is_alive(snake_coords):

tag = True

头坐标超出地图范围

if(snake_coords[HEAD]['x'] == -1

or snake_coords[HEAD]['x'] == map_width

or snake_coords[HEAD]['y'] == -1

or snake_coords[HEAD]['y'] == map_height):

tag = False

头坐标等于身体某节坐标

for snake_body in snake_coords[1:]:

if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']:

tag = False

return tag

def snake_is_eat_food(snake_coords, food):

if(snake_coords[HEAD]['x'] == food['x'] and snake_coords[HEAD]['y'] == food['y']):

## 重新生成食物

food['x'] = random.randint(0, map_width - 1)

food['y'] = random.randint(0, map_height - 1)

else:

del snake_coords[-1] ##如果没有吃到实物, 就向前移动, 那么尾部一格删掉

def get_random_location():

return {'x':random.randint(0, map_width - 1),'y':random.randint(0, map_height - 1)}

def show_start_info(screen):

创建Font字体对象,使用render方法写字

font = pygame.font.Font("simsun.ttc", 40)

tip = font.render('按任意键开始游戏', True,(65,105,255))

加载图片

gamestart = pygame.image.load('startlogo.jpg').convert()

通过blit方法输出在屏幕上

screen.blit(gamestart,(140, 30))

screen.blit(tip,(240, 550))

刷新屏幕

pygame.display.update()

while True:

for event in pygame.event.get():

if event.type == QUIT:

terminate()

elif event.type == KEYDOWN: ##任意键按下

return

if (event.key == K_ESCAPE): ##若为ESC,则终止程序

terminate()

else:

return

def show_end_info(screen):

font = pygame.font.Font("simsun.ttc", 40)

tip = font.render("按ESC退出游戏,按任意键重新开始游戏",True,(65,105,255))

gamestart = pygame.image.load('gameover.png')

screen.blit(gamestart,(60, 0))

screen.blit(tip,(80, 300))

pygame.display.update()

while True:

for event in pygame.event.get():

if event.type == QUIT:

terminate()

elif event.type == KEYDOWN:

if event.key == K_ESCAPE:

terminate()

else:

return

def show_score(screen, score):

font = pygame.font.Font("simsun.ttc", 30)

scoreSurf = font.render("得分:%s" % score, True, green)

scoreRect = scoreSurf.get_rect()

scoreRect.topleft = (windows_width - 120, 10)

screen.blit(scoreSurf,scoreRect)

def terminate():

pygame.quit()

sys.exit()

实验结果:



实验问题:

问题1:编程能力不是很强

解决方案:在网上查资料和同学的帮助下解决(本次实验的贪吃蛇并非原创,而是在同学的基础的再加创新,解决了他以前一些漏洞)

问题2:部分程序模块没有

解决方案:去网页下载,用pycharm下载

问题3:贪吃蛇还有一些问题尚未解决(贪吃蛇的图片加载问题处理不了,未找到问题源头)

建议:

1:我觉得老师在上课的时候不必讲太多的硬性知识,应该侧重例子展示。

2:课上的例子我觉得可以结合一些热门来达到更好的效果,提高同学们注意力。

3:我觉得老师应该多布置一下作业,还有布置一下预习课程,这样课堂效果会提高一点

4:老师可以排一下位置,这样就可以不浪费宝贵的上课时间在考勤上了

5:老师上课可以多等等,保证学生都跟上

实验感想

在这里要感谢一下王志强老师,谢谢你把我带进python的大门,充实了我的课外生活,现在我每天都会去学习一点python小知识,感觉每天都过得充实而有趣,而且在与c语言的对比下,python显得更加简单可入门,但功能齐全。师父领进门,修行在个人,在接下来的时光中,我相信python会给我巨大的惊喜,我也将在python的道路上继续前行。

20193314白晨阳《Python程序设计》实验四 Python综合实践的更多相关文章

  1. Python程序设计实验报告四:循环结构程序设计(设计型实验)

    安徽工程大学 Python程序设计 实验报告 班级   物流191   姓名  姚彩琴  学号3190505129 成绩 日期     2020.4.8     指导老师       修宇 [实验名称 ...

  2. PYTHON程序设计实验

    Python程序设计实验报告一: 熟悉IDLE和在线编程平台 安徽工程大学 Python程序设计实验报告 班级 物流191 姓名 邹缕学号 3190505117成绩 ▁▁▁ 日期 2020.3.5 指 ...

  3. Python程序设计实验报告二:顺序结构程序设计(验证性实验)

      安徽工程大学 Python程序设计 实验报告 班级   物流191   姓名  崔攀  学号3190505136 成绩 日期     2020.3.22     指导老师       修宇 [实验 ...

  4. Python程序设计实验报告一:熟悉IDLE和在线编程平台

    安徽工程大学 Python程序设计 实验报告 班级   物流191   姓名  崔攀  学号3190505136 成绩_____           日期     2020.3.8     指导老师  ...

  5. Python程序设计 实验 1 熟悉 IDLE 和在线编程平台

    ------------恢复内容开始------------ 安徽工程大学 Python程序设计 实验报告 班级   物流191   姓名  姚彩琴  学号3190505129 成绩 日期     2 ...

  6. Python程序设计实验报告三:分支结构程序设计

    安徽工程大学 Python程序设计 实验报告 班级   物流191   姓名  姚彩琴  学号3190505129 成绩 日期     2020.4.5     指导老师       修宇 [实验目的 ...

  7. 实验四 Python综合实践

    课程:<Python程序设计> 班级:1843 姓名:章森洋 学号:20184307 实验教师:王志强 实验日期:2020年5月16日 必修/选修: 公选课 1.实验内容 此处填写实验的具 ...

  8. 20172314 Android程序设计 实验四

    课程:<程序设计与数据结构> 班级: 1723 姓名: 方艺雯 学号:20172314 实验教师:王志强 实验日期:2018年5月30日 必修/选修: 必修 1.实验内容及要求 (1)An ...

  9. .NET程序设计实验四

    实验四  文件操作 一.实验目的 1. 掌握窗口控件的使用方法: 2. 掌握文件系统的操作方法.File 类和 Directory类的使用. 二.实验要求 根据要求,编写 C#程序,并将程序代码和运行 ...

  10. python面试题四:Python web框架

    1 django.flask.tornado框架的比较? 2 什么是wsgi? WSGI的全称是Web Server Gateway Interface,翻译过来就是Web服务器网关接口.具体的来说, ...

随机推荐

  1. linux中大括号、小括号、中括号的区别和用法

    大括号 {  } 1.用于取多个变量 可以进行取变量和字符串拼接,假设:var='1234'       echo  ${var}abcd    输出为:1234abcd 2.正则表达式,用于大括号内 ...

  2. BIP弹框内容显示的隐藏

    viewModel.on("customInit", function (data) {         // 关闭或取消关原因详情--页面初始化         viewMode ...

  3. 输入流导致javax.crypto.BadPaddingException

    使用FileInputStream一切正常,切换为使用classpath从jar包读取getResourceAsStream一直报如下错误 javax.crypto.BadPaddingExcepti ...

  4. wake on lan magic packet

    局域网模式,必须电脑和手机在同一个 局域网,或者是网段内 外网模式  这个就是,你拿着手机,在任何地方,都可以开机电脑.

  5. GIT迁移仓库地址时如何保留分支和历史记录

    需求背景 GIT仓库(GitLab)所在服务器因某些原因要关停,相关服务需转移到另外一台机器上. 操作步骤 # clone项目 git clone --mirror http://192.168.12 ...

  6. mount无响应

    mount -t xfs /dev/sdb /data 挂载不成功,且命令无任何回显. dmesg 查看到有报错 tailf /var/log/messages -n 100 systemctl da ...

  7. 洛谷P4802 [CCO 2015]路短最

    题目 https://www.luogu.com.cn/problem/P4802 思路 数据范围 \(n\leq 18\),义眼丁真,鉴定为状压. 好,那我们来思考一下状态的构建.其实是很套路的东西 ...

  8. 打卡node day01--基础和fs内置模块

    一, 检查 node 版本 node -v 或 node --version 二,检查安装过的node 版本(nvm node 版本管理工具  安装链接 参考百度) nvm ls 三,切换node 版 ...

  9. vue3封装input组件

    使用了2种方法去封装input组件(.vue与.jsx) 代码如下 父组件: <template> <div> <h1>input组件封装</h1> & ...

  10. js-3part-Javascript使用Ajax

    getElementsByName使用方法如下是input标签,我们尝试从里面获取到csrf的value值. 这个csrf标签,是隐藏的,在浏览器页面element可以看到,在html源码里面,是看不 ...