python基础语法(4) ----- 学习笔记分享
目录
Python 使用库 以及 实战的一些案例
1. 标准库
1.1 认识标准库
1.2 使用import导入模块
1.3 代码示例:日期及结算
1.4 代码示例:字符串操作
1.5 代码示例 : 文件查找工具
2. 第三方库
2.1 认识第三方库
2.2 使用pip
2.3 代码示例:生成二维码
(1) 使用搜索引擎,确定使用哪个库
(2) 查看qrcode文档
2.4 代码示例:操作excel
(1) 安装xlrd
(2) 编写代码
2.5 代码示例:"程序猿鼓励师"
(1) 安装第三方依赖
(2) 准备音频文件
(3) 编写代码
3. 综合案例:学生管理系统
需求说明
功能:
创建入口函数
4. 后续拓展
4.1 python cookbook
4.2 awesome-python
4.3 500 Lines or Less
Python 使用库 以及 实战的一些案例
库就是是别人已经写好了的代码,可以让我们直接拿来用
按照库的来源,可以大致分成两大类
-
标准库 : python自带的库,只要安装了python就可以直接使用
-
第三方库 : 其他人实现的库,要想使用,需要额外安装
1. 标准库
1.1 认识标准库
在python官方文档上可以看到这些库的内容
The Python Standard Library — Python 3.10.16 documentation
简单来说,主要是这些部分:
-
内置函数(如print \ input等)
-
内置类型(针对int \ str \ bool \ list \ dict等)
-
文本处理
-
时间日期
-
数学计算
-
文件目录
-
数据存储(操作数据库,数据序列化等)
-
加密解密
-
操作系统相关
-
并发编程相关(多进程 \ 多线程 \ 协程 \ 异步)
-
网络编程相关
-
多媒体相关(音频处理 \ 视频处理)
-
图形化界面相关
-
......
1.2 使用import导入模块
使用import可以导入标准库的一个模块
import [模块名]
1.3 代码示例:日期及结算
输入任意的两个日期,计算两个日期之间隔了多少天
-
使用
import
语句导入标准库中的datetime
模块 -
使用
datetime.datetime
构造两个日期,参数使用年, 月, 日
这样的格式 -
两个日期对象相减,即可得到日期的差值
import datetime date1 = datetime.datetime(2006, 3, 30) date2 = datetime.datetime(2025, 1, 26) print(date2 - date1)
1.4 代码示例:字符串操作
字符串是python的内置类型,字符串的很多方法不需要导入额外的模块,即可直接使用
(1) 翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,为简单起见,标点符号和普通字母一样处理
-
使用 str 的 split 方法进行字符串切分,指定 空格 为分隔符,返回结果是一个列表
-
使用列表的 reverse 方法进行逆序
-
使用 str 的 join 方法进行字符串拼接,把列表中的内容进行合并
def reverseWords(s: str) : tokens = s.split(' ') tokens.reverse() return ' '.join(tokens) print(reverseWords('I am a student Damn it!'))
(2) 旋转字符串
给定两个字符串,s和goal,如果在若干次旋转操作之后,s能变成goal,那么返回True.
s的旋转操作就是将s的最左边的字符移动到最右边
例如,若s = 'abcde' ,在旋转一次后结果就是'bcdea'
-
使用 len 求字符串的长度,如果长度不相同,则一定不能旋转得到
-
将 s 和自己进行拼接,然后直接使用in方法来判定goal是否是s + s的子串
def rotate(s,goal): return len(s) == len(goal) and goal in s + s print(rotate('abcdf','cdeab'))
(3) 统计是给定字符串前缀的字符串数目
给你一个字符串数组
words
和一个字符串s
,其中words[i]
和s
只包含小写英文字母请你返回
words
中是字符串s
前缀的字符串数目一个字符串的前缀是出现在字符串开头的子字符串.子字符串是一个字符串中的连续一段字符序列
-
依次遍历words中的字符串
-
直接使用字符串的
startswith
方法即可判定当前字符串是否是s的前缀
def countPrefixes(words,s): res = 0 #符合字符串个数 for word in words: if s.startswith(word): # s是以word开头 res += 1 return res print(countPrefixes(["a","b","c","ab","bc","abc"],"abc"))
1.5 代码示例 : 文件查找工具
指定一个待搜索路径,同时指定一个待搜索的关键字.
在待搜索路径中查找是否文件名中包含这个关键字.
-
使用
os.walk
即可实现目录的递归遍历. -
os.walk
返回一个三元组,分别是当前路径,当前路径下包含的目录名(多个),当前路径下包含的文件名(多个)
import os inputPath = input('请输入待搜索路径:') pattern = input('请输入待搜索关键词:') for dirpath,filenames in os.walk(inputPath): for f in filenames: if pattern in f: print(f'{dirpath}/{f}')
2. 第三方库
2.1 认识第三方库
第三方库就是别人已经实现好了的库,我们可以直接拿来使用
当我们确定了该使用哪个第三方库之后,就可以使用pip来安装第三方库
2.2 使用pip
pip 是python内置的包管理器,pip是一个可执行程序,就在python的安装目录中
使用以下命令,即可安装第三方库
pip install [库名]
注意:这个命令需要从网上下载,使用时要保证网络流畅
安装成功后,即可使用import导入相关模块,即可进行安装
注意:如果使用pip完成安装第三方库之后,在pycharm中仍然提示找不到对应的模块,
则检查Setting -> Project -> Python Interpreter ,看当前Python解释器设置的是否正确(如果一个机器上安装了多个版本的python,容易出现这种情况)
2.3 代码示例:生成二维码
二维码本质上,就是一段字符串~~
我们可以把任意的字符串,制作成一个二维码图片~~
生活中使用的二维码,更多的是一个URL(网址)
(1) 使用搜索引擎,确定使用哪个库
得到情报,qrcode
这个库,可以用来生成二维码
(2) 查看qrcode文档
pip install "qrcode[pil]"
然后
import qrcode img = qrcode.make('阿巴阿巴阿巴') img.save('qrcode.png')
2.4 代码示例:操作excel
-
读取excel可以使用xlrd模块
-
修改excel可以使用xlwt模块
此处以xlrd模块,演示excek的基本操作
(1) 安装xlrd
pip install xlrd==1.2.0
注意:此处要指定版本号安装,如果不是指定版本号,则安装最新版,最新版里面删除了对xlsx
格式文件的支持
(2) 编写代码
-
使用
open_workbook
方法打开一个excel文件
-
使用
xlsx.sheet_by_index(0)
获取到0号标签页 -
使用
table.nrows
获取到表格的行数 -
使用
table.cell_value(row,col)
获取到表格中row \ col位置的元素值
# 简单操作excel import xlrd # 1. 打开 xlsx 文件 xlsx = xlrd.open_workbook('E:\\py.项目\\study_11.1\\pythonProject\\test.xlsx') # 2. 获取到指定的标签页 table = xlsx.sheet_by_index(0) # 3. 获取到表格中有多少行 nrows = table.nrows # 4. 进行循环统计操作 total = 0 count = 0 for i in range(1, nrows): # 拿到当前同学的班级id classId = table.cell_value(i, 1) if classId == 1: total += table.cell_value(i, 2) count += 1 print(f'1班同学平均分:{total / count}')
2.5 代码示例:"程序猿鼓励师"
监听键盘按键,每按键20下,就自动播放一个音频,鼓励一下辛苦板砖的自己
(1) 安装第三方依赖
-
pynput
用于监听键盘按键,注意版本不要用最新 -
playsound
用于播放音频
pip install pynput==1.6.8 pip install playsound==1.2.2
(2) 准备音频文件
此处准备了一个ding.mp3
放到和py代码同级目录中
(3) 编写代码
-
使用
from import
的格式直接导入模块中的指定对象/函数
-
使用
keyboard.Listener
监听键盘按键,其中on_release
会在释放按键时被调用 -
使用
listener.start
启动监听器,为了防止程序直接退出,使用listener.join
让程序等待用户按键 -
使用count计数,每隔20次,调用playground播放音频文件
import random from pynput import keyboard from playsound import playsound from threading import Thread soundList = ['遇见 (电影《向左走向右走》主题曲)-孙燕姿.mp3','说好的幸福呢-周杰伦.mp3','雨天-孙燕姿.mp3'] #用来记录用户安乐多少次键盘 count = 0 def onRelease(key): """ 这个函数,就是在用户释放键盘按键的时候,就会被调用到 这个函数不是咱们自己主动调用的,而是把这个函数交给了Listener, 由Listener在用户释放按键的时候自动调用 像这样的不是咱们自己主动调用,而是交给别人,在合适的时机进行调用,这样的函数叫做"回调函数" :param key: 用户按下了哪个键 :return: """ print(key) global count count += 1 if count % 20 == 0: #播放音频 #生成随机数 i = random.randint(0,len(soundList)-1) # 此处的播放音频,消耗的时间比较多,可以创建一个线程,在线程里播放音频 # playsound(soundList[i]) t = Thread(target=playsound,args=[soundList[i],]) t.start() # 当我们创建好listener之后,用户的键盘按键动作就会被捕获到 # 还希望再捕获到之后能够执行一段代码 listener = keyboard.Listener(on_release=onRelease) listener.start() listener.join() # 播放音频可能出现输入卡顿 : 因为播放音频是一个比较耗时过程
3. 综合案例:学生管理系统
需求说明
实现一个命令行版本的学生管理系统
功能:
-
新增学生
-
显示学生
-
查找学生
-
删除学生
-
存档到文件
创建入口函数
-
使用一个全局列表
students
表示所有学生信息 -
使用
menu
函数和用户交互,这是一个自定义函数 -
使用
insert
,show
,find
,delete
这几个自定义函数完成增删查操作 -
使用
sys.exit
实现程序退出 -
约定好数据的存储格式~约定把数据保存在和py文件同级目录中,文件名为 record.txt
-
文件内容按照 行文本 的方式来表示~
-
首先这是一个文本文件,里面包含了很多行~每一行代表一个学生~学生信息之间使用制表符\t来分割~
-
# 实现一个命令行版本的学生管理系统 import os import sys # 使用这个全局变量,来管理所有的学生信息 # 这个列表的每个元素都一个"字典",每个字典就分别表示一个同学! students = [] def save(): """ 用于存档 :return: """ # 此处的路径是相对路径,含义就是让 record.txt 和 当前的py文件在同一个目录里面 with open('record.txt','w',encoding='utf-8') as f: for s in students: f.write(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}\n") print(f'[存档成功] 共存储了 {len(students)} 条记录!') def load(): """ 用于读档 :return: """ # 如果存档文件不存在,则直接跳过读档流程 # 为了避免读方式打开文件的时候,文件不存在引起异常 if not os.path.exists('record.txt'): return # 读档的时候要把旧的数据清理干净 global students students = [] with open('record.txt','r',encoding='utf-8') as f: for line in f: # 针对这一行数据,按照 \t 进行切分操作! # 切分之前,要去除末尾的换行. line = line.strip() # 去掉一行 / 一个字符串首尾的空白符号(空格,换行,回车,制表符,翻页符,垂直制表符) tokens = line.split('\t') if len(tokens) != 4: print(f'当前行格式存在问题! line={line}') continue student = { 'studentId': tokens[0], 'name': tokens[1], 'gender': tokens[2], 'className': tokens[3], } students.append(student) print(f'[读档成功] 共读取了 {len(students)} 条记录!') def menu(): print(" 1. 新增学生 ") print(" 2. 显示学生 ") print(" 3. 查找学生 ") print(" 4. 删除学生 ") print(" 0. 退出程序 ") choice = input('请输入您的选择:') return choice def insert(): print('[新增学生] 开始!') studentId = input('请输入学生的学号:') name = input('请输入学生的姓名:') gender = input('请输入学生的性别:') if gender not in ('男','女'): print('性别输入内容不符合要求,新增失败!') return className = input('请输入学生的班级:') # 使用一个字典把上述的信息给聚合起来 student = { 'studentId': studentId, 'name': name, 'gender':gender, 'className':className, } global students students.append(student) # 增加一个保存操作 save() print('[新增学生] 完毕!') def show(): # 遍历全局变量的这个列表,把每个学生的信息给打印出来 print('[显示学生] 开始!') for s in students: print(f"[{s['studentId']}]\t{s['name']}\t{s['gender']}\t{s['className']}") print(f'[显示学生] 完毕! 共显示了 {len(students)} 条数据!') def find(): # 根据学生姓名,来进行查找 print('[查找学生] 开始!') name = input('请输入要查找的同学姓名:') count = 0 for s in students: if s['name'] == name: print(f"[{s['studentId']}]\t{s['name']}\t{s['gender']}\t{s['className']}") count += 1 print(f'[查找学生] 结束! 共找到了 {count} 个匹配的同学') def delete(): print('[删除学生] 开始!') studentId = input('请输入要删除学生的学号:') # 看看这个学号的同学是哪个字典,然后把这个字典从列表中删掉就好了! for s in students: if s['studentId'] == studentId: print(f"您的操作删除了 {s['name']} 同学的相关信息") students.remove(s) # 增加一个保存操作 save() print('[删除学生] 完毕!') def main(): """ 入口函数 :return: """ #通过控制台和用户进行交互 print('--------------------------------------') print(' 欢迎来到学生管理系统 ') print('--------------------------------------') # 需要在程序启动的时候调用load函数 load() while True: # 通过menu函数来打印操蛋项 choice = menu() if choice == '1': # 新增学生 insert() elif choice == '2': # 显示所有学生 show() elif choice == '3': # 查找学生 find() elif choice == '4': # 删除学生 delete() elif choice == '0': # 退出程序 print('goodbye!') sys.exit(0) else: print('您的输入有误!请重新输入!') # continue 需要进入下次循环,让用户重新输入 main()
4. 后续拓展
4.1 python cookbook
python经典进阶书籍,针对各种典型场景提供了一些解决方案
4.2 awesome-python
一些非常实用的程序库
awesome-python: awesome-python 的中文版
4.3 500 Lines or Less
使用简短的python代码来实现一些有意思的程序
https://github.com/aosabook/500lines