目录
一、异常的捕获与处理
异常的错误类型
异常就是我们平时说的bug,也叫报错
异常根据错误的原因分成很多类型比如:
KeyError
关键字错误,查找字典不存在的键
NameError
名称错误,比如引用的时候用了不存在的名字
ValueError
数据值错误,数据值不符合设定的条件
SystemError
一些语法错误
TypeError
数据类型使用错误
IndexError
索引错误
StopIteration
迭代器中出现,当迭代对象用尽再次迭代就会报错
Exception和BaseException
这两个是万能错误,包含所有的错误类型,但是这里要注意,BaseException是Exception的父系,也就是它的功能更强大
异常处理的语法结构和讲解
try:
需要监测错误的代码
except 错误类型 as e:
当前错误类型下的应对措施
这里我们可以看到代码分成两部分,上面部分是用于监测代码是否有错误的,下面部分需要指定错误类型,然后才能使用相应的应对措施。
同时as e可以不写,当我们写上的时候会输出系统的错误提示
然后我们也要知道对应的错误类型才能进行处理错误的操作,如果不是这个错误类型,就会直接报错,但是我们可以用多个excetp关键字+错误类型来包含所有的错误可能性,同时我们也可以使用上面说的万能错误来接收,当我们在检测到多个错误的时候就会检测第一个错误,然后停止运行,后面的都不会检测了
之后我们说到异常语法结构还可以跟上else和finally,当代码正常运行没有报错的时候,就会进入else下,运行下方代码,但是当运行到finally的时候,不管有没有监测到异常都会运行下方的代码,都会运行
虽然这个异常监测和处理的语法可以很大程度的减少我们代码的错误,但是这并不意味着我们需要频繁使用他来减少运行时候的错误,相反我们应该尽量少的使用他,同时在使用的时候,我们也应该让try下方的代码尽量少,
主动抛出异常
主动抛出异常分成两种,一种是断言,一种是符合条件主动抛出异常
断言
断言用到了assert关键字
格式如下:
assert 判断语句
如果我们的代码执行结果符合断言语句的判断,那么就继续运行,这个断言语句就等于没有出现过一样,但是当代码的执行结果不符合我们预期的断言结果,就会主动抛出异常中断代码运行。
主动抛出异常
主动抛出异常用到了一格raise关键字
当我们在运行代码的时候,运行到raise处就会直接报错停止代码运行
异常处理应用举例
我们在使用for循环的时候就是用上了类似的方法,当我们把生成器对象变成迭代器对象之后一次次的使用双下next一次次取值,当取完值之后还会继续使用双下next进行一次取值,这个时候就会报错,然后我们就可以使用异常处理的代码让代码结束运行
二、生成器
什么是生成器
生成器就是迭代器的一种
两者的区别:
迭代器的类型对象都是python的数据类型和文件
但是生成器的类型对象通常是我们编写的代码,其他特性都和迭代器一样
生成器的两种形式
1、生成器表达式
l1 = (i ** 2 for i in range(100))
基本形式跟生成式一样
但是外面是代表元组的括号,内部是进行的操作和操作对象
2、自定义生成器
自定义生成器就是定义一个函数,然后内部不写return使用yield来控制程序运行
格式
def outter():
内部代码
yield
当我们运行自定义生成器的函数时,这时候这个函数就是变成了一个迭代器对象,相当于用了双下iter,然后当我们使用一次双下next就会运行一次代码,到yield关键字处就会停止运行,当我们下一次运行双下next的时候就会从停止位置往下运行,运行到下一个yield又会停止。需要注意,yield关键字也可以返回返回值,跟return一样,这里还要说一个yield 的冷门功能,当我们用变量绑定yield的时候,在外面调用的时候可以用send方法给这个变量传值并运行一次双下next。
三、索引取值和迭代取值的差异
四、模块
1、模块的本质
模块就是具有一定功能的py文件
python的模块可以直接导入对应的功能,非常好用,降低了功能实现的难度,在早期,其他语言的程序员喜欢叫python语言的使用者为调包侠,但是后来由于python调包的功能可以实现很复杂的功能,也变得使用面更为广泛了,其他语言的程序员也开始使用python
2、模块的多种表现形式
1.py文件
2.包(包含py文件的文件夹,内部有双下init)
3.被编译为共享库或ddl的c或c++扩展
4、使用c语言编写并链接到python解释器的内置模块
3、模块的分类(来源)
1.自己编写的py文件
2.内置模块
3.第三方python模块(大佬写的模块)
4、模块的两种导入语句
import 模块名称
from 模块名称 import 名称
两种模块在导入单个的py文件的时候需要注意,import是导入整个模块,from是导入单个的名称
在使用的时候可以看到,import方式导入的模块需要在用:模块名称.名称的形式来调用,from可以直接用名称调用,如果想要调所有的名称,可以用*号代替。使用星号的时候也可以用双下all来设置外界能获得的名称,但是不能影响到import方式导入的模块
import在使用的时候相当于给这个执行文件一个模块名称,然后另外建立了一个名称空间存放自己的名称,当调用模块中的名称就传过去。如果使用from方式的话就会直接把这个名称传给被执行文件的全局名称空间,如果有重复的名称会产生名称的顶替
5、其他相关知识补充
1.当我们在调用多个模块的时候,可以用逗号隔开,连写多个,但是需要注意,最好根据模块的功能来编写,功能相似的一起导入
2.导入模块的时候如果名称很复杂,我们可以用as 名称的方式进行重命名,在代码中调用的时候用这个自己命名的名称就可以达成目的
3.如果重复导入模块,容易出现错误,因此不推荐,但是真的遇到的时候,需要知道还是一样的流程,还是从执行文件运行,到了导入模块之后运行被导入文件,在被导入文件中出现导入执行文件的动作,这个时候就是在走一遍执行文件的代码,然后再运行导入文件中导入语句后面的代码,执行完导入文件后回到执行文件中运行导入文件后面的代码。中间运行的时候还要注意导入语句的位置,不能出现先调用后定义的情况。
6、判断文件类型
在运行模块导入操作的时候我们需要分清楚哪个是执行文件哪个是模块文件,这里用到了一个方法
双下name,当这个方法出现在执行文件中会返回双下main,当这个方法出现在模块文件中会返回模块名称
7、模块的查找顺序
1.内存
内存中的已经运行起来的模块会先被使用,我们可导入模块然后使用time.sleep停止几秒,期间删除模块文件,最后会发现程序仍能运行一次
2.内置模块
当我们在使用模块的时候会先去内置模块中查找,这里需要注意,如果我们的创建的模块名称跟内置模块的一样,会导致模块不被调用,被调用的会是内置模块
3.sys.path
这是python 解释器的环境变量,也就是一个查找的路径,在前两个地方找不到就会根据这里的路径来查找模块,如果找不到就会报错
8、绝对导入和相对导入
绝对导入就是在导入的时候使用文件的绝对路径,相对导入就是在导入的时候用到几个特殊符号:
.表示当前路径位置
..表示上一级目录位置
..‘\’..返回上上级目录,引号不要,凸显撬棍符号用的
9、包的概念
包就是内部有py文件,有双下init.py文件的文件夹,导入包的语句也是import和from
10、包的具体使用
导入模块的时候需要注意双下init,python2中必须有,python3可以没有,但是为了兼容性考虑我们需要写上,如果只是导入几个模块,可以使用from语句来导入指定的模块
五、编程思想的转变
分成三个阶段
第一个阶段是面条阶段,在编写的时候就是根据顺序一一执行代码。
第二个阶段就是函数阶段,函数阶段就是把功能相似的代码封装起来,调用的时候更方便,代码也会看着更整洁,对功能进行打包
第三个阶段就是模块阶段,使用模块把功能类似的代码放到一起,整合优化
六、软件开发目录规范
1、bin目录
内部存放程序的执行文件,文件名称可以是start.py
2、conf目录
内部存放配置文件,比如我们的桌面上的一些设置就是存在对应的配置文件中的,文件名称一般是settings.py
3、core目录
内部存放核心功能的代码,文件名称一般是src.py
虽然说是存放核心功能,但是并不意味着主体功能就需要放在这里,可以放到下面的interface目录
4、lib目录
内部存放一些公共功能的代码文件,文件名称一般是common.py
5、db目录
用于存储数据文件,比如之前编写的员工信息管理系统,我们可以把员工信息的txt文件放到这个目录下
6、interface目录
内部存放端口文件,上面说了,核心功能的文件写在core目录中,但是主体功能是从interface目录下的代码中调用过去的。需要根据具体的业务逻辑划分对应的文件,通常的命名是goods.py等见名知意的名字
7、log目录
这里是日志目录
内部文件就是记录一下平时我们的操作记录
文件名一般是log.log
8、readme文件
通常是一个文本文件用于说明项目相关信息
9、requirements.txt文件
内部存项目所需要的模块以及版本信息
七、常用内置模块
1、collections模块
1.具名元组:namedtuple
2.双向列表:deque
3.有序字典:OrderedDict
4.字典集合:ChainMap()
5.当 key 不存在时返回默认值:defaultdict
6.可以重新排序的字典:OrderedDict
7.计数器:Counter
2、时间模块
1.time模块
三种时间表现形式
1.时间戳(timestamp)
2.结构化时间(struct_time)
3.格式化时间(Format String)
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%M 分钟数(00=59)
%S 秒(00-59)
%x 本地相应的日期表示
%X 本地相应的时间表示
gmtime
localtime
把时间戳转化成结构化时间
localtime
把结构化时间转化成时间戳
strftime
把结构化时间转化成字符串时间
strptime
字符串时间变成结构化时间
2.datatime模块
1.datetime.now() # 获取当前datetime
datetime.utcnow() # 获取当前格林威治时间*
2.datetime(2017, 5, 23, 12, 20) # 用指定日期时间创建datetime
3.字符串转换成datetime类型:
'2017年9月30日星期六'
e=datetime.strptime('2017年9月30日星期六','%Y年%m月%d日星期六')
3、random模块
返回随机数
random
返回0-1之间的小数
uniform(1,3)
大于1小于3的小数
randint
randrange
返回随机整数,括号内可以指定范围
choice/choices
没有s就是返回数据值本身的类型,有s就是返回一个列表类型的值
sample
随机返回几个值,第二个参数是设置返回的个数
shuffle
打乱一组数据值的顺序
4、os模块
针对操作系统的交互
1.mkdir/makedirs
创建目录,mkdir是创建路径下的单个文件夹,makedirs是创建路径下的一系列文件夹
2.rmdir/removedirs
rrmdir是删除单个文件夹,removedirs是删除路径下的一系列文件夹,但是内部不能有文件,得是空文件夹
3.listdir
可以写上参数(路径),返回路径下的所有文件名称
4.rename/remove
重命名/删除文件
5.getcwd/chdir
获取当前目录/更改目录(写上'..'返回上一级目录)
6.abspath/dirname
可以在括号内写上双下滑线file动态获取当前路径
7.exists/isfile/isdir
判断文件或者目录是否存在
8.join
路径拼接(重要)
9.getsize
获取文件大小(字节)
5、sys模块
sys模块是针对python解释器的一个模块
1.arge
实现程序外部向程序传参,在pycharm中无法实现传参
2.path
获取python解释器的环境变量
3.getrecursionlimit
获取python解释器的最大递归深度
4.setrecursionlimit
修改解释器的最大递归深度
5.version
返回当前解释器的版本
6.platform
返回平台信息
7.exit
arg = 0表示程序正常退出,其他异常退出的情况就会出现别的数值
6、json模块
分成四个方法。两个是针对数据值,两个针对文件
dumps把python类型的数据值变成json类型
loads把json类型的数据值变成python类型
dump是把数据值存到文件中
load是把数据值从文件中取出来变成python格式