第四章 Python库 v1.0
一、模块与包
1.模块
Python可以将类、函数等存储在模块(
.py
文件)中,然后在主程序中导入所需要的模块。
①导入模块
导入一般写在文件开头,导入所有需要使用的内容
from [模块名] import [模块|类|函数|变量|*] as [别名]
import [模块名] # 导入整个模块
import [模块名] as [别名] # 导入整个模块并指定别名
from [模块名] import [类|变量|方法] # 导入模块中指定内容
from [模块名] import * # 导入一个模块中的所有功能
from [模块名] import [功能名] as [别名] # 导入模块中指定内容并指定别名
②自定义模块
Python中自定义模块只需在Python代码文件中正常书写代码即可,导入时无需.py
后缀
from module import main as file_main
def main():
print("main()函数执行")
if __name__ == '__main__':
main() # output: main()函数执行
file_main() # output: file2
def main():
print("file2")
2.包
当Python模块过多,可以通过包的功能来管理多个模块
①导入包
导入包的语法格式类似导入模块,包名与模块名之间使用.
间隔,如:
from [包名] import [模块名] as [模块别名]
②自定义包
- 新建包(会自动创建
__init__.py
文件,用于管理包import *
的导入内容,可以为空) - 在包中添加模块
__all__ = ["module1", "module2", ...] # __all__的内容用于管理包`import *`的导入内容
package
|- __init__.py
| module1
|- __init__.py
|- m1n1.py
|- m1n2.py
| module2
|- __init__.py
|- m2n1.py
|- m2n2.py
3.程序的入口函数
main()函数是Python程序的入口函数,负责启动整个程序的执行
if __name__ == '__main__':
# 此为main函数内容
在代码文件中没有定义main()函数时:
- 直接执行本代码文件时,整个文件所有内容都依次按照顺序执行
- 当本代码文件作为其他代码
import
对象时,会执行所有代码文件中的内容
在代码文件中定义了main()函数时:
- 直接执行本代码文件时,把
main()
函数包含的代码块也视为脚本代码,按照顺序执行 - 当本代码文件作为其他代码
import
对象时,执行除main()
函数以外的代码块
我们可以通俗地理解为main()
函数定义的内容只在本代码文件执行时按代码顺序执行。
import file1 # output: file1
import file2
def main():
print("main()函数执行")
if __name__ == '__main__':
main() # output: main()函数执行
print("file1") # 被import时,执行
def main():
print("file2") # 被import时,没有执行
if __name__ == '__main__':
main()
print("Hello world!")
def main():
print("main()函数执行")
if __name__ == '__main__':
main()
print("Hello world!")
# 依次输出:Hello world! => main()函数执行 => Hello world!
二、库
一些经常使用、经过检验的规范化程序或子程序的集合。
分类:
- 标准库:程序语言自身拥有的库,可以直接使用,无需安装。
- 第三方库:第三方者使用该语言提供的程序库,是Python的强大性和灵活性的主要原因之一。
Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供系统管理、网络通信、文本处理等额外的功能。但标准库也并不能满足所有需求,第三方库的生态又进一步扩展了Python如数据分析与处理、网络编程、Web开发的功能。
三、标准库
1.标准库
Python 标准库大全: https://docs.python.org/zh-cn/3/library/index.html
- 获取帮助:在Python中,通过 help('modules') 获取有关标准库的相关帮助。
- 了解方法的作用:在Pycharm按住Ctrl键鼠标指向该方法即会显示方法的作用与用法。
- 标准库中常用库:time(获取时间模块);random(随机数模块);os(系统模块)。
- 使用标准库:import time/random/...
下面简单介绍一些常用标准库~
2.time模块
time模块提供系统级精确计时器的功能,可以用来分析程序性能,也可让程序暂停运行时间。
time模块的功能主要分为3个方面:时间处理、时间格式化、计时。
①时间处理
# 获取当前时间戳(代表当前本地时间与1970年1月1日0时0分0秒的时间差)
time.time()
# 获取当前时间戳对应的struct_time对象(UTC时间)
time.gmtime()
# 获取当前时间戳对应的本地时间的struct_time对象,UTC时间已自动转换为北京时间。
time.localtime()
# 获取当前时间戳对应的易读字符串表示,内部会调用time.localtime()函数以输出当地时间。
time.ctime()
import time # 使用之前需要先导入time模块
print(time.time()) # output: 1700108420.062937
print(time.gmtime()) # output: time.struct_time(tm_year=2023, tm_mon=11, tm_mday=16, tm_hour=4, tm_min=20, tm_sec=20, tm_wday=3, tm_yday=320, tm_isdst=0)
print(time.localtime()) # output: time.struct_time(tm_year=2023, tm_mon=11, tm_mday=16, tm_hour=12, tm_min=20, tm_sec=20, tm_wday=3, tm_yday=320, tm_isdst=0)
print(time.ctime()) # output: Thu Nov 16 12:19:51 2023
print(time.localtime()[1]) # output: 11 => 访问struct_time对象对应属性值
print(time.localtime().tm_mon) # output: 11 => 与上一条语句作用完全一致,详见后面:struct_time对象格式
struct_time
对象格式
struct_time
对象可以通过下标或属性进行对应属性值的访问,对应关系如下:
下标 | 属性 | 值描述说明 |
---|---|---|
0 | tm_year | 年份,整数 |
1 | tm_mon | 月份[1, 12] |
2 | tm_mday | 日期[1, 31] |
3 | tm_hour | 小时[0, 23] |
4 | tm_min | 分钟[0, 59] |
5 | tm_sec | 秒[0, 61] |
6 | tm_wday | 星期[0, 6](0表示星期一) |
7 | tm_yday | 该年第几天[1, 366] |
8 | tm_isdst | 是否夏时令,0否, 1是, -1未知 |
②时间格式化
# 函数将struct_time对象t转换为时间戳。
time.mktime(t)
# 以要求通用格式输出时间,利用一个格式字符串,对时间格式进行表达。
time.strftime("格式字符串",t)
# 与strftime()方法完全相反,用于提取字符串中时间来生成strut_time对象。
time.strptime(t_str,"格式字符串")
import time # 使用之前需要先导入time模块
print(time.mktime(time.localtime())) # output: 1700109225.0
print(time.strftime("%Y.%m.%d %H:%M:%S")) # output: 2023.11.16 12:33:45 => 默认输出本地时间对应默认格式
print(time.strftime("%Y.%m.%d %H:%M:%S",time.gmtime())) # output: 2023.11.16 04:33:45
print(time.strptime("2020.1.1 00:00:00","%Y.%m.%d %H:%M:%S")) # output: time.struct_time(tm_year=2020, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=1, tm_isdst=-1)
格式字符串字符详解
字符 | 日期/时间 | 值范围和实例 |
---|---|---|
%Y | 年份 | 0001~9999,例如:1900 |
%m | 月份 | 01~12,例如:10 |
%B | 月名 | January~December,例如:April |
%b | 月名缩写 | Jan~Dec,例如:Apr |
%d | 日期 | 01 ~ 31,例如:25 |
%A | 星期 | Monday~Sunday,例如:Wednesday |
%a | 星期缩写 | Mon~Sun,例如:Wed |
%H | 小时(24h制) | 00 ~ 23,例如:12 |
%I | 小时(12h制) | 01 ~ 12,例如:7 |
%p | 上/下午 | AM, PM,例如:PM |
%M | 分钟 | 00 ~ 59,例如:26 |
%S | 秒 | 00 ~ 59,例如:26 |
③计时
# 推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起(睡眠)的时间。
time.sleep(secs)
# 返回一个性能计数器的值,包括在睡眠期间和系统范围内流逝的时间
time.perf_counter() # 秒级技术
time.perf_counter_ns() # 纳秒级计数
import time # 使用之前需要先导入time模块
begin,begin_pc,begin_ns=time.time(),time.perf_counter(),time.perf_counter_ns()
time.sleep(1)
end,end_pc,end_ns=time.time(),time.perf_counter(),time.perf_counter_ns()
print(end,begin,end-begin) # output: 1700110098.2733278 1700110097.2650497 1.0082781314849854
print(end_pc,begin_pc,end_pc-begin_pc) # output: 1.3037139 0.2954715 1.0082423999999999
print(end_ns,begin_ns,end_ns-begin_ns) # output: 1303715300 295471800 1008243500
import time
scale = 50
print('----------程序开始执行')
start_time = time.perf_counter()
for i in range(scale + 1):
a = '*' * i
b = '.' * (scale - i)
c = (i / scale) * 100 #表示百分点进度
dur = time.perf_counter() - start_time #已用时间
print('\r{:^3.0f}%[{}->{}]{:.4f}s'.format(c, a, b, dur), end='') # \r 表示将光标的位置回退到本行的开头位置
time.sleep(0.1)
print('\n----------程序执行结束')
3.rondom模块
random模块提供各种随机(伪随机)功能
# 初始化随机数种子,默认值为当前系统时间(参数a相同时,对应的生成的随机值也相同)
random.seed(a=None)
# 生成随机小数
random.random() # 生成一个[0.0, 1.0)之间的随机小数
random.uniform(a, b) # 生成一个[a, b]之间的随机小数
# 生成随机整数
random.randint(a, b) # 生成一个[a,b]之间的整数
random.randrange(start, stop[, step]) # 生成一个[start, stop)之间以step为步数的随机整数
# 将序列类型中元素随机排列,返回打乱后的序列
random.shuffle(seq)
# 随机返回序列中的元素
random.sample(seq, k) # 从pop类型中随机选取k个元素,以列表类型返回
random.choice(seq) # 从序列类型(例如:列表)中随机返回一个元素
import random
random.seed(1) # 由于设置了随机数种子,随机结果相同
print(random.random()) # output: 0.13436424411240122
random.seed(1)
print(random.random()) # output: 0.13436424411240122
print(random.random()) # output: 0.8474337369372327
print(random.sample([1,2,3,4,5,6,7],5)) # output: [7, 1, 3, 6, 2]
4.os模块
提供了非常丰富的处理系统重文件和目录的方法
①常用方法
# 查看
os.getcwd() # 返回当前工作目录
os.listdir(path) # 返回指定的文件夹中文件或文件夹的名字的列表
# 创建
os.makedirs(path[,mode]) # 递归创建文件夹
os.mkdir(path[,mode]) # 创建一个名为path的以mode为权限的文件夹
# 修改
os.chdir(path) # 改变当前工作目录
os.chmod(path, mode) # 更改权限
os.rename(src, dst) # 重命名文件或目录,从src到dst
# 删除
os.remove(path) # 删除路径为 path 的文件
os.removedirs(path) # 递归删除目录
os.rmdir(path) # 删除指定的空目录,若目录非空,抛出异常
②os.path模块
os.path是os模块中的一个小模块,主要用于处理路径与判断文件类型
# 路径处理
os.path.dirname(path) # 返回一个路径中最后一个斜杠之前的所有内容
os.path.basename(path) # 返回一个路径中最后一个斜杠之后的所有内容
os.path.split(path) # 返回一个元组,里面包含了一个路径的目录名称和基本名称
os.path.join(path1,path2,...) # 返回一个文件路径的字符串,包含正确的路径分隔符
# 判断文件类型
os.path.exists(path) # 判断path参数所指的文件或文件夹是否存在
os.path.isfile(path) # 判断path参数是否存在并且是一个文件
os.path.isdir(path) # 判断path参数是否存在并且是一个文件夹
5.sys模块
查看python解释器信息及传递信息给python解释器
函数/参数 | 描述 |
---|---|
sys.exit(n) | 程序退出,如果是正常退出是sys.exit(0) |
sys.argv | 获取命令行参数,返回一个列表,如:argv[0]为脚本的名称(绝对路径)。 |
sys.version | 获取Python解释程器的版本信息 |
四、第三方库
1.常见第三方库及其作用
- 用户图形界面
- PyQt5(Python中最为成熟的商业级第三方库,能跨平台在各种操作系统上使用)
- wxPython(可以轻松地创建健壮可靠、功能强大的图形用户界面)
- PyGTK(具有跨平台性,编写的代码能够不加修改地稳定运行在各操作系统中)
- 网络爬虫(自动进行HTTP访问并捕获HTML页面的程序)
- requests(一个简介且简单的处理HTTP请求的第三方库)
- scrapy(一个快速的、高层次的web获取框架)
- 文本处理
- pdfminer(能够从PDF文档中提取各类信息、完全获取分析PDF的文本信息的第三方库)
- openpyxl(处理Excel文档的Python第三方库)
- python-docx(处理word文档的Python第三方库)
- beautifulsoup4(用于解析HTML和XML)
- 机器学习
- scikit-learn/sklearn(简单高效的数据挖掘和数据分析工具)
- TensorFlow(谷歌基于DistBelief进行研发的第二代人工智能学习系统)
- Pytorch(深度学习框架,可以看做加入了GPU支持的NumPy)
- 其他
- 数据分析:NumPy、SciPy、Pandas
- 数据可视化:matplotlib、TVTK、mayavi、pyecharts
- Web开发:Django、Pyramid、Flask、FastAPI
- 游戏开发:Pygame、Panda3D、cocos2d
- 更多第三方库
- PIL(图像处理)
- SymPy(符号计算、一个全功能的计算机代数系统)
- NLTK(自然语言处理库)
- WeRoBot(微信公众号开发框架)
- MyQR(二维码生成)
2.第三方库的安装
详见附录二,下面介绍一些简单好用的第三方库
3.分词(jieba)
中文分词库,将待分的内容与分词词库进行比对分词,支持自定义
①安装
pip install jieba
②使用
# 分词
jieba.lcut(s) # 精确模式(将句子最精确地切开,适合文本分析,冗余度低)
jieba.lcut(s, cut_all = True) # 全模式(把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义,冗余度高)
jieba.lcut_for_search(s) # 搜索引擎模式(在精确模式基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词)
# 向词库添加新单词以用于分词
jieba.add_word(s)
4.词云制作(wordcloud)
根据以空格或标点为分隔符对目标文本进行分词处理生成词云(中文分词需用户完成)
①安装
pip install wordcloud
②使用
wordcloud.WordCloud(参数).generate([字符串]) # 生成词云对象
object_wd.to_file([文件名]) # 保存词云图
CN_str='...' #初始化字符串
words=jieba.lcut(CN_str) #精确分词
CN_str=' '.join(words) #空格拼接
object_wd = wordcloud.WordCloud().generate(CN_str) #生成词云
object_wd.to_file('test.png') #保存词云为图片
EN_str="..." #初始化字符串
object_wd = wordcloud.WordCloud().generate(EN_str) #生成词云
object_wd.to_file('test.png') #保存词云为图片
WordCloud参数详解
参数 | 功能 |
---|---|
font_path | 指定字体文件的完整路径,默认None<中文需要指定> |
width | 生成图片宽度,默认400像素 |
height | 生成图片高度,默认200像素 |
mask | 词云形状,默认None,即:方形图 |
min_font_size | 词云中最小的字体字号,默认4号 |
font_step | 字号步进间隔,默认1 |
max_font_size | 词云中最大的字体字号,默认None,根据高度自动调节 |
max_words | 词云图中最大词数,默认200 |
stopwords | 被排除词列表,排除词不在词云中显示 |
background_color | 图片背景颜色,默认黑色 |
mask使用图片作形状方法:mask = imread('图片名.png')
5.程序打包(pyinstaller)
能够在Windows、Linux等操作系统下将Python源文件打包,变成直接可运行的可执行文件
①安装
pip install pyinstaller
②使用
PyInstaller库使用时不导入,而是直接在命令行中使用
pyinstaller -参数列表 [Python源程序文件名]
执行完毕后将生成dist和build两个文件夹,最终的打包程序在dist内部与源文件同名的目录中
# 打包一个当前目录下的main.py文件为exe文件,只生成一个程序且运行时不打开命令行
pyinstaller -F --clean -w main.py
PyInstaller参数详解
参数 | 功能 |
---|---|
-h, --help | 查看帮助 |
-D, --onedir | (默认)生成dist目录 |
-F, --onefile | 在dist文件夹中只生成独立的打包文件 |
-i [图标文件名.ico] | 指定打包程序使用的图标(icon)文件 |
--clean | 清理临时文件和缓存 |
-w | Windows运行时不打开命令行(一些图形界面程序常用) |
*图片转换为ioc图标相关网站:http://www.bitbug.net/