异常与模块

异常常见类型

SyntaxError: 语法错误
NameError: 名称错误
IndexError: 索引错误
KeyError: 键错误
TypeError: 类型错误
IndentationError: 缩进错误
......

异常处理语法结构

1.基本语法结构
    try:
        待监测的代码(可能会出错的代码)
    except 错误类型:
        针对上述错误类型制定的方案
2.查看错误的信息	
	 try:
        待监测的代码(可能会出错的代码)
    except 错误类型 as e:  # e就是系统提示的错误信息
        针对上述错误类型制定的方案
3.针对不同的错误类型制定不同的解决方案
	 try:
        待监测的代码(可能会出错的代码)
    except 错误类型1 as e:  # e就是系统提示的错误信息
        针对上述错误类型1制定的方案
    except 错误类型2 as e:  # e就是系统提示的错误信息
        针对上述错误类型2制定的方案
    except 错误类型3 as e:  # e就是系统提示的错误信息
        针对上述错误类型3制定的方案
 	

4.万能异常 Exception/Exception

任何错误信息都可以用该方案

 try:
        待监测的代码(可能会出错的代码)
    except Exception as e:  # e就是系统提示的错误信息
        针对各种常见的错误类型全部统一处理

5.结合else使用

 try:
        待监测的代码(可能会出错的代码)
    except Exception as e:  # e就是系统提示的错误信息
        针对各种常见的错误类型全部统一处理
    else:
        try的子代码正常运行结束没有任何的报错后 再执行else子代码

6.结合finally使用

 try:
        待监测的代码(可能会出错的代码)
    except Exception as e:  # e就是系统提示的错误信息
        针对各种常见的错误类型全部统一处理
    else:
        try的子代码正常运行结束没有任何的报错后 再执行else子代码
    finally:
        无论try的子代码是否报错 最后都要执行finally子代码

7.断言

name = 'jason'
    # assert isinstance(name, int)
    assert isinstance(name, str)
    print('哈哈哈 我就说吧 肯定是字符串')
    name.strip()

8.主动抛异常

 name = 'jason'
    if name == 'jason':
        raise Exception('老子不干了')
    else:
        print('正常走')

生成器对象

本质还是迭代器对象
只不过生成器对象是自己定义出来的。迭代器对象是解释器自动提供的。

生成器对象语法结构

(1)函数体代码中有yield关键字,那么函数名加括号不会调用函数体代码,而是产生了一个生成器对象(也叫迭代器对象)。用变量名接收可以理解为调用了__iter__方法
(2)打印该变量名出来的是生成器对象,只有用该变量名点__next__()方法才会迭代取值
(3)每次执行完__next__()方法后代码会停在yield位置,等下次执行该方法时才会继续取下一个值

索引取值与迭代取值的差异

索引取值 迭代取值
优点 可以任意位置任意次数取值 支持所有类型的数据取值(无序、有序)
缺点 不支持无序类型的数据值(字典、集合) 只能从前往后依次取值

模块

内部具有一定功能代码的py文件

模块的表现形式

(1)py文件(也称之为模块文件)
(2)含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)

模块的三大分类

1.内置模块

python解释器自带可以直接使用的模块 import time等

2.自定义模块

自己写的模块 注册、登录..

3.第三方模块

别人写的模块文件,在网上下载的图形识别、图像可视化..

导入模块的两种句式

注意:
①.项目中所有py文件名都要是英文,没有中文和数字
②.导入模块文件不需要填写后缀名import md
③.同一个py文件中反复导入相同的模块,导入语句只会执行一次

1)import ..句式

import md
1.先产生执行文件的名称空间
2.执行模块文件的代码,产生模块名称空间
3.在执行文件的名称空间中产生一个模块文件的模块名,通过点的方式就可以使用该模块名称空间中的名字

2)from .. import ..句式

from a import name
1.先产生执行文键的名称空间
2.执行模块文件的代码,产生模块名称空间
3.在执行文件的名称空间中产生对应的名字绑定模块名称空间中对应的名字,通过点的方式就可以使用该模块名称空间中的名字
import..句式 from..import..句式
优点 可以通过模块名点的方式可以使用到模块内所有的名字,且不会冲突(md.name) 指名道姓的使用需要的名字,直接就可以使用该名字,不用模块去点(name)
缺点 由于模块名什么都可以点,有时候不想让所有的名字都能被使用 容易与执行文件中的名字产生冲突

判断文件类型

所有的py文件都可以直接打印__name__判断文件类型
当文件是'执行文件'时:
print(__name__)
#结果为:__main__

当文件是'被导入文件'时:
print(__name__)
#结果为:被导入的文件名
一般__name__主要是用于测试自己代码时使用:当文件是执行文件时才往下走子代码
if __name__=='__main__'
    print('当文件是执行文件时才会执行if的子代码')
    
#上述脚本一般只出现在整个程序的启动文件中

模块的查找顺序

1.先去内存中查找
  #验证:在执行文件中执行被导入文件中的函数,在执行过程中删除被导入文件发现还可以使用
    import md #导入执行md模块
    import time #导入执行time模块
    time.sleep(15) #让程序暂停15s再执行   
    '中途如果把md模块文件删掉 还会继续执行,因为删除的是硬盘中的,内存中的还在'
    print(name)#结果为:jason
____________________________________________
2.再去内置中查找
  #验证:创建一个和内置模块相同的模块文件名
    【time.py】:
    name = 'jason'
    
    【执行文件.py】:
    from time import name
    print(name)#结果会报错
    import time
    print(name)#结果会报错
_____________________________________________
3.然后去执行文件所在的sys.path中查找 # 不是系统环境变量
需注意'所有路径都是参照执行文件所在的路径去查找'
  #验证:如果执行文件和被执行文件在不同文件夹下,则要把模块所在的文件路径添加到执行文件的sys.path中
    import sys
    # print(sys.path)#执行sys.path结果为当前执行文件的环境变量,以列表显示
    sys.path.append(r'D:\pythonProject1\day17\aa')#将被导入文件的路径添加
    import md3
    print(md3.name)#此时打印md3中的name就可以找到 不添加路径则找不到

绝对导入

(1)就是以执行文件所在的sys.path为起始位置一层一层查找

from aa import md

(2)当涉及文件嵌套多个文件名时,则要在文件名后加点和内层文件名

from aa.bb.cc import md

相对导入

#点号在相对导入中的作用
.     在路径中表示当前目录
..    在路径中表示上一层目录
..\.. 在路径中表示上上一层目录

(1)相对导入可以不参考执行文件所在的路径,直接以当前模块文件路径为准!!!

from . import md2

不同解释器如何理解包

python3解释器:文件夹里有没有__init__.py文件都无所谓,都叫包
python2解释器:文件夹里必须有__init__.py文件才叫包

包的具体使用

虽然python3解释器对包的要求降低了,不需要__init__.py就可以识别,但是为了兼容考虑建议不管什么版本解释器都加上。

1.如果想只用包里的某几个模块
from aa import md1,md2
print(md1.name)#可以使用md1中的name

2.如果直接导包名则就是包下面'__init__.py文件',该文件中有什么名字就可以通过包名点什么名字
import aa
print(aa.name)#可以使用aa包里__init__.py里的名字

软件开发目录规范

针对上述,所有程序目录都要有一些规范!

1.bin文件夹         'start.py'
    启动文件#可有可无,启动文件也可放根目录下
2.conf文件夹        'settings.py'
    配置文件#里面都是不常改变的常量:常量名大写
3.core文件夹        'src.py'
    核心逻辑#存放项目核心功能文件
4.interface文件夹   '注册、登录..'
    接口文件#根据具体业务逻辑划分对应文件
5.lib文件夹         'common.py'
    公共功能#很多文件都要使用
6.db文件夹          'userinfo.txt'
    存储用户数据#注册后的用户信息,今后会被数据库代替
7.log文件夹         'log.log'
    日志文件#今后会被日志模块代替
8.readme.txt文件
    使用说明书
9.requirements.txt文件
    第三方模块#存放该程序需要的第三方模块和版本

python常用内置模块

1.collections模块

除了基本数据类型(dict、list、set、tuple),collections模块还提供了几个额外的数据类型:nametupledequeOrderedDictCounter

nametuple具名元组

就是可以给一个元组命名,通过名字可以访问内部自定义的属性

简单理解就是:如果用元组表示一个坐标,那我突然给你一个元组你分不清x和y分别对应的是什么,这个时候就可以用具名元组

# 表示二维坐标系

from collections import namedtuple
zuobiao = namedtuple('二维坐标', ['x', 'y'])
p1 = zuobiao(1, 2)
print(p1)  # 二维坐标(x=1, y=2)
print(p1.x)  # 1
print(p1.y)  # 2
#可以用来做简单扑克牌

from collections import namedtuple
puke = namedtuple('扑克牌', ['花色', '点数'])
res1 = puke('♥', 'A')
print(res1)  # 扑克牌(花色='♥', 点数='A')

deque双端队列

队列:先进先出,后进后出
堆栈:先进后出,后进先出
队列和堆栈都是:一边只能进,另一边只能出

一般表示队列堆栈不用该模块,仅作了解

pop()尾部弹出 popleft()首部弹出
append()尾部追加 appendleft()首部追加
列表里可没有首部弹出、首部追加哦

from collections import deque
q = deque([1, 2, 3])
q.append(4)     # 尾部追加4
q.appendleft(0) # 首部追加0
print(q)  # deque([0, 1, 2, 3, 4])
print(q.pop())  # 4 【队列:取出最后面的】
print(q.popleft()) # 0 【堆栈:取出最前面的】

OrderedDict有序字典

使用字典时K键是无序的,当想对字典做迭代时没办法保证K键的顺序。
如果想让字典有顺序则可以用有序字典

补充了解:3.6版本解释器后字典都变成按照插入顺序来的了。

d=dict()
d['name']='jason'
d['age']=18
d['job']='teacher'

for i in d:
    print(i)
______________________________
from collections import OrderedDict
d=OrderedDict()
d['name']='jason'
d['age']=18
d['job']='teacher'

for i in d:
    print(i)

defaultdict默认值字典

普通字典打印没有的键时会报错,defaultdict则会返回空

d1 = dict()
from collections import defaultdict
d2 = defaultdict(list)
print(d1['a'])  # 报错
print(d2['a'])  # []

Counter计数器

主要用来统计出现次数

#方式一:

from collections import Counter
c=Counter('aabbbccc')
print(c)
#结果为:Counter({'b':3,'c':3,'a':2})
#方式二:

s1 = 'aabbbccc'
new_dict = {}
for i in s1:
    if i not in new_dict:
        new_dict[i] = 1
    else:
        new_dict[i] += 1
print(new_dict)
#结果为:{'a':2,'b':3,'c':3}

time与datetime时间模块

time时间模块

三种时间的表现形式:
   1.时间戳 (从1970年1月1日0时0分0秒到现在的时间)
   2.结构化时间(主要给计算机看的时间)
   3.格式化时间(主要给人看的时间)

#其他用法:time.sleep(10) 让程序停止10秒
#1.时间戳
import time
print(time.time())
#结果为:1666174527.7080512
"""
一般用于在某个代码前后加,用来得出该代码执行时间
"""
#2.结构化时间
import time
print(time.localtime())
#结果为:查看本地时间
print(time.gmtime())
#结果为:查看UTC时间 英国伦敦
#3.格式化时间
import time
print(time.strftime('%Y-%m-%d %H:%M:%S'))
#结果为:2022-10-19 18:25:23
print(time.strftime('%Y-%m-%d'))
#结果为:2022-10-19
"""
%Y 年  |  %m 月  |  %d 日
%H 时  |  %M 分  |  %S 秒
"""

datetime时间模块

"""
datetime 年月日时分秒
date     年月日
time     时分秒
"""

random随机数模块

import random

"""随机打印数字"""
print(random.random())#产生一个从0~1的小数
print(random.randint(1,5))#产生一个从1~5的小数
print(random.randrange(1,10,2))#产生一个从1~10的奇数

"""从数据集中随机打印数据"""
print(random.choice([1,2,3]))#随机打印一个列表中的数据值
print(random.choices([1,2,3]))#随机打印一个列表中的数据值并组成列表
print(random.sample([1,2,3],2))#随机打印两个列表中的数据值并组成列表

"""打乱数据集顺序"""
l1=[1,2,3,4,5]
random.shuffle(l1)#把列表中的数据随机打乱顺序
print(l1)

os模块

import os

os模块主要是当前程序与所在的操作系统打交道
1).创建目录(文件夹)

在执行文件所在的路径下创建目录

mkedirs()创建目录

(1)创建多级目录 # 常用
os.makedirs(r'md2') #可创建单级
os.makedirs(r'md2\md3') #也可以创建多级

(2)创建单级目录 # 不常用
os.mkdir(r'md')
2).删除目录(文件夹)

rmdir()删除空的单级目录
removedirs()删除空的多级目录

(1)删除'空的单级目录' # 目录下不能有任何文件
os.rmdir(r'md1')

(2)删除'空的多级目录' # 从内到外删除,直到某目录下有其他文件为止
os.removedirs(r'md2\md3\md4\md5')
3)列举指定路径下所有文件、目录名
结果会以列表展示

listdir()举例路径下所有文件、目录名

print(os.listdir(r'md2\md3'))

# 不写路径则是执行文件路径下所有文件、目录名
4)重命名文件\目录

rename()重命名文件、目录

os.rename(r'lx.py',r'lxx.py') # 给某文件重命名
os.rename(r'md1',r'md11')     # 给某目录重命名
5)删除文件(py文件)

remove()删除文件

os.remove(r'lx.py') # 删除某文件
6)获取、切换当前工作路径

getcwd()获取当前工作路径
chdir('..')切换到上一级目录

print(os.getcwd()) # D:\pythonProject1\day19
os.chdir('..')     #切换到上一级目录中
print(os.getcwd()) # D:\pythonProject1
7)动态获取项目路径(重要!)

dirname(__file__)项目根路径
abspath(__file__)执行文件绝对路径

(1)动态获取'项目根路径'********
print(os.path.dirname(__file__))
# D:/pythonProject1/day19

(2)动态获取项目'根路径的上一级路径'
print(os.path.dirname(os.path.dirname(__file__))) 
# D:/pythonProject1/day19

(3)动态获取执行文件的'绝对路径'
print(os.path.abspath(__file__))#D:\pythonProject1\day19\run.py
8)判断路径是否存在

exists()判断路径是否存在
isdir() 判断路径是否是目录
isfile() 判断路径是否是文件

'结果为布尔值'
(1)判断路径是否存在
print(os.path.exists(r'路径')) # 可以是详细的文件夹或py文件
#结果为:True/False

(2)判断路径是否是目录(文件夹)
print(os.path.isdir(r'路径'))

(3)判断路径是否是文件(py文件)
print(os.path.isfile(r'路径'))
9)拼接路径

join()拼接路径
项目中涉及路径拼接时不要自己去手动做,要【动态获取】

join方法会自动识别当前操作系统并转换分割符号:windows用:\ mac用:/

a=r'D:\aa'
b=r'a.txt'
new_path=os.path.join(a,b) #将a和b拼接
print(new_path) # D:\aa\a.txt
10)获取文件大小

大小单位是:bytes字节

print(os.path.getsize(r'a.txt')) # 29

sys模块

import sys

sys模块主要是当前程序与python解释器打交道
(1)获取执行文件的环境变量
print(sys.path)

(2)获取最大递归深度 与 修改最大递归深度
print(sys.getrecursionlimit()) # 1000
sys.setrecursionlimit(2000)    # 修改解释器最大递归深度
print(sys.getrecursionlimit()) # 2000

(3)获取当前解释器版本信息
print(sys.version)
#3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)]

(4)获取当前平台信息
print(sys.platform) # win32

(5)实现从程序外向程序内传递参数
sys.argv   #如下图

json模块

import json

1.jason模块也称为:序列化模块,可以让不同的编程语言之间交互!
2.序列化:
将字典、列表等内容转换成一个字符串的过程就叫序列化

3.jason格式数据属于什么类型:由于数据基于网络传输只能用二进制,python中只有字符串可以调用encode编码转二进制,所以json格式的数据也属于字符串
4.json格式数据特征:
字符串类型引号是双引号

#针对数据
json.dumps() 将其他数据类型转换成json格式字符串
json.loads() 将json格式字符串转换成对应数据类型

#针对文件
json.dump()  将其他数据类型以json格式字符串'写入文件'
json.load()  将文件中json格式字符串读取出来并转换成对应的数据类型
posted @ 2022-10-23 21:01  梅梅小可爱  阅读(56)  评论(0)    收藏  举报