文章目录
CH10. 模块及常用的第三方模块
模块的简介
- 在Python中,一个后缀名为
.py
的Python文件就是一个模块 - 模块中可以定义函数、类等
- 模块也可以避免函数、类、变量等名称相冲突的问题
- 模块不仅提高了代码的可维护性,同时还提高了代码的可重用性
- 在给模块命名的时候要求全部使用小写字母,多个单词之间使用下划线进行分隔
- 如果自定义模块名称与系统内置模块名称相同,那么在导入时会优先导入自定义的模块
模块的分类
- 系统内置模块:由开发人员编写好的模块,在安装Python解释器时,一同安装到计算机
- 自定义模块:一个以
.py
结尾的文件就是一个模块,新建Python文件,实际上就是在新建模块
# my_info.c
name = 'Folin'
time = '2024-09-28 22:15:00'
def info():
print(f'my_info module was written by {name} at {time}!')
# introduce.py
name = 'Folin'
age = 18
def info():
print(f'姓名:{name},年龄:{age}')
自定义模块的作用
- 一是规范代码,将功能相同的函数、类等封装到一个模块中,让代码更易于阅读
- 另外一个目的与系统内置模块相同,即可以被其他模块调用,提高开发效率
模块的导入
- 模块编写完成就可以被其他模块进行调用并使用被调用模块中的功能
- import导入方式的语法结构:
import 模块名称 [as 别名]
- from … import 导入方式的语法结构:
from 模块名称 import 变量/函数/类/*
import my_info
print(my_info.name)
my_info.info()
import my_info as a
print(a.name)
print(a.time)
from my_info import name
print(name)
from my_info import *
my_info.info()
- 导入模块中具有同名的变量和函数,后导入的会将之前导入的进行覆盖
from introduce import *
from my_info import *
info() # my_info 后导入,info为my_info.info()
import introduce
import my_info
introduce.info()
my_info.info()
'''
my_info module was written by Folin at 2024-09-28 22:15:00!
姓名:Folin,年龄:18
my_info module was written by Folin at 2024-09-28 22:15:00!
'''
Python中的包
包
- 含有
__init__.py
文件的文件夹(目录) - 可以避免模块名称相冲突的问题
admin
__init__.py
my_admin.py
test_package_import.py
# package_test\admin\__init__.py
print('Author: Folin')
print('learing Python package')
# package_test\admin\my_admin.py
def info():
print('大家好,我叫Folin,今年18岁!')
name = 'Folin'
# package_test\test_package_import.py
import admin.my_admin as a # 包名.模块名
a.info()
print('-'*50)
from admin import my_admin as b
b.info()
# __init__.py中的信息打印只会执行一次
print('-'*50)
from admin.my_admin import info
info()
print('-'*50)
from admin.my_admin import *
print(name)
'''
Author: Folin
learing Python package
大家好,我叫Folin,今年18岁!
--------------------------------------------------
大家好,我叫Folin,今年18岁!
--------------------------------------------------
大家好,我叫Folin,今年18岁!
--------------------------------------------------
Folin
'''
主程序运行
- 以主程序运行,在该模块被导入到其他模块时,该
__main__
中的代码将不会被执行
if __name__ == '__main__':
pass
- 代码示例
module_a.py
module_b.py
# module_a.py
print('Welcome to Nanjing')
name = 'Folin'
print(name)
# module_b.py
import module_a
执行结果:
PS D:\2_Demolight\python\study-plan\single-files> & C:/Python312/python.exe d:/2_Demolight/python/study-plan/single-files/package_test/module_b.py
Welcome to Nanjing
Folin
- 主程序运行
# module_a.py
# print('Welcome to Nanjing')
# name = 'Folin'
# print(name)
# 主程序
if __name__ == '__main__':
print('Welcome to Nanjing')
name = 'Folin'
print(name)
# module_b.py
import module_a
# module_a中的打印输出将不会被执行
执行结果:
PS D:\2_Demolight\python\study-plan\single-files> & C:/Python312/python.exe d:/2_Demolight/python/study-plan/single-files/package_test/module_b.py
PS D:\2_Demolight\python\study-plan\single-files>
Python中常用的内置模块
- 在安装Python解释器时与解释器一起安装进来的模块被称为系统内置模块,也被称为标准模块或标准库
标准库名称 | 功能描述 |
---|---|
os | 与操作系统和文件相关操作有关的模块 |
re | 用于在Python的字符串中执行正则表达式的模块 |
random | 用于产生随机数的模块 |
json | 用于对高维数据进行编码和解码的模块 |
time | 与时间相关的模块 |
datetime | 与日期时间相关的模块,可以方便的显示日期并对日期进行计算 |
random模块
- random模块是Python中用于产生随机数的标准库
函数名称 | 功能描述 |
---|---|
seed(x) | 初始化给定的随机数种子,默认为当前系统时间 |
random() | 产生一个[0.0, 1.0)之间的随机小数 |
randint(a, b) | 生成一个[a, b]之间的整数 |
randrange(m, n, k) | 生成一个[m, n)之间步长为k的随机整数 |
uniform(a, b) | 生成一个[a, b]之间的随机小数 |
choice(seq) | 从序列中随机选择一个元素 |
shuffle(seq) | 将序列seq中元素随机排列,返回打乱后的序列 |
import random
# 设置随机数的种子
random.seed(10)
print(random.random()) # [0, 1)
print(random.random())
print('-'*40)
random.seed(10)
print(random.randint(1, 100)) # [1, 100]
print('-'*40)
for i in range(10):
print(random.randrange(1, 10, 3))
print('-'*40)
print(random.uniform(1, 100))
print('-'*40)
lst = [i for i in range(1, 11)]
print(random.choice(lst))
print(random.choice(lst))
print('-'*40)
print(lst)
random.shuffle(lst)
print(lst)
'''
0.5714025946899135
0.4288890546751146
----------------------------------------
74
----------------------------------------
1
4
4
7
1
1
4
4
4
7
----------------------------------------
81.25126013057475
----------------------------------------
1
9
----------------------------------------
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[5, 4, 7, 1, 3, 9, 10, 2, 6, 8]
'''
time模块
- time模块是Python中提供的用于处理时间的标准库,可以用来进行时间处理、时间格式化和计时等
函数名称 | 功能描述 |
---|---|
time() | 获取当前时间戳 |
localtime(sec) | 获取指定时间戳对应的本地时间的struct_time 对象 |
ctime() | 获取当前时间戳对应的易读字符串 |
strftime() | 格式化时间,结果为字符串 |
strptime() | 提取字符串的时间,结果为struct_time 对象 |
sleep(sec) | 休眠sec秒 |
格式化字符串 | 日期/时间 | 取值范围 |
---|---|---|
%Y | 年份 | 0001~9999 |
%m | 月份 | 01~12 |
%B | 月名 | January~December |
%d | 日期 | 01~31 |
%A | 星期 | Monday~Sunday |
%H | 小时(24小时制) | 00~23 |
%I | 小时(12小时制) | 01~12 |
%M | 分钟 | 00~59 |
%S | 秒 | 00~59 |
import time
now = time.time()
print(now)
obj = time.localtime() # 默认当前时间
print(obj)
print(time.ctime())
# 日期时间格式化
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
print(time.strftime('%Y %B %A %H:%M:%S', time.localtime()))
print(time.strptime('2024-10-14', '%Y-%m-%d'))
time.sleep(5)
print('Hello Python')
'''
1728918297.6053212
time.struct_time(tm_year=2024, tm_mon=10, tm_mday=14, tm_hour=23, tm_min=4, tm_sec=57, tm_wday=0, tm_yday=288, tm_isdst=0)
Mon Oct 14 23:04:57 2024
2024-10-14 23:04:57
2024 October Monday 23:04:57
time.struct_time(tm_year=2024, tm_mon=10, tm_mday=14, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=288, tm_isdst=-1)
Hello Python
'''
datetime模块
- datetime模块可以更方便的显示日期并对日期进行运算
类名 | 功能描述 |
---|---|
datetime.datetime | 表示日期时间的类 |
datetime.timedelta | 表示时间间隔的类 |
datetime.date | 表示日期的类 |
datetime.time | 表示时间的类 |
datetime.tzinfo | 时区相关的类 |
datetime类
from datetime import datetime
cur_datetime = datetime.now()
print('当前的系统时间为:',cur_datetime)
# datetime是一个类,手动创建这个类的对象
dt = datetime(2024, 10, 20, 20, 45, 30)
print('dt的数据类型:',type(dt))
print('dt所表示的日期时间:', dt)
print(f'年:{dt.year}, 月:{dt.month}, 日:{dt.day}')
# 比较两个日期的大小
labor_day = datetime(2025, 5, 1, 0, 0, 0)
national_day = datetime(2025, 10, 1, 0, 0, 0)
print('2025年5月1日比2025年10月1日早吗? ', labor_day < national_day)
# datetime类型与字符串进行转换
now_dt = datetime.now()
now_dt_str = now_dt.strftime('%Y/%m/%d %H:%M:%S')
print('now_dt的数据类型:', type(now_dt), 'nowdt所表示的数据:', now_dt)
print('now_dt_str的数据类型:', type(now_dt_str), 'now_dt_str所表示的数据:', now_dt_str)
# 字符串转换为datetime类型
str_dt = '2026年11月11日 11点11分11秒'
dt3 = datetime.strptime(str_dt, '%Y年%m月%d日 %H点%M分%S秒')
print('str_dt的数据类型:', type(str_dt), 'str_dt所表示的数据:', str_dt)
print('dt3的数据类型:', type(dt3), 'dt3所表示的数据:', dt3)
'''
前的系统时间为: 2024-10-20 21:47:17.923766
dt的数据类型: <class 'datetime.datetime'>
dt所表示的日期时间: 2024-10-20 20:45:30
年:2024, 月:10, 日:20
2025年5月1日比2025年10月1日早吗? True
now_dt的数据类型: <class 'datetime.datetime'> nowdt所表示的数据: 2024-10-20 21:47:17.923766
now_dt_str的数据类型: <class 'str'> now_dt_str所表示的数据: 2024/10/20 21:47:17
str_dt的数据类型: <class 'str'> str_dt所表示的数据: 2026年11月11日 11点11分11秒
dt3的数据类型: <class 'datetime.datetime'> dt3所表示的数据: 2026-11-11 11:11:11
'''
timedalta类
from datetime import datetime, timedelta
# 创建两个datetime类的对象,相减可以得到timedelta对象
delta1 = datetime(2025, 2, 5) - datetime(2024, 10, 20)
print('delta1的数据类型:', type(delta1), 'delta1所表示的数据', delta1)
print('2024年10月20日之后的第108天是:', datetime(2024, 10, 20) + delta1)
# 创建timedelta对象
td1 = timedelta(10) # 10天
print(td1)
td2 = timedelta(10,10) # 10天10秒
print(td2)
'''
delta1的数据类型: <class 'datetime.timedelta'> delta1所表示的数据 108 days, 0:00:00
2024年10月20日之后的第108天是: 2025-02-05 00:00:00
10 days, 0:00:00
10 days, 0:00:10
'''
第三方模块的安装与卸载
- 第三方模块由全球Python爱好者、程序员、各行各业的专家进行开发并进行维护
- 安装第三方模块的语法:
pip install 模块名称
- 使用其他镜像源安装:
pip install 模块名 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
- 使用其他镜像源安装:
- 卸载第三方模块的语法:
pip uninstall 模块名称
- 升级pip命令的语句结构:
python -m pip install --upgrade pip
常用的第三方模块
requests
- 被称为requests库,是用于处理HTTP(Hypertext Transfer Protocol超文本传输协议)请求的第三方库,该库在爬虫程序中应用非常广泛。
- 使用requests库中的
get()
函数可以打开一个网络请求,并获取一个Response响应对象。响应结果中的字符串数据可以通过响应对象的text
属性获取,响应结果中除了有字符串数据也有二进制数据,响应结果中的二进制数据可以通过相应对象的content
属性获取
# 获取景区推荐的天气预报
import re
import requests
# 浏览器网页
url = 'https://www.weather.com.cn/weather40d/101190101.shtml'
rsp = requests.get(url) # 打开浏览器并打开网址
rsp.encoding = 'utf-8' # 设置编码格式,支持中文
# print(rsp.text) # rsp相应对象,对象名.属性名
'''
<span class="name">三亚</span>
<span class="weather">小雨</span>
<span class="wd">25/30℃</span>
<span class="zs">适宜</span>
'''
city = re.findall('<span class="name">([\u4e00-\u9fa5]*)</span>', rsp.text)
weather = re.findall('<span class="weather">([\u4e00-\u9fa5]*)</span>', rsp.text)
wd = re.findall('<span class="wd">(.*)</span>', rsp.text)
zs = re.findall('<span class="zs">([\u4e00-\u9fa5]*)</span>', rsp.text)
# print(city)
# print(weather)
# print(wd)
# print(zs)
lst = []
for a,b,c,d in zip(city, weather, wd, zs):
lst.append([a,b,c,d])
print(lst)
for item in lst:
print(item)
'''
[['景区', '天气', '气温', '旅游指数'], ['三亚', '小雨', '25/30℃', '适宜'], ['九寨沟', '多云转小雨', '12/23℃', '适宜'], ['大理', '多云转小雨', '12/21℃', '适宜'], ['张家界', '小雨', '11/17℃', '适宜'], ['桂林', '多云', '19/27℃', '适宜'], ['青岛', '小雨转阴', '13/17℃', '适宜']]
['景区', '天气', '气温', '旅游指数']
['三亚', '小雨', '25/30℃', '适宜']
['九寨沟', '多云转小雨', '12/23℃', '适宜']
['大理', '多云转小雨', '12/21℃', '适宜']
['张家界', '小雨', '11/17℃', '适宜']
['桂林', '多云', '19/27℃', '适宜']
['青岛', '小雨转阴', '13/17℃', '适宜']
'''
import requests
# 爬取百度logo图片
url = 'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'
rsp = requests.get(url)
# 保存到本地
with open('./baidu_logo.png', 'wb') as file:
file.write(rsp.content)
openpyxl
- openpyxl模块是用于处理Excel文件的第三方库
- 可以对Excel文件中的数据进行写入和读取
函数/属性名称 | 功能描述 |
---|---|
load_workbook(filename) | 打开已存在的表格,结果为工作簿对象 |
workbook.sheetnames | 工作簿对象的sheetnames 属性,用于获取所有工作表的名称,结果为列表类型 |
sheet.append(lst) | 向工作表中添加一行数据,新数据接在工作表已有数据的后面 |
workbook.save(excelname) | 保存工作簿 |
Workbook() | 创建新的工作簿对象 |
# weather.py
import re
import requests
def get_html():
# 浏览器网页
url = 'https://www.weather.com.cn/weather40d/101190101.shtml'
rsp = requests.get(url) # 打开浏览器并打开网址
rsp.encoding = 'utf-8' # 设置编码格式,支持中文
# print(rsp.text) # rsp相应对象,对象名.属性名
return rsp.text
'''
<span class="name">三亚</span>
<span class="weather">小雨</span>
<span class="wd">25/30℃</span>
<span class="zs">适宜</span>
'''
def parse_html(html_str):
city = re.findall('<span class="name">([\u4e00-\u9fa5]*)</span>', html_str)
weather = re.findall('<span class="weather">([\u4e00-\u9fa5]*)</span>', html_str)
wd = re.findall('<span class="wd">(.*)</span>', html_str)
zs = re.findall('<span class="zs">([\u4e00-\u9fa5]*)</span>', html_str)
# print(city)
# print(weather)
# print(wd)
# print(zs)
lst = []
for a,b,c,d in zip(city, weather, wd, zs):
lst.append([a,b,c,d])
return lst
# test_module_openpyxl.py
import openpyxl
import weather
html = weather.get_html() # 发请求,获取响应结果
lst = weather.parse_html(html) # 解析数据
# 创建一个新的excel工作簿
workbook = openpyxl.Workbook()
# 在Excel工作簿中创建工作表
sheet = workbook.create_sheet('景区天气')
# 向工作表中添加数据
for item in lst:
sheet.append(item)
workbook.save('景区天气.xlsx')
# test_module_openpyxl_read.py
import openpyxl
# 打开工作簿
workbook = openpyxl.load_workbook('景区天气.xlsx')
# 选择要操作的工作表
sheet = workbook['景区天气']
# 表格数据是二维列表,先遍历的是行,后遍历的是列
lst = []
for row in sheet.rows:
sublst = []
for cell in row:
sublst.append(cell.value)
lst.append(sublst)
for item in lst:
print(item)
'''
['景区', '天气', '气温', '旅游指数']
['三亚', '多云', '22/31℃', '适宜']
['九寨沟', '多云转小雨', '8/20℃', '适宜']
['大理', '晴', '5/22℃', '适宜']
['张家界', '中雨转小雨', '15/23℃', '一般']
['桂林', '多云', '23/31℃', '适宜']
['青岛', '多云', '15/20℃', '适宜']
'''
pdfplumber
- pdfplumber可用于从PDF文件中读取内容
import pdfplumber
with pdfplumber.open('Python3.12.4基础内容.pdf') as pdf:
for page in pdf.pages: # 遍历页
print(page.extract_text())
print(f'-------第{page.page_number}页结束-------')
if page.page_number >= 6:
break
Numpy
- 是Python数据分析方向和其他库的依赖库,用于处理数组、矩阵等数据
# 利用numpy模块对图片进行灰度处理
import matplotlib.pyplot as plt
import numpy as np
# 读取图片
n1 = plt.imread('baidu_logo.png')
# 三维数组,最高维度表示图像的高,次高维度表示图像的宽,最低维表示[R, G, B]颜色
print(type(n1), n1) # png通道数不同,后面dot计算会有差别
plt.imshow(n1)
# 编写一个灰度的公式
n2 = np.array([0.299, 0.587, 0.114])
# 将数组n1(RGB)颜色值与数组n2(灰度公式固定值),进行点乘运算
x = np.dot(n1[..., :3], n2)
# 传入数组,显示灰度
plt.imshow(x, cmap='gray')
# 显示图像
plt.show()
Pandas and Matplotlib
- pandas是基于numpy模块扩展的一个非常重要的数据分析模块,使用pandas读取Excel数据更加的方便
- Matplotlib是用于数据可视化的模块,使用Matplotlib.pyplot可以非常方便的绘制饼图、柱形图、折线图等
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_excel('JD手机销售数据.xlsx')
print(df)
# 解决中文乱码
plt.rcParams['font.sans-serif']=['SimHei']
# 设置画布大小
plt.figure(figsize=(10, 6))
labels=df['商品名称']
y=df['北京出库销量']
# print(labels)
# print(y)
# 绘制饼图
plt.pie(y, labels=labels, autopct='%1.1f%%', startangle=90)
# 设置x, y轴刻度
plt.axis('equal')
plt.title('2028年1月北京各手机品牌出库量占比图')
# 显示出来
plt.show()
'''
商品名称 北京出库销量 上海出库销量 广州出库销量 天津出库销量 苏州出库销量 沈阳出库销量 杭州出库销量
0 荣耀V40轻奢版 747 666 578 284 246 156 152
1 OPPO Reno5 149 100 115 82 63 37 40
2 荣耀X10 88 69 81 48 43 29 29
3 Redmi 9 84 64 75 53 35 13 23
4 Redmi K30S 56 39 51 27 16 9 7
5 OPPOA8 48 45 42 18 22 5 12
'''
PyEcharts
- PyEcharts是由百度开源的数据可视化库,它对流行图支持度比较高,它给用户提供了30多种图形,如柱形渐变图、K线周期图等
- 中文帮助文档:https://pyecharts.org/#/zh-cn/
- PyEcharts的使用可以分四个步骤实现:
- 导入pyecharts包
- 找到相应图形模板
- 准备相应数据
- 对图表进行个性化修饰
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
# 示例
'''
c = (
Pie()
.add("", [list(z) for z in zip(Faker.choose(), Faker.values())])
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-基本示例"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
.render("pie_base.html")
)
'''
lst = [['荣耀V40轻奢版', 747], ['OPPO Reno5', 149], ['荣耀X10', 88],
['Redmi 9', 84], ['Redmi K30S', 56], ['OPPOA8', 48]]
c = (
Pie()
.add("", lst)
.set_global_opts(title_opts=opts.TitleOpts(title="2028年北京手机出库量占比图"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
.render("2028年1月北京各手机品牌出库量占比图.html")
)
PIL and jieba
PIL
是用于图像处理的第三方库,它支持图像存储、处理和现实等操作- 安装:
pip install pillow
- 安装:
# 图像颜色交换
from PIL import Image
# 加载图片
im = Image.open('baidu_logo.png')
# print(type(im), im)
# <class 'PIL.PngImagePlugin.PngImageFile'> <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=540x258 at 0x290DEDF84D0>
# 提取RGB图像的颜色通道,返回结果是图像的副本
r, g, b, a = im.split()
# print(r)
# print(g)
# print(b)
# print(a)
'''
<PIL.Image.Image image mode=L size=540x258 at 0x181E7E6A180>
<PIL.Image.Image image mode=L size=540x258 at 0x181E7E6B830>
<PIL.Image.Image image mode=L size=540x258 at 0x181E7E6BD40>
<PIL.Image.Image image mode=L size=540x258 at 0x181E8048620>
'''
# 合并通道
om = Image.merge(mode='RGBA', bands=(r,b,g,a))
om.save('new-baidu_logo.png')
jieba
是Python中用于对中文进行分词的模块,它可以将一段中文文本分隔成中文词组的序列
import jieba
# 读取文本
with open('万古神帝第2章.txt', 'r', encoding='utf-8') as file:
s = file.read()
# print(s)
# 分词
lst = jieba.lcut(s)
# print(lst)
# 去重
set1 = set(lst)
# print(set1)
# 统计词,字数大于2的词
d = {}
for item in set1:
if len(item) >= 2:
d[item] = 0
# print(d)
# 统计原列表中词出现的次数
for item in lst:
if item in d:
d[item] = d.get(item) + 1
# 使用新列表记录统计结果,方便排序
new_lst = []
for item in d:
new_lst.append([item, d[item]])
new_lst.sort(key=lambda x:x[1], reverse=True)
print(new_lst[0:21])
'''
[['印记', 44], ['神武', 44], ['开启', 31], ['张若尘', 28], ['王子', 15], ['没有', 12], ['祭祀', 10], ['一个', 9], ['林妃', 9], ['十六岁', 8], ['郡王', 7], ['白色', 7], ['晶石', 6], ['武道', 5], ['眉心', 5], ['大典', 5], ['化为', 5], ['一位', 5], ['依旧', 5], ['只是', 5], ['王后', 4]]
'''
PyInstaller
- 第三方库PyInstaller可以在Windows操作系统中将Python源文件打包成
.exe
的可执行文件。还可以在Linux和Mac OS操作系统中对源文件进行打包操作 - 打包语法结果为:pyinstaller -F 源文件文件名
- 注意事项:在进行文件打包是,需要打包的文件尽量不要有中文,而且需要打包的文件路径也尽量不要有中文,路径中包含中文有可能会导致打包失败。
实战
实战1
- 模拟高铁售票系统
- 假设高铁一节车厢的座位数有6行,每行5列,每个作为初始显示“有票”,用户输入座位位置(如:4,3)后,按回车,则该座位显示为“已售”,使用到第三方模块
prettytable
- 假设高铁一节车厢的座位数有6行,每行5列,每个作为初始显示“有票”,用户输入座位位置(如:4,3)后,按回车,则该座位显示为“已售”,使用到第三方模块
import prettytable as pt
# 显示坐席
def show_ticket(row_num):
tb = pt.PrettyTable() # 创建一张表格
# 设置标题(表格头)
tb.field_names = ['行号','座位1','座位2','座位3','座位4','座位5']
# 遍历有票
for i in range(1, row_num+1):
lst = [f'第{i}行', '有票', '有票', '有票', '有票', '有票']
tb.add_row(lst)
print(tb)
# 订票
def order_ticket(row_num, row, col):
tb = pt.PrettyTable()
# 设置标题
tb.field_names = ['行号','座位1','座位2','座位3','座位4','座位5']
for i in range(1, row_num+1):
if int(row) == i:
lst = [f'第{i}行', '有票', '有票', '有票', '有票', '有票']
lst[int(col)] = '已售'
tb.add_row(lst)
else:
lst = [f'第{i}行', '有票', '有票', '有票', '有票', '有票']
tb.add_row(lst)
print(tb)
if __name__ == '__main__':
row_num = 6
show_ticket(row_num)
# 售票
choose_num=input('请输入您选择的坐席:如4,3表示第四排第三列:')
row,col = choose_num.split(',')
order_ticket(row_num, row, col)
'''
+-------+-------+-------+-------+-------+-------+
| 行号 | 座位1 | 座位2 | 座位3 | 座位4 | 座位5 |
+-------+-------+-------+-------+-------+-------+
| 第1行 | 有票 | 有票 | 有票 | 有票 | 有票 |
| 第2行 | 有票 | 有票 | 有票 | 有票 | 有票 |
| 第3行 | 有票 | 有票 | 有票 | 有票 | 有票 |
| 第4行 | 有票 | 有票 | 有票 | 有票 | 有票 |
| 第5行 | 有票 | 有票 | 有票 | 有票 | 有票 |
| 第6行 | 有票 | 有票 | 有票 | 有票 | 有票 |
+-------+-------+-------+-------+-------+-------+
请输入您选择的坐席:如4,3表示第四排第三列:3,3
+-------+-------+-------+-------+-------+-------+
| 行号 | 座位1 | 座位2 | 座位3 | 座位4 | 座位5 |
+-------+-------+-------+-------+-------+-------+
| 第1行 | 有票 | 有票 | 有票 | 有票 | 有票 |
| 第2行 | 有票 | 有票 | 有票 | 有票 | 有票 |
| 第3行 | 有票 | 有票 | 已售 | 有票 | 有票 |
| 第4行 | 有票 | 有票 | 有票 | 有票 | 有票 |
| 第5行 | 有票 | 有票 | 有票 | 有票 | 有票 |
| 第6行 | 有票 | 有票 | 有票 | 有票 | 有票 |
+-------+-------+-------+-------+-------+-------+
'''
实战2
- 推算几天后的日期
- 编写一个程序,输入开始日期和间隔天数,可以推算出结束日期,使用内置的datetime模块
import datetime
def input_date():
start_date = input('请输入开始日期(如20281001)后按回车:')
date_str = start_date[0:4] + '-' + start_date[4:6] + '-' + start_date[6:]
# 类型转换
dt = datetime.datetime.strptime(date_str, '%Y-%m-%d')
return dt
if __name__ == '__main__':
date = input_date()
print(date)
in_day = eval(input('请输入间隔天数:'))
date = date + datetime.timedelta(days=in_day)
print('推算的日期是:', date)
'''
请输入开始日期(如20281001)后按回车:20250304
2025-03-04 00:00:00
请输入间隔天数:10
推算的日期是: 2025-03-14 00:00:00
'''
实战3
- 词云图
- 使用Python第三方库jieba与wordcloud实现关键词的词云图
import jieba
from wordcloud import WordCloud
# 读取文本
with open('万古神帝第2章.txt', 'r', encoding='utf-8') as file:
s = file.read()
# 中文分词
lst = jieba.lcut(s)
# 排除词
stopword = ['化为', '一位', '依旧', '没有', '一个']
txt = ''.join(lst)
# 词云图
wordcloud = WordCloud(background_color='white', font_path='msyh.ttc', stopwords=stopword,
width=800, height=600)
# 有txt生成词云图
wordcloud.generate(txt)
# 保存图片
wordcloud.to_file('万古神帝第2章词云图.png')