第五周学习笔记总结
总结
函数
常见内置函数
分类 | 函数 | 作用 |
---|---|---|
数学运算 | abs | 求数值的绝对值 |
divmod | 返回两个数值的商和余数 | |
max | 返回可迭代对象中元素的最大值 | |
min | 返回可迭代对象中元素的最小值 | |
round | 对浮点数进行四舍五入求值 | |
sum | 对元素类型是数值的可迭代对象中每个元素求和 | |
pow | 返回两个数值的幂运算 | |
类型转换 | bool | 根据传入的参数逻辑值,创建一个新的布尔值 |
int | 将其他进制转换成十进制 | |
float | 根据传入的参数,创建一个新的浮点数 | |
complex | 根据传入的参数,创建一个新的复数 | |
bytes | 根据传入的参数,创建一个新的不可变字节数组 | |
ord | 返回ASCII码表字符对应的整数 | |
chr | 返回整数所对应ASCII码表字符 | |
bin | 将十进制转换成二进制字符串 | |
oct | 将十进制转换成八进制字符串 | |
hex | 将十进制转换成十六进制字符串 | |
list | 根据传入的参数,创建一个新的列表 | |
dict | 根据传入的参数,创建一个新的字典 | |
tuple | 根据传入的参数,创建一个新的元组 | |
set | 根据传入的参数,创建一个新的集合 | |
str | 返回一个对象的字符串表现形式 | |
enumerate | 根据可迭代对象创建枚举对象 | |
range | 根据传入的参数,创建一个整数列表,一般用在 for 循环中 | |
iter | 根据传入的参数,创建一个新的可迭代对象 | |
slice | 根据传入的参数,创建一个新的切片对象 | |
序列操作 | all | 判断可迭代对象的每个元素是否都为True值,都为True的情况下,结果才是True |
any | 判断可迭代对象的元素是否有为True值的元素,有一个为True,结果就是True | |
filter | 用于过滤序列,过滤掉不符合条件的元素,返回符合条件的元素组成新列表 | |
map | 使用指定方法去作用传入的每个可迭代对象的元素,生成新的可迭代对象 | |
next | 返回可迭代对象中的下一个元素值 | |
reversed | 反转序列生成新的可迭代对象 | |
sorted | 对可迭代对象进行排序,返回一个新的列表 | |
zip | 把 2 个或多个列表合并,并创建一个元组对的列表,元组对的数量以合并列表的最短长度为准 | |
对象操作 | help | 返回对象的帮助信息 |
dir | 获取对象内部可以通过句点符获取的数据 | |
id | 返回对象的唯一内存地址 | |
hash | 返回一串随机的数字(哈希值) | |
type | 返回对象的类型,或者根据传入的参数,创建一个新的类型 | |
len | 返回对象的长度 | |
format | 格式化显示值 | |
反射操作 | isinstance | 判断某个数据是否属于某个数据类型 |
callable | 判断某个变量是否可以加括号调用 | |
变量操作 | globals | 返回当前作用域内的全局变量,和其值组成的字典 |
locals | 返回当前作用域内的局部变量,和其值组成的字典 | |
交互操作 | input | 读取用户输入的内容 |
打印输出对象 | ||
文件操作 | open | 使用指定的模式和编码打开文件,返回文件的读写对象 |
执行 | eval | 能够识别字符串中python代码并执行,不识别复杂结构的代码,只能识别最简单的 |
exec | 能够识别字符串中python代码并执行,能够识别复杂结构的代码 |
可迭代对象
内置有__ iter__方法的都叫做可迭代对象
可迭代对象
字符串 列表 字典 元组 集合 文件对象(本身就是迭代器对象)
不是可迭代对象
整型 浮点型 布尔值 函数名
可迭代对象能够支持for循环
迭代器对象
1.定义
内置有__ iter__ 和 __ next__的对象都称为迭代器对象
2.可迭代对象与迭代器对象的关系
可迭代对象调用__ iter__方法之后就会变成迭代器对象
迭代器对象调用__ iter__方法无论多少次还是迭代器对象本身
3.可迭代对象与迭代器对象的作用
可迭代对象, 迭代器对象, 通过打印操作无法直接看出内部数据的情况
这个时候他们都能够帮你节省内存
迭代器对象给我们提供了一种不依赖于索引取值的方式,正是因为有迭代器对象的存在,我们才能对字典、集合这些无序类型循环取值
for循环本质
语法结构
for 变量名 in 可迭代对象:
for循环体代码
1.for会自动将in后面的数据调用__iter__()变成迭代器对象
2.之后每次循环调用__next__()取值
3.最后没有值__next__()会报错 for能够自动处理该错误 让循环正常结束
异常捕获
1.定义
程序在运行的过程中如果出现了异常会导致整个程序的结束,异常就是程序员口中的'bug'
2.异常的结构
提示 | 说明 |
---|---|
关键字line所在行 | 精准提示你在哪一行代码出错 |
最后一行冒号左侧 | 是错误的类型 |
最后一行冒号右侧 | 错误的具体原因(也是改bug的关键) |
3.常见异常的类型
类型 | 说明 |
---|---|
NameError | 试图访问的变量名不存在 |
IndexError | 索引错误,使用的索引不存在,常为索引超出序列范围 |
KeyError | 使用了映射中不存在的关键字(键)时引发的关键字错误 |
SyntaxError | 语法错误 |
TypeError | 类型错误 |
4.异常分类
分类 | 说明 |
---|---|
语法错误 | 不允许出现的,一旦出现请立刻修改 |
逻辑错误 | 允许出现的,允许出错之后修改即可 |
5.异常捕获语法结构
1.基本语法结构(针对性很强)
try:
可能会出错的代码(被try监控)
except 错误类型1 as e: # e就是具体错误的原因
对应错误类型1的解决措施
except 错误类型2 as e: # e就是具体错误的原因
对应错误类型2的解决措施
except 错误类型3 as e: # e就是具体错误的原因
对应错误类型3的解决措施
2.万能异常(笼统的处理方式)
try:
name
d = {'name':'jason'}
d['pwd']
123 + 'hello'
except Exception as e: # 万能异常方式1
print(e)
except BaseException as e: # 万能异常方式2
print(e)
生成器对象
1.定义
生成器是我们自己定义出来的,也有__ iter__ 和 __ next__方法
生成器对象的目的是为了优化代码,节省数据类型的内存占用空间
2.yield关键字用法
-
在函数体代码中出现, 可以将函数变成生成器
-
在执行过程中, 可以将后面的值返回去, 类似于return
-
可以暂停住代码的运行
-
还可以接受外界的传值(了解)
生成器表达式
相比列表表达式,将[]换成了(),返回对象不是一个列表,而是一个生成器,相比列表更加省内存
(返回值 for 元素 in 可迭代对象 if 条件)
l1 = (i**2 for i in range(10) if i > 3)
print(l1) # <generator object <genexpr> at 0x000001A793439C10>
迭代取值与索引取值的差异
方法 | 优势 | 劣势 |
---|---|---|
索引取值 | 可以随意反复的获取任意数据值 | 针对无序的容器类型无法取值 |
迭代取值 | 提供了一种通用的取值方式(不论数据值是无序的还是有序的) | 取值一旦开始只能往前不能回退(不能随意反复取值) |
模块
模块简介
模块的分类
模块分类 | 解释 | 例子 |
---|---|---|
内置模块 | 解释器自带的,直接就可以使用的模块 | import time time.sleep(3) # 让程序暂停3秒 |
自定义模块 | 自己写的模块 | 注册功能 登录功能 |
第三方模块 | 别人写的模块,存在于网络上,使用之前需要提前下载 | 图形识别 图形视化 语音识别 |
模块的表现形式
1.py文件(py文件也可以称之为是模块文件)
2.含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
3.已被编译为共享库或DLL的c或C++扩展(了解)
4.使用C编写并链接到python解释器的内置模块(了解)
导入模块的两种语法句式
导入模块的句式1: import句式
import md
"""
import md
执行文件是
被导入文件是 md.py
1.会产生执行文件的名称空间
2.产生被导入文件的名称空间并运行该文件内所有的代码,存储名字
3.在执行文件中会获取一个模块的名字,通过该名字点的方式就可以使用到被导入文件名称空间中的名字
补充说明
同一个程序反复导入相同的模块,导入语句只会执行一次
"""
导入模块的句式2: from...import...句式
from md import money, read1
read1()
"""
1.创建执行文件的名称空间
2.创建被导入文件的名称空间
3.执行被导入文件中的代码,将产生的名字存储到被导入文件的名称空间中
4.在执行文件中获取到指定的名字,指向被导入文件的名称空间
"""
两种导入方式的优缺点
句式 | 优点 | 缺点 |
---|---|---|
import md | 通过md点的方式可以使用到模块内所有的名字,并且不会冲突 | md什么都可以点,有时候并不想让所有的名字都能被使用 |
from md import monry, read1 | 指名道姓的使用指定的名字,并且不需要加模块名前缀 | 名字极其容易产生冲突(绑定关系被修改) |
其他用法
1.起别名
2.导入多个名字
3.全导入
循环导入问题
-
如何理解循环导入
循环导入就是两个文件彼此导彼此
-
循环导入容易出现报错现象
使用彼此的名字可能是在没有准备好的情况下就使用了
-
如何解决循环导入保存现象
彼此在使用彼此名字之前,先准备好
注意:循环导入将来尽量避免出现!!!如果真的避免不了,就想办法让所有的名字使用之前提前准备好
判断文件类型
- 双下__ name__内置名
__name__
所有py文件都自带__name__内置名
当py文件是执行文件的时候__name__的结果是__main__
当py文件是被导入文件的时候__name__的结果是模块名(文件名)
- 双下name内置名的应用场景
一般是模块开发者用于测试自己的代码
if __name__ == '__main__'
当文件是执行文件时,才会执行的子代码
# 一般只出现在整个程序的启动文件中
'''在pycharm中,输入main+Tab 可以自动补全'''
模块的查找顺序
- 查找顺序
1.先去内存中找
2.再去内置中找
3.再去sys.path中找(程序系统环境变量)
绝对导入与相对导入
绝对导入
其实就是以执行文件所在的sys.path为起始路径,往下一层层查找
由于pycharm会自动将项目根目录添加到sys.path中,所以查找模块肯定不报错的方法就是永远从根路径往下一层层找
如果不是用pycharm运行,则需要将项目根目录添加到sys.path(针对项目根目录的绝对路径有os模块可以帮助我们获取)
相对导入
相对导入可以不参考执行文件所在的路径,直接以当前模块文件路径为准
1.只能在模块文件中使用,不能在执行文件中使用
2.相对导入在项目比较复杂的情况下,可能会出错
总结:相对导入尽量少用,推荐使用绝对导入(因为简单不会出错,只需从根路径往下一层层找就行)
名称 | 内容 |
---|---|
. | 在路径中意思是当前路径 |
.. | 在路径中意思是上一层路径 |
../.. | 在路径中意思是上上一层路径 |
包的概念
如何理解包
专业的角度:内部含有__ init__.py的文件夹
直观的角度:就是一个文件夹
包的作用
内部存放多个py文件(模块文件),仅仅是为了更加方便的管理模块文件
具体使用
导入包名其实导入的是里面的__ init__.py文件(该文件里面有什么你才能用什么)
其实也可以跨过__ init__.py直接导入包里面的模块文件
注意:
针对python3解释器:其实文件夹里面有没有__ init__.py已经无所谓了,都是包
针对python2解释器:文件夹下面必须要有__ init__.py才能被当做包
编程思想的转变
经历阶段 | 过程 | 代码编写在单文件内还是多文件内 | 举例 |
---|---|---|---|
小白阶段 | 按照需求从上往下堆叠代码 | 单文件 | 相当于将所有的文件全部存储在c盘并且不分类 |
函数阶段 | 将代码按照功能的不同封装成不同的函数 | 单文件 | 相当于将所有的文件在c盘下分类存储 |
模块阶段 | 根据功能的不同拆分不同的模块文件 | 多文件 | 相当于将所有的文件按照功能的不同分门别类到不同的盘中 |
软件开发目录规范
文件夹名 | 文件名 | 作用 |
---|---|---|
bin文件夹 | start.py | 用于存储程序的启动文件 |
conf文件夹 | settings.py | 用于存储程序的配置文件 |
core文件夹 | src.py | 用于存储程序的核心逻辑 |
lib文件夹 | common.py | 用于存储程序的公共功能 |
db文件夹 | userinfo.txt | 用于存储程序的数据文件 |
log文件夹 | log.log | 用于存储程序的日志文件 |
interface文件夹 | user.py order.py goods.py | 用于存储程序的接口文件 |
readme文件(文本文件) | 用于编写程序的说明,介绍,广告,类似于产品说明书 | |
requirements.txt文件 | 用于存储程序所需的第三方模块名称和版本 |
常见内置模块
注意:py文件名称尽量不要与模块名冲突(内置,第三方)
collections模块
名称 | 说明 |
---|---|
namedtuple | 可以创建包含名称的元组 |
deque | 双端队列,可以快速的在队列头部和尾部添加、删除元素 |
ordereddict | 有序字典,可以记住元素的添加顺序 |
defaultdict | 带有默认值的字典 |
Counter | 计数器,计数功能 |
时间模块之time模块
- 时间的三种格式
格式 | 表现形式 |
---|---|
时间戳 | time.time() |
结构化时间 | time.gmtime() |
格式化时间 | time.strftime() |
- 三种时间格式的展现形式
import time
print(time.time())
print(time.gmtime())
print(time.strftime('%Y-%m-%d %H:%M:%S'))
格式 | 含义 |
---|---|
%Y | 完整的年份 |
%m | 月份(01-12) |
%d | 一个月中第几天(01-31) |
%H | 一天中的第几个小时(24小时制,00 - 23) |
%M | 分钟数(00-59) |
%S | 秒数(01-59) |
%X | 本地相应时间 |
时间模块之datetime模块
名称 | 功能说明 |
---|---|
datetime.data | 日期对象,常用的属性有year,month,day |
datetime.time | 时间对象,常用的属性有hour, minute, second |
datetime.datetime | 日期时间对象,常用的属性有year,month,day,hour, minute, second |
datetime.timedelta | 表示时间间隔,即两个时间点的间隔,主要用于做时间加减的 |
os模块
- os模块主要是跟当前程序所在的操作系统打交道
名称 | 功能说明 |
---|---|
os.mkdir('dirname') | 生成单级目录 |
os.makedirs('dirname1/dirname2') | 生成多级目录,也可生成单级目录 |
os.rmdir('dirname') | 可以删除单级目录,但是目录下不能有其他数据,也不支持多级目录删除 |
os.removedirs('dirname') | 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 |
os.listdir('dirname') | 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 |
os.rename("oldname","newname") | 重命名文件目录 |
os.remove() | 删除一个文件 |
os.getcwd() | 获取当前工作目录,即当前python脚本工作的目录路径 |
os.chdir("dirname") | 改变当前脚本工作目录 |
os.path.dirname(__ file__) | 获取当前文件所在的目录路径 |
os.path.exists(path) | 如果path存在,返回True;如果path不存在,返回False |
os.path.isdir(path) | 如果path是一个存在的目录,则返回True, 否则返回False |
os.path.isfile(path) | 如果path是一个存在的文件,返回True, 否则返回False |
os.path.join() | 拼接路径 |
os.path.getsize() | 获取文件大小(bytes) |
sys模块
- sys模块主要是跟python解释器打交道
名称 | 功能名称 |
---|---|
sys.argv | 命令行参数List,第一个元素是程序本身路径 |
sys.path | 返回模块的搜索路径, 结果是列表 |
sys.version | 获取Python解释程序的版本信息 |
sys.platform | 返回操作系统平台名称 |
sys.exit(n) | 退出程序,正常退出时exit(0),错误退出sys.exit(1) |
json模块
- 简介
json模块也称之为序列化模块
什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化
- 作用
json模块是不同编程语言之间数据交互必备的模块(处理措施)
- json格式的数据
数据基于网络传输肯定是二进制,那么在python中只有字符串可以调用encode方法转成二进制数据,所以json格式的数据也属于字符串
json格式的数据有一个非常明显的特征:首先肯定是字符串,其次是标志性的双引号
名称 | 功能说明 |
---|---|
json.dump() | 将其他数据以json格式字符串写入文件 |
json.load() | 将文件中json格式字符串读取出来并转换成对应的数据类型 |
json.dumps() | 将其他数据类型转换成json格式字符串 |
json.loads() | 将json格式字符串转化成对应的数据类型 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了