python项目实战

文章

  • 项目1:外星人入侵游戏
  • 项目2:数据可视化
    • 2.1 matplotlib
    • 2.2 csv文件格式
    • 2.3 json文件格式
    • 2.4 使用Web API
      • 2.4.1 什么是Web API?
      • 2.4.2 处理API响应
    • 2.5 使用Pygal可视化仓库
  • 项目3:Web应用程序
    • 3.1 Django入门
      • 3.1.1 建立项目
      • 3.1.2 创建应用程序
      • 3.1.3 创建网页
    • 3.2 用户账户
      • 3.2.1 让用户能够输入数据
      • 3.2.2 创建用户账户
      • 3.2.3 让用户拥有自己的数据
    • 3.3 设置应用程序的样式并对其进行部署
    • 3.4 Python WEB框架之FastAPI
  • 参考文献

项目1:外星人入侵游戏

  • 回顾项目开发计划
  • 创建第一个外星人:Alien类
import pygame
from pygame.sprite import Spriteclass Alien(Sprite):"""A class to represent a single alien in the fleet."""def __init__(self, ai_settings, screen):"""Initialize the alien, and set its starting position."""super(Alien, self).__init__()self.screen = screenself.ai_settings = ai_settings# Load the alien image, and set its rect attribute.self.image = pygame.image.load('images/alien.bmp')self.rect = self.image.get_rect()# Start each new alien near the top left of the screen.self.rect.x = self.rect.widthself.rect.y = self.rect.height# Store the alien's exact position.self.x = float(self.rect.x)def check_edges(self):"""Return True if alien is at edge of screen."""screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueelif self.rect.left <= 0:return Truedef update(self):"""Move the alien right or left."""self.x += (self.ai_settings.alien_speed_factor *self.ai_settings.fleet_direction)self.rect.x = self.xdef blitme(self):"""Draw the alien at its current location."""self.screen.blit(self.image, self.rect)
  • 创建一群外星人
  • 让外星人移动
  • 射杀外星人
  • 结束游戏

game_functions.py

import sys
from time import sleepimport pygamefrom bullet import Bullet
from alien import Aliendef check_keydown_events(event, ai_settings, screen, ship, bullets):"""Respond to keypresses."""if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_SPACE:fire_bullet(ai_settings, screen, ship, bullets)elif event.key == pygame.K_q:sys.exit()def check_keyup_events(event, ship):"""Respond to key releases."""if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falsedef check_events(ai_settings, screen, ship, bullets):"""Respond to keypresses and mouse events."""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, ship, bullets)elif event.type == pygame.KEYUP:check_keyup_events(event, ship)def fire_bullet(ai_settings, screen, ship, bullets):"""Fire a bullet, if limit not reached yet."""# Create a new bullet, add to bullets group.if len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)def update_screen(ai_settings, screen, ship, aliens, bullets):"""Update images on the screen, and flip to the new screen."""# Redraw the screen, each pass through the loop.screen.fill(ai_settings.bg_color)# Redraw all bullets, behind ship and aliens.for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)# Make the most recently drawn screen visible.pygame.display.flip()def update_bullets(ai_settings, screen, ship, aliens, bullets):"""Update position of bullets, and get rid of old bullets."""# Update bullet positions.bullets.update()# Get rid of bullets that have disappeared.for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets)def check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets):"""Respond to bullet-alien collisions."""# Remove any bullets and aliens that have collided.collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)if len(aliens) == 0:# Destroy existing bullets, and create new fleet.bullets.empty()create_fleet(ai_settings, screen, ship, aliens)def check_fleet_edges(ai_settings, aliens):"""Respond appropriately if any aliens have reached an edge."""for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings, aliens)breakdef change_fleet_direction(ai_settings, aliens):"""Drop the entire fleet, and change the fleet's direction."""for alien in aliens.sprites():alien.rect.y += ai_settings.fleet_drop_speedai_settings.fleet_direction *= -1def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):"""Respond to ship being hit by alien."""if stats.ships_left > 0:# Decrement ships_left.stats.ships_left -= 1else:stats.game_active = False# Empty the list of aliens and bullets.aliens.empty()bullets.empty()# Create a new fleet, and center the ship.create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()# Pause.sleep(0.5)def check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets):"""Check if any aliens have reached the bottom of the screen."""screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:# Treat this the same as if the ship got hit.ship_hit(ai_settings, stats, screen, ship, aliens, bullets)breakdef update_aliens(ai_settings, stats, screen, ship, aliens, bullets):"""Check if the fleet is at an edge,then update the postions of all aliens in the fleet."""check_fleet_edges(ai_settings, aliens)aliens.update()# Look for alien-ship collisions.if pygame.sprite.spritecollideany(ship, aliens):ship_hit(ai_settings, stats, screen, ship, aliens, bullets)# Look for aliens hitting the bottom of the screen.check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets)def get_number_aliens_x(ai_settings, alien_width):"""Determine the number of aliens that fit in a row."""available_space_x = ai_settings.screen_width - 2 * alien_widthnumber_aliens_x = int(available_space_x / (2 * alien_width))return number_aliens_xdef get_number_rows(ai_settings, ship_height, alien_height):"""Determine the number of rows of aliens that fit on the screen."""available_space_y = (ai_settings.screen_height -(3 * alien_height) - ship_height)number_rows = int(available_space_y / (2 * alien_height))return number_rowsdef create_alien(ai_settings, screen, aliens, alien_number, row_number):"""Create an alien, and place it in the row."""alien = Alien(ai_settings, screen)alien_width = alien.rect.widthalien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberaliens.add(alien)def create_fleet(ai_settings, screen, ship, aliens):"""Create a full fleet of aliens."""# Create an alien, and find number of aliens in a row.alien = Alien(ai_settings, screen)number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)number_rows = get_number_rows(ai_settings, ship.rect.height,alien.rect.height)# Create the fleet of aliens.for row_number in range(number_rows):for alien_number in range(number_aliens_x):create_alien(ai_settings, screen, aliens, alien_number,row_number)

项目2:数据可视化

2.1 matplotlib

2.2 csv文件格式

csv文件对人来说阅读起来比较麻烦,但程序可轻松提取并处理其中的值。

为什么使用csv文件格式?

CSV是纯文本文件,它使数据交换更容易,也更易于导入到电子表格或数据库存储中。例如:您可能希望将某个统计分析的数据导出到CSV文件,然后将其导入电子表格以进行进一步分析。总体而言,它使用户可以通过编程轻松地体验工作。任何支持文本文件或字符串操作的语言(例如Python)都可以直接使用CSV文件。

处理天气数据示例

数据来源:

www.wunderground.com/history
import csv
from datetime import datetimefrom matplotlib import pyplot as plt# Get dates, high, and low temperatures from file.
filename = 'your_csv_file.csv'
with open(filename) as f:reader = csv.reader(f)header_row = next(reader)dates, highs, lows = [], [], []for row in reader:try:current_date = datetime.strptime(row[0], "%Y-%m-%d")high = int(row[1])low = int(row[3])except ValueError:print(current_date, 'missing data')else:dates.append(current_date)highs.append(high)lows.append(low)# Plot data.
fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red', alpha=0.5)
plt.plot(dates, lows, c='blue', alpha=0.5)
plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)# Format plot.
title = "Daily high and low temperatures - 2014\nDeath Valley, CA"
plt.title(title, fontsize=20)
plt.xlabel('', fontsize=16)
fig.autofmt_xdate()
plt.ylabel("Temperature (F)", fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=16)plt.show()

2.3 json文件格式

为什么使用json?

填充的数据结构需要从任何语言转换为其他语言和平台可识别的格式。JavaScript Object Notation (JSON) 是实现这一任务的数据交换格式。JSON 采用人类可读的轻量级文本,而且只需更少的编码,处理速度更快,因此成为一种深受开发人员欢迎的数据格式。

2.4 使用Web API

使用Web应用编程接口(API)自动请求网站的特定信息而不是整个网页,再对这些信息进行实时可视化。

2.4.1 什么是Web API?

Web API是网站的一部分,用于与使用非常具体的URL请求特定信息的程序交互。这种请求称为API调用。请求的数据将以易于处理的格式(如json或csv)返回。依赖于外部数据源的大多数应用程序都依赖于API调用,如集成社交媒体网站的应用程序。

2.4.2 处理API响应

$ pip install --user requests

python_repos.py

import requests# 执行API调用并存储响应
url = 'https://api.github.com/search/repositories?q=language:python&sort=stars'
r = request.get(url)
print("Status code:", r.status_code)# 将API响应存储在一个变量中
response_dict = r.json()# 处理结果
print(response_dict.keys())

结果

Status code: 200
dict_key(['item','total_count','incomplete_results'])

2.5 使用Pygal可视化仓库

建立柱状图等

项目3:Web应用程序

3.1 Django入门

Django是一个Web框架 —— 一套用于帮助开发交互式网站的工具。

https://www.djangoproject.com/

3.1.1 建立项目

  • 制定规范
  • 建立、安装、激活虚拟环境
  • 安装Django并在其中创建项目
  • 创建数据库

3.1.2 创建应用程序

  • 定义模型:model.py
  • 激活模型:settings.py
  • Django管理网站:admin.py

3.1.3 创建网页

  • 映射URL:urls.py
"""Defines url patterns for users."""from django.conf.urls import url
from django.contrib.auth.views import loginfrom . import viewsurlpatterns = [# Login page.url(r'^login/$', login, {'template_name': 'users/login.html'},name='login'),# Logout page.url(r'^logout/$', views.logout_view, name='logout'),# Registration page. url(r'^register/$', views.register, name='register'),
]
  • 编写视图:views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.forms import UserCreationFormdef logout_view(request):"""Log the user out."""logout(request)return HttpResponseRedirect(reverse('learning_logs:index'))def register(request):"""Register a new user."""if request.method != 'POST':# Display blank registration form.   form = UserCreationForm()else:# Process completed form.form = UserCreationForm(data=request.POST)if form.is_valid():new_user = form.save()# Log the user in, and then redirect to home page.authenticated_user = authenticate(username=new_user.username,password=request.POST['password1'])login(request, authenticated_user)return HttpResponseRedirect(reverse('learning_logs:index'))context = {'form': form}return render(request, 'users/register.html', context)
  • 编写模板:index.html

创建其他网页

  • 模板继承

3.2 用户账户

3.2.1 让用户能够输入数据

3.2.2 创建用户账户

  • 应用程序users
  • 登陆页面
  • 注销
  • 注册页面

3.2.3 让用户拥有自己的数据

3.3 设置应用程序的样式并对其进行部署

3.4 Python WEB框架之FastAPI

Django各种功能都糅杂在一起;Flask 框架简单,但只是单线程需要自己改造才支持多并发

FastAPI貌似结合弥补了Flask 框架的缺陷,如果你想要快速搭建一个WEB服务,用FastAPI准没错。

pip install fastapi uvicorn python-multipart

示例

from fastapi import FastAPI
import uvicornapp = FastAPI()@app.get("/")
def index():return "Hello World"if __name__ == "__main__":uvicorn.run(app, host="0.0.0.0", port=8000)

运行起来之后,应该会看到下面的画面:
在这里插入图片描述
浏览器访问你的ip地址加端口号,应该就能看到“Hello World”。


from datetime import datetime
from typing import Listfrom fastapi import FastAPI, Request, UploadFile, File
import uvicorn
from starlette.middleware.cors import CORSMiddleware
from starlette.responses import FileResponse
from starlette.staticfiles import StaticFilesapp = FastAPI()
# 添加CORS中间件
app.add_middleware(CORSMiddleware,allow_origins=["*"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)app.mount("/static", StaticFiles(directory="static"), name="static_resources")@app.get("/")
def index():return "Hello World"@app.get("/index")
def home():return FileResponse("static/index.html")@app.get("/info")
def handle_info(name, age):return f"Hello World, {name}, {age}"@app.post("/request")
def handle_info(params: Request):return params.query_params@app.post("/request")
async def handle_info1(params: Request):form = dict(await params.form())return form# 图片批量上传
@app.post('/upload')
async def upload_file(params: Request, files: List[UploadFile] = File(...)):form = dict(await params.form())save_files = []for file in files:temp_arr = file.filename.split(".")suffix = temp_arr[len(temp_arr) - 1]file_name = f"img_{datetime.now().strftime('%Y%m%d%H%M%S%f')}.{suffix}"with open(file_name, "wb") as f:content = await file.read()  # 读取上传文件的内容f.write(content)  # 将内容写入文件save_files.append(file_name)return {"code": 200,"data": {"params": form,"save_files": save_files}}if __name__ == "__main__":uvicorn.run(app, host="0.0.0.0", port=8000)

本节参考:https://blog.csdn.net/qq_36991535/article/details/132522146

参考文献

《Python编程:从入门到实践》【美】Eric Matthes 著 袁国忠 译 : https://www.ituring.com.cn/book/1861

Dive Into Python: https://diveintopython.org/learn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/112163.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis怎么测试?

有些测试朋友来问我&#xff0c;redis要怎么测试&#xff1f;首先我们需要知道&#xff0c;redis是什么&#xff1f;它能做什么&#xff1f; redis是一个key-value类型的高速存储数据库。 redis常被用做&#xff1a;缓存、队列、发布订阅等。 所以&#xff0c;“redis要怎么…

视频批量剪辑矩阵分发系统源码开源分享----基于PHP语言

批量剪辑视频矩阵分发&#xff1a; 短视频seo主要基于抖音短视频平台&#xff0c;为企业实现多账号管理&#xff0c;视频分发&#xff0c;视频批量剪辑&#xff0c;抖音小程序搭建&#xff0c;企业私域转化等&#xff0c;本文主要介绍短视频矩阵系统抖音小程序开发详细及注意事…

linux创建进程

linux创建进程 准备工作 准备工作 在Ubuntu64系统上 1、安装GCC和Make工具 编译器GCC&#xff1a;把C源码转为二进制程序 Make&#xff1a;自动编译多源文件项目 sudo apt-get update #更新存储库 sudo apt-get install build-essential #安装build-essential包 gcc --versio…

023 - STM32学习笔记 - 扩展外部SDRAM(二) - 扩展外部SDRAM实验

023- STM32学习笔记 - 扩展外部SDRAM&#xff08;一&#xff09; - 扩展外部SDRAM实验 本节内容中要配置的引脚很多&#xff0c;如果你用的开发板跟我的不一样&#xff0c;请详细参照STM32规格书中说明对相关GPIO引脚进行配置。 先提前对本届内容的变成步骤进行总结如下&…

C# 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

C# 在调用Cdll时&#xff0c;可能会出现 &#xff1a;试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)这个错误。 一般情况下是C#目标平台跟Cdll不兼容&#xff0c;64位跟32位兼容性问题&#xff0c; a.客户端调用Cdll报的错则&#xff0c; 1)允许的话把C#客户端…

C语言程序设计——小学生计算机辅助教学系统

题目&#xff1a;小学生计算机辅助教学系统 编写一个程序&#xff0c;帮助小学生学习乘法。然后判断学生输入的答案对错与否&#xff0c;按下列任务要求以循序渐进的方式分别编写对应的程序并调试。 任务1 程序首先随机产生两个1—10之间的正整数&#xff0c;在屏幕上打印出问题…

数据库——事务,事务隔离级别

文章目录 什么是事务?事务的特性(ACID)并发事务带来的问题事务隔离级别实际情况演示脏读(读未提交)避免脏读(读已提交)不可重复读可重复读防止幻读(可串行化) 什么是事务? 事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 事务最经典也经常被拿出…

研磨设计模式day12命令模式

目录 定义 几个参数 场景描述 代码示例 参数化设置 命令模式的优点 本质 何时选用 定义 几个参数 Command&#xff1a;定义命令的接口。 ConcreteCommand:命令接口的实现对象。但不是真正实现&#xff0c;是通过接收者的功能来完成命令要执行的操作 Receiver&#x…

创建web应用程序,React和Vue怎么选?

React和Vue都是创建web应用程序的绝佳选择。React得到了科技巨头和庞大的开源社区的支持&#xff0c;代码库可以很大程度地扩展&#xff0c;允许你创建企业级web应用程序。React拥有大量合格甚至优秀的开发人员粉丝&#xff0c;可以解决你在开发阶段可能遇到的任何问题。 毫无疑…

视频汇聚/视频云存储/视频监控管理平台EasyCVR新增首次登录强制修改密码

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚平台既具…

机器学习:无监督学习

文章目录 线性学习方法聚类ClusteringKmeansHAC 分布表示降维PCAMatrix FactorizationManifold LearningLLELaplacian Eigenmapst-SEN 线性学习方法 聚类Clustering Kmeans 随机选取K个中心&#xff0c;然后计算每个点与中心的距离&#xff0c;找最近的&#xff0c;然后更新中…

感觉车载测试的这一波敏捷风快过去了

敏捷&#xff0c;算不得汽车行业的原生产物&#xff0c;几年前&#xff0c;耳边很少听到这个字眼&#xff0c;基本算是在近几年传统汽车行业开始衰落的大背景下&#xff0c;而后伴随着软件从互联网等行业传进来的。 这两年&#xff0c;大家开始把敏捷谈得风生水起&#xff0c;…

如何保证跨境传输的安全性?

随着互联网时代的到来&#xff0c;全球文件传输频率不断增加&#xff0c;市场经济的发展也对信息共享提出更高要求。传统电话交流已无法满足跨国企业的需求&#xff0c;企业内部诸如Web、电子邮件、企业资源计划&#xff08;ERP&#xff09;、网络电话&#xff08;VOIP&#xf…

面试了38位Java候选人之后,我总结出了他们关于面试中的16条通病

都说现在Java面试卷&#xff0c;前段时间项目招人的时候&#xff0c;我刚好就作为面试官面试了一些人 在整个面试的过程中&#xff0c;我就发现了一些关于面试的通病 所以呢&#xff0c;趁着这次金&#xff08;铜&#xff09;九银&#xff08;铁&#xff09;十的机会&#xf…

WebAssembly 在云原生中的实践指南

1 WebAssembly 介绍 WebAssembly&#xff08;Wasm&#xff09;是一种通用字节码技术&#xff0c;它可以将其他编程语言&#xff08;如 Go、Rust、C/C 等&#xff09;的程序代码编译为可在浏览器环境直接执行的字节码程序。 WebAssembly 的初衷之一是解决 JavaScript 的性能问…

4、Spring之Bean生命周期源码解析(创建)

Spring最重要的功能就是帮助程序员创建对象(也就是IOC),而启动Spring就是为创建Bean对象做准备,所以我们先明白Spring到底是怎么去创建Bean的,也就是先弄明白Bean的生命周期。 Bean的生命周期就是指:在Spring中,一个Bean是如何生成的,如何销毁的。 Bean生命周期流程图…

C语言练习题解析:挑战与突破,开启编程新篇章!(2)

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言刷题专栏&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…

ssm端游游戏账号销售管理系统源码和论文

ssm端游游戏账号销售管理系统源码和论文069 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面…

电脑上的视频如何导入苹果手机?

AirDroid支持Windows、macOS、android、iOS相互传输文件、视频、图片等。 想要从电脑传输文件到iPhone也很简单&#xff0c;在电脑和iPhone都安装AirDroid&#xff0c;连接同一网络&#xff0c;然后登录同一个帐号就可以了。可绑定的iPhone数量不限&#xff0c;只要都登录同一…

测试理论与方法----软件测试工作流程第一个环节:提取测试需求

测试理论与方法 一、软件测试流程 1、软件测试定义 软件&#xff1a;程序数据文档&#xff1a;不仅仅包含应用程序&#xff0c;还应该包含和这个程序相关的数据&#xff0c;文档 软件测试&#xff1a;测试的对象&#xff1a;应用程序&#xff0c;数据&#xff0c;文档 软件…