Skip to content

第四章 Python库 v1.0

一、模块与包

1.模块

Python可以将类、函数等存储在模块(.py文件)中,然后在主程序中导入所需要的模块。

①导入模块

导入一般写在文件开头,导入所有需要使用的内容

python
from [模块名] import [模块||函数|变量|*] as [别名]
python
import [模块名]                          # 导入整个模块
import [模块名] as [别名]                 # 导入整个模块并指定别名
from [模块名] import [类|变量|方法]        # 导入模块中指定内容
from [模块名] import *                    # 导入一个模块中的所有功能
from [模块名] import [功能名] as [别名]    # 导入模块中指定内容并指定别名
②自定义模块

Python中自定义模块只需在Python代码文件中正常书写代码即可,导入时无需.py后缀

python
from module import main as file_main
def main():
    print("main()函数执行")
if  __name__ == '__main__':
    main()                     # output: main()函数执行
    file_main()                # output: file2
python
def main():
    print("file2")

2.包

当Python模块过多,可以通过包的功能来管理多个模块

①导入包

导入包的语法格式类似导入模块,包名与模块名之间使用.间隔,如:

python
from [包名] import [模块名] as [模块别名]
②自定义包
  1. 新建包(会自动创建__init__.py文件,用于管理包import *的导入内容,可以为空)
  2. 在包中添加模块
python
__all__ = ["module1", "module2", ...]  # __all__的内容用于管理包`import *`的导入内容
bash
package
  |- __init__.py
  | module1
    |- __init__.py
    |- m1n1.py
    |- m1n2.py
  | module2
    |- __init__.py
    |- m2n1.py
    |- m2n2.py

3.程序的入口函数

main()函数是Python程序的入口函数,负责启动整个程序的执行

python
if  __name__ == '__main__':
    # 此为main函数内容

在代码文件中没有定义main()函数时:

  1. 直接执行本代码文件时,整个文件所有内容都依次按照顺序执行
  2. 当本代码文件作为其他代码import对象时,会执行所有代码文件中的内容

在代码文件中定义了main()函数时:

  1. 直接执行本代码文件时,把main()函数包含的代码块也视为脚本代码,按照顺序执行
  2. 当本代码文件作为其他代码import对象时,执行除main()函数以外的代码块

我们可以通俗地理解为main()函数定义的内容只在本代码文件执行时按代码顺序执行

python
import file1                   # output: file1
import file2
def main():
    print("main()函数执行")
if  __name__ == '__main__':
    main()                     # output: main()函数执行
python
print("file1")                 # 被import时,执行
python
def main():
    print("file2")             # 被import时,没有执行
if  __name__ == '__main__':
    main()
python
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

  1. 获取帮助:在Python中,通过 help('modules') 获取有关标准库的相关帮助。
  2. 了解方法的作用:在Pycharm按住Ctrl键鼠标指向该方法即会显示方法的作用与用法。
  3. 标准库中常用库:time(获取时间模块);random(随机数模块);os(系统模块)。
  4. 使用标准库:import time/random/...

下面简单介绍一些常用标准库~

2.time模块

time模块提供系统级精确计时器的功能,可以用来分析程序性能,也可让程序暂停运行时间。
time模块的功能主要分为3个方面:时间处理、时间格式化、计时。

①时间处理
python
# 获取当前时间戳(代表当前本地时间与1970年1月1日0时0分0秒的时间差)
time.time()

# 获取当前时间戳对应的struct_time对象(UTC时间)
time.gmtime()

# 获取当前时间戳对应的本地时间的struct_time对象,UTC时间已自动转换为北京时间。
time.localtime()

# 获取当前时间戳对应的易读字符串表示,内部会调用time.localtime()函数以输出当地时间。
time.ctime()
python
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对象可以通过下标或属性进行对应属性值的访问,对应关系如下:

下标属性值描述说明
0tm_year年份,整数
1tm_mon月份[1, 12]
2tm_mday日期[1, 31]
3tm_hour小时[0, 23]
4tm_min分钟[0, 59]
5tm_sec秒[0, 61]
6tm_wday星期[0, 6](0表示星期一)
7tm_yday该年第几天[1, 366]
8tm_isdst是否夏时令,0否, 1是, -1未知
②时间格式化
python
# 函数将struct_time对象t转换为时间戳。
time.mktime(t)

# 以要求通用格式输出时间,利用一个格式字符串,对时间格式进行表达。
time.strftime("格式字符串",t)

# 与strftime()方法完全相反,用于提取字符串中时间来生成strut_time对象。
time.strptime(t_str,"格式字符串")
python
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
%S00 ~ 59,例如:26
③计时
python
# 推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起(睡眠)的时间。
time.sleep(secs)

# 返回一个性能计数器的值,包括在睡眠期间和系统范围内流逝的时间
time.perf_counter()      # 秒级技术
time.perf_counter_ns()   # 纳秒级计数
python
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
python
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模块提供各种随机(伪随机)功能

python
# 初始化随机数种子,默认值为当前系统时间(参数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为步数的随机整数
python
# 将序列类型中元素随机排列,返回打乱后的序列
random.shuffle(seq)

# 随机返回序列中的元素
random.sample(seq, k)    # 从pop类型中随机选取k个元素,以列表类型返回
random.choice(seq)       # 从序列类型(例如:列表)中随机返回一个元素
python
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模块

提供了非常丰富的处理系统重文件和目录的方法

①常用方法
python
# 查看
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模块中的一个小模块,主要用于处理路径与判断文件类型

python
# 路径处理
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.常见第三方库及其作用

  1. 用户图形界面
    • PyQt5(Python中最为成熟的商业级第三方库,能跨平台在各种操作系统上使用)
    • wxPython(可以轻松地创建健壮可靠、功能强大的图形用户界面)
    • PyGTK(具有跨平台性,编写的代码能够不加修改地稳定运行在各操作系统中)
  2. 网络爬虫(自动进行HTTP访问并捕获HTML页面的程序)
    • requests(一个简介且简单的处理HTTP请求的第三方库)
    • scrapy(一个快速的、高层次的web获取框架)
  3. 文本处理
    • pdfminer(能够从PDF文档中提取各类信息、完全获取分析PDF的文本信息的第三方库)
    • openpyxl(处理Excel文档的Python第三方库)
    • python-docx(处理word文档的Python第三方库)
    • beautifulsoup4(用于解析HTML和XML)
  4. 机器学习
    • scikit-learn/sklearn(简单高效的数据挖掘和数据分析工具)
    • TensorFlow(谷歌基于DistBelief进行研发的第二代人工智能学习系统)
    • Pytorch(深度学习框架,可以看做加入了GPU支持的NumPy)
  5. 其他
    • 数据分析:NumPy、SciPy、Pandas
    • 数据可视化:matplotlib、TVTK、mayavi、pyecharts
    • Web开发:Django、Pyramid、Flask、FastAPI
    • 游戏开发:Pygame、Panda3D、cocos2d
  6. 更多第三方库
    • PIL(图像处理)
    • SymPy(符号计算、一个全功能的计算机代数系统)
    • NLTK(自然语言处理库)
    • WeRoBot(微信公众号开发框架)
    • MyQR(二维码生成)

2.第三方库的安装

详见附录二下面介绍一些简单好用的第三方库

3.分词(jieba)

中文分词库,将待分的内容与分词词库进行比对分词,支持自定义

①安装
bash
pip install jieba
②使用
python
# 分词
jieba.lcut(s)                  # 精确模式(将句子最精确地切开,适合文本分析,冗余度低)
jieba.lcut(s, cut_all = True)  # 全模式(把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义,冗余度高)
jieba.lcut_for_search(s)       # 搜索引擎模式(在精确模式基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词)

# 向词库添加新单词以用于分词
jieba.add_word(s)

4.词云制作(wordcloud)

根据以空格或标点为分隔符对目标文本进行分词处理生成词云(中文分词需用户完成)

①安装
bash
pip install wordcloud
②使用
python
wordcloud.WordCloud(参数).generate([字符串])   # 生成词云对象
object_wd.to_file([文件名])                    # 保存词云图
python
CN_str='...'                                             #初始化字符串
words=jieba.lcut(CN_str)                                 #精确分词
CN_str=' '.join(words)                                   #空格拼接
object_wd = wordcloud.WordCloud().generate(CN_str)       #生成词云
object_wd.to_file('test.png')                            #保存词云为图片
python
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源文件打包,变成直接可运行的可执行文件

①安装
bash
pip install pyinstaller
②使用

PyInstaller库使用时不导入,而是直接在命令行中使用

bash
pyinstaller -参数列表 [Python源程序文件名]

执行完毕后将生成dist和build两个文件夹,最终的打包程序在dist内部与源文件同名的目录中

bash
# 打包一个当前目录下的main.py文件为exe文件,只生成一个程序且运行时不打开命令行
pyinstaller -F --clean -w main.py
PyInstaller参数详解
参数功能
-h, --help查看帮助
-D, --onedir(默认)生成dist目录
-F, --onefile在dist文件夹中只生成独立的打包文件
-i [图标文件名.ico]指定打包程序使用的图标(icon)文件
--clean清理临时文件和缓存
-wWindows运行时不打开命令行(一些图形界面程序常用)

*图片转换为ioc图标相关网站:http://www.bitbug.net/