python之所以获得今天的知名度除了除了简介明了的语法便于记忆学习外,更支持它走到今天的便是它那丰富的生态,也就是python中丰富的库。
python的库作用繁多,可以应用于数据分析、深度学习、绘图、web开发等方方面面的功能。
python的第三方库资料繁多,知识点复杂,这里不做过多的内容阐述,想深入了解的可以参考这个网站:Python 标准库 — Python 3.13.7 文档
接下来我们就简单的python第三方库的介绍和使用
相关代码已经提交至作者的个人gitee:楼田莉子/Python 学习喜欢请支持一下谢谢
目录
导入一个模块
我们将使用如下的代码来导入一个模块,其作用类似于C/C++中包含头文件
import [模块名]
所谓 "模块" , 其实就是一个单独的 .py 文件.
使用 import 语句可以把这个外部的 .py 文件导入到当前 .py 文件中, 并执行其中的代码
标准库
代码示例1:日期计算
输入任意的两个日期, 计算两个日期之间隔了多少天.
使用 import 语句导入标准库的 datetime 模块使用 datetime.datetime 构造两个日期. 参数使用 年, 月, 日 这样的格式.
两个日期对象相减, 即可得到日期的差值
datetime库的介绍:datetime — 基本日期和时间类型 — Python 3.13.7 文档
import datetime
date1 = datetime.datetime(2006, 8, 3)
date2 = datetime.datetime(2025, 7, 12)
print(date2-date1)
结果为:
力扣习题:字符串中的单词翻转
题目链接:LCR 181. 字符串中的单词反转 - 力扣(LeetCode)
C++版本
class Solution {
public:
string reverseMessage(string message)
{
string ret;
int n=message.size();
for(int i=n-1;i>=0;i--)
{
if(message[i]!=' ')
{
int right=i;
while(i>=0&&message[i]!=' ')
{
i--;
}
ret+=message.substr(i+1,right-i)+" ";
}
}
return ret.substr(0,ret.size()-1);
}
};
力扣习题:旋转字符串
题目链接:796. 旋转字符串 - 力扣(LeetCode)
C++版本
代码思路
该题解代码采用模拟所有可能旋转位置的方式进行检查。主要步骤包括:
长度检查:如果
s
和goal
长度不同,直接返回false
,因为旋转无法改变字符串长度。模拟旋转:通过两层循环模拟所有可能的旋转位置:
外层循环遍历每个可能的旋转起始位置
i
(从0
到n-1
),表示旋转后字符串从原字符串的第i
个字符开始。内层循环检查从位置
i
开始的旋转字符串是否与goal
完全匹配。这里使用取模运算(i + j) % n
来模拟循环访问字符串s
的字符,确保索引不会越界。
提前终止:在内层循环中,一旦发现不匹配的字符,立即终止当前旋转位置的检查,继续尝试下一个位置,以优化性能。
返回结果:如果找到匹配的旋转位置,返回
true
;否则,返回false
。class Solution { public: bool rotateString(string s, string goal) { int m = s.size(), n = goal.size(); // 步骤1: 检查长度是否相等,不等则直接返回false if (m != n) { return false; } // 步骤2: 外层循环,遍历所有可能的旋转起始位置i for (int i = 0; i < n; i++) { bool flag = true; // 初始化标志位,假设当前旋转位置匹配 // 内层循环,检查从位置i开始的旋转字符串是否与goal匹配 for (int j = 0; j < n; j++) { // 使用取模运算模拟循环访问s的字符: // 从i开始,依次访问s[i], s[i+1], ..., s[n-1], s[0], s[1], ... if (s[(i + j) % n] != goal[j]) { flag = false; // 发现不匹配字符,设置标志位为false break; // 提前终止内层循环,继续下一个旋转位置 } } // 如果当前旋转位置完全匹配,返回true if (flag) { return true; } } // 所有旋转位置都不匹配,返回false return false; } };
python版本
给定的Python代码采用了一种高效且巧妙的解法:
长度检查:首先比较字符串
s
和goal
的长度。如果长度不相等,那么s
不可能通过旋转得到goal
,直接返回False
。这是因为旋转操作不会改变字符串的长度。子串检查:如果长度相等,则将字符串
s
与自身连接,形成新字符串s + s
,然后检查goal
是否是s + s
的子串。这是因为s + s
包含了s
的所有可能旋转结果。例如,如果s = "abcde"
,则s + s = "abcdeabcde"
,其中包含了所有旋转版本:"abcde"、"bcdea"、"cdeab"、"deabc"、"eabcd"。因此,如果goal
是这些旋转结果之一,它一定会出现在s + s
中。
class Solution:
def rotateString(self, s: str, goal: str) -> bool:
# 首先检查s和goal的长度是否相等,如果不相等,直接返回False
if len(s) != len(goal):
return False
# 然后检查goal是否是s+s的子串。如果是,说明s可以通过旋转得到goal,返回True;否则返回False
return goal in (s + s)
3、统计是给定字符串前缀的字符串个数
C++版本
哈希表:
存前缀获取单词
- 统计
words
中每个单词出现的次数; - 获取
s
的每一个前缀,从cnts
中获取这个前缀的个数;
class Solution {
public:
int countPrefixes(vector<string>& words, string s)
{
int n=s.size();
int ret=0;
string pre;
unordered_map<string ,int> hash;
for(auto&x:words)
{
hash[x]++;
}
for(int i=0;i<n;i++)
{
pre=s.substr(0,i+1);//截取字符串前端
ret+=hash[pre];
}
return ret;
}
};
python版本
遍历words字符串,然后取出所有字符串。判断s是否以它为开头
可以用startswith方法
class Solution:
def countPrefixes(self, words: List[str], s: str) -> int:
count =0
for word in words:
if s.startswith(word):#判断是否为s开头
#s是以word为开头
count+=1
return count
代码示例2:文本检查工具
指定一个待搜索路径, 同时指定一个待搜索的关键字.
在待搜索路径中查找是否文件名中包含这个关键字:
使用 os.walk ,通过循环即可实现目录的递归遍历.
os库的文档:os — 其他作系统接口 — Python 3.13.7 文档
os.walk 返回一个三元组, 分别是 当前路径 , 当前路径下包含的目录名 (多个), 当前路径下包含的文件名 (多个)
#实现一个文件查找功能
#输入要查找的路径,输入要查找的文件名的一部分
#自动再指定路径中查找
import os
inputPath=input("请输入要搜索的路径>")
pattern=input("请输入要搜索的关键词>")
#对目录进行遍历
#递归遍历查找。进入目录内查找
for dirpath,dirnames,filenames in os.walk(inputPath):
# dirpath:遍历对应的路径是什么
# dirnames:当前目录下有哪些目录
# filenames:当前目录下有哪些文件(一个列表包含多个文件)
# os.walk每次调用都能自动的针对子目录进行递归的操作,只需要使用下述循环把所有路径都获取来
print('__________________')
print(f'dirpath>{dirpath}')
print(f'dirnames>')
for names in dirnames:
print(names)
print(f'filenames>')
for names in filenames:
print(names)
测试结果:
第三方库
第三方库就是别人已经实现好了的库, 我们可以拿过来直接使用.
虽然标准库已经很强大了, 但是终究是有限的. 而第三方库可以视为是集合了全世界 Python 程序猿的智慧, 可以说是几乎无穷无尽.
问题来了, 当我们遇到一个需求场景的时候, 如何知道, 该使用哪个第三方库呢?可以针对于具体的项目和需求,利用搜索引擎和AI来搜索
当我们确定了该使用哪个第三方库之后, 就可以使用 pip 来安装第三方库了.
pip
pip 是 Python 内置的 包管理器.
所谓 包管理器 就类似于我们平时使用的手机 app 应用商店一样.
第三方库有很多, 是不同的人, 不同的组织实现的.
Python 官方提供了一个网站PyPI:PyPI ·Python 包索引
其他大佬写好的第三方库也会申请上传到 PyPI 上.
这个时候就可以方便的使用 pip 工具来下载 PyPI 上的库了.
pip 在我们安装 Python 的时候就已经内置了. 无需额外安装. pip 是一个可执行程序, 就在 Python 的安装目录中.
打开 cmd, 直接输入 pip. 如果显示以下帮助信息, 说明 pip 已经准备就绪.
如果安装的时候勾选:
那么pip默认可以使用
如果提示:
'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件。
则说明没有正确的把 pip 加入到 PATH 中, 可以手动把 pip 所在的路径加入到 PATH 环境变量中。可以参考这位大佬的博客:windows环境下面配置pip环境变量 - 简书
或者卸载重装 Python, 记得勾上上述选项, 也许是更简单的办法.
使用以下命令, 即可安装第三方库
pip install [库名]
注意: 这个命令需要从网络上下载, 使用时要保证网络畅通.安装成功后, 即可使用 import 导入相关模块, 即可进行使用.
注意: 如果使用 pip 安装完第三方库之后, 在 PyCharm 中仍然提示找不到对应的模块, 则检查 Settings -> Project -> Python Interpreter , 看当前 Python 解释器设置的是否正确. (如果一个机器上安装了多个版本的 Python, 容易出现这种情况).
示例:二维码生成
二维码本质上就是一段字符串
可以使用字符串生成二维码片
生活中用的更多是一个URL(网站)
推荐使用qrcode第三方库
在 PyPI 上搜索 qrcode
文档开头描述了如何安装 qrcode
在Windows的cmd和Linux中
pip install qrcode
页面中央位置描述了 qrcode 库的使用方法
import qrcode
img=qrcode.make("我是春华礼奈")
img.save(r'C:\Users\15699\Pictures\Camera Roll\qrcode.png')
示例:excel操控脚本
操控excel的第三方库是十分多的,这里列举一部分
库名称 | 主要特点 | 官方网站 |
---|---|---|
xlwings | 功能强大,支持与 Excel 交互(可调用 VBA),能进行单元格格式修改,与 Matplotlib 和 Pandas 无缝连接 | https://www.xlwings.org/ |
openpyxl | 专用于读写 .xlsx 格式,支持精细的单元格操作、公式、图表等 | https://openpyxl.readthedocs.io |
pandas | 强大的数据分析工具,适合大数据量的读取、处理和分析,API 简洁 | https://pandas.pydata.org/ (中文文档:https://www.pypandas.cn) |
xlsxwriter | 专注于写入 .xlsx 文件,支持丰富的格式和图表 | https://xlsxwriter.readthedocs.io/ |
xlrd | 用于从 旧版 Excel (.xls) 读取数据和格式化信息 | http://xlrd.readthedocs.io/ |
xlwt | 用于向旧版 Excel (.xls) 写入数据和格式化信息 | https://xlwt.readthedocs.io/ |
xlutils | 提供一系列处理 Excel 文件的工具,依赖于 xlrd 和 xlwt | http://xlutils.readthedocs.io/ |
python-docx | 虽然主要用于操作 Word,但有时也可间接处理 Excel 数据(需注意其核心功能是 Word) | https://python-docx.readthedocs.io/ |
读取excel可以使用xlrd模块。文档地址:XLRD — XLRD 2.0.1 文档
修改excel可以使用xlwt模块。文档地址:xlwt documentation — xlwt 1.3.0 documentation
安装xlrd:
pip install xlrd==1.2.0
在终端敲入这个回车后就可以安装
测试excel的文档:
import xlrd
#打开文件.xlsx
xlsx=xlrd.open_workbook("成绩单.xlsx")
#获取指定标签页
table=xlsx.sheet_by_index(0)
#获取表格中多少行
nrows=table.nrows
print(f'nrows={nrows}')
#循环获统计操作
total=0#总分
count=0#同学人数
average=0#平均分
for i in range(0,nrows):
#获取同学ID
class_ID=(table.cell_value(i, 1))
if class_ID==1:
total+=table.cell_value(i,2)
count+=1
print(f'平均分为:{total/count}')
结果为:
示例:程序员鼓励机
监听键盘按键, 每按键 20 下, 就自动播放一个音频, 鼓励一下辛苦搬砖的自己.
1) 安装第三方依赖
pynput 用于监听键盘按键. 注意版本不要用最新.
playsound 用于播放音频.
pip install pynput==1.6.8
pip install playsound==1.2.2
使用 from import 的格式直接导入模块中的指定对象/函数.
使用keybroad_listener来监听按键,其中on_release会在释放的时候被调用
使用listener.start启动监听器。为了防止直接推出,使用listen.join等待用户按键
使用count来计数,每隔20次调用playsound播放音频
优化:利用多线程来优化
关于多线程的知识, 在此处不详细介绍.
使用 threading.Thread 引入多线程类.使用 Thread 的构造函数来构造一个线程. target 表示线程要执行的任务, args 表示 target 中
要调用函数的参数.
使用 Thread.start() 启动线程.
from pynput import keyboard
from playsound import playsound
from threading import Thread
count = 0
def on_release(key):
print(key)
global count
count += 1
if count % 10 == 0:
t = Thread(target=playsound, args=('ding.mp3',))
t.start()
#playsound('ding.mp3')
listener = keyboard.Listener(
on_release=on_release)
listener.start()
listener.join()
本期内容到这里就结束了。python的第三方库是十分繁多内容丰富、功能强大的,本篇片是一个入门。如果你喜欢的话请给我点个赞谢谢
封面图自取: