异常
错误类型
语法错误(Syntax errors) 代码编译时的错误,不符合Python语言规则的代码会停止编译并返回 错误信息 异常(Exceptions) 相较于语法错误,异常比较难发现,因为它只在代码运行时才会发生, 如类型错 误、数值错误、索引错误和属性错误等。 语法错误包含在异常基类中
语法错误( SyntaxError ):
1.缺少起始符号或结尾符号(括号、引号等)
2.缩进错误
3.关键词拼写错误
异常引起的原因
1.在定义函数之前就引用该函数 2.调用不属于某个对象的方法或者属性 3.试图将某个值转换为不恰当的数据类型
六种典型的异常
1.除零错误(ZeroDivisionError):除数为0
2.名称错误(NameError):变量使用前未进行申明或者初始化
3.类型错误(TypeError):某些函数或者方法只适用于特定的数据类型,如果 对数据类型的操作不当,就会产生类型错误
4.数值错误(ValueError):在输入类型正确的情况下,具体输入值错误
5.索引错误(IndexError):超出序列长度的索引操作
6.属性错误(AttributeError):方法或者属性不适用该对象
捕获异常
程序要遇到异常的时候,往往是直接中断,跳出执行。但是有些时候,我们需要在遇到异常的时候另外处理,而不是直接停止。 try...except...语句
try...except...else语句
当在 try...except... 后加入的 else 指,当程序没发生错误时执行的部分
finally子句
finally语句是指,无论程序运行对或错,都会执行的部分
除了在代码运行出错时触发错误,我们还可以主动控制抛出异常,通过使用 关键词 raise(类似Java语言中的throws)
re模块
一、匹配单个字符
二、匹配多个字符
三、匹配开头或结尾
四、匹配分组
import re
# 写一个正则表达式
pattern = "你好"
# 写一个要去被正则表达式处理的字符串
str1 = "今天天气真好,你好!!"
print(re.search(pattern, str1))
# \d代表的是匹配一个数字0-9
print(re.match(r"速度与激情\d", "速度与激情300").group()) # .group()将匹配到的内容取出来
print(re.match(r"数加科技[2-7]", "数加科技700")) # [] 代表的是范围
print(re.match(r"数加科技[abc123]", "数加科技zbc123"))
print(re.match(r"数加科技.", "数加科技7")) # 一个点代表的是匹配任意一个字符
print(re.match(r"数加科技.*", "数加科技")) # .* 表示任意一个字符会出现0次或者0次以上
print(re.match(r"数加科技.+", "数加科技e")) # .+ 表示任意一个字符会出现1次或者1次以上
print(re.match(r"数加科技.?", "数加科技")) # .? 表示任意一个字符会出现0次或者1次
print(re.match(r"数加科技.{3}", "数加科技qwer")) # {出现的次数} 限定要出现的次数
print(re.match(r"数加科技.{3,6}", "数加科技qwerty")) # {m,n} 表示匹配m-n次数
print(re.search(r"^a数加科技", "a数加科技123")) # 匹配字符串的开头位置
print(re.search(r"a数加科技$", "123a数加科技")) # 匹配字符串的结尾位置
print(re.match(r"数加科技(ab|123)@(qq|163).com", "数加科技123@qq.com").group(2))
# 正则中的或者: | 与括号一起使用时,指括号内的|两边的正则的或者,当正则表达式成功时,可以取匹配成功的分组内的值
输出结果:
五、特殊字符
对于前面提到的所有用于匹配特殊字符,当要匹配它本身时,只需要在后面加上一个反斜杠:\
六、正则表达式修饰符 - 可选标志
print(re.match(r"a", "A", re.IGNORECASE)) # re模块中的常量IGNORECASE,表示忽略大小写去使用正则表达式,其中re.IGNORECASE与re.I用法相同
七、re中的函数
1.查找一个匹配项
查找并返回一个匹配项的函数有3个:search、match、fullmatch,他们的区别分别是:
-
search: 查找任意位置的匹配项
-
match: 必须从字符串开头匹配
-
fullmatch: 整个字符串与正则完全匹配
# match函数匹配是从字符串开头进行匹配
print(re.match(r"数加", "123数加456"))
# search函数匹配是任意位置匹配,,只要有符合正则表达式的字符串就匹配成功,但search函数值返回一个。
print(re.search(r"数加", "123数加456"))
# fullmatch函数匹配的是整个字符串是否符合规则,fullmatch函数需要完全相同
print(re.fullmatch(r"^(13\d|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9]|17\d)\d{8}$", "17376989014"))
输出结果:
2.查找多个匹配项
findall: 从字符串任意位置查找,返回一个列表
finditer:从字符串任意位置查找,返回一个迭代器
两个方法基本类似,只不过一个是返回列表,一个是返回迭代器。我们知道列表是一次性生成在内存中,而迭代器是需要使用时一点一点生成出来的,内存使用更优。
text = 's数加科技666,dsadsa数加科技66632131'
pattern = r"数加科技6{3}"
# 查找所有匹配项,返回一个list
print("findall查找:", re.findall(pattern, text))
# 查找所有匹配项,返回一个迭代器
print("finditer查找:", len(list(re.finditer(pattern, text))))
输出结果:
3.分割
re.split(pattern, string, maxsplit=0, flags=0) 函数:用 pattern 分开 string , maxsplit表示最多进行分割次数
# 查找一个匹配象
text = 's数加科技666,j数加科技666,x数加科技666'
pattern = r","
# 使用正则进行切割
print(re.split(pattern,text,maxsplit=1))
输出结果:
注:
str.split函数功能简单,不支持正则分割,而re.split支持正则。
4.替换
替换主要有sub函数 与 subn函数,他们功能类似!
先来看看sub函数的用法:
re.sub(pattern, repl, string, count=0, flags=0) 函数参数讲解:repl替换掉string中被pattern匹配的字符, count表示最大替换次数,flags表示正则表达式的常量。
值得注意的是:sub函数中的入参:repl替换内容既可以是字符串,也可以是一个函数哦! 如果repl为函数时,只能有一个入参:Match匹配对象。
text = '1数加科技666,2数加科技666,3数加科技666'
pattern = r","
repl = "|"
# 使用正则进行替换
print(re.sub(pattern, repl, text, count=1, flags=re.IGNORECASE))
print(re.subn(pattern, repl, text, flags=re.IGNORECASE))
输出结果:
5.编译正则对象
compile函数 与 template函数 将正则表达式的样式编译为一个 正则表达式对象 (正则对象Pattern),这个对象与re模块有同样的正则函数(后面我们会讲解Pattern正则对象)。
pattern = r"^(13\d|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9]|17\d)\d{8}$"
pattern_obj = re.compile(pattern)
# 查找任意位置
print(pattern_obj.search("123456789112"))
print(pattern_obj.fullmatch("1234564892"))
print(pattern_obj.fullmatch("17334324432"))
6.其他
re.escape(pattern) 可以转义正则表达式中具有特殊含义的字符
text = '数加科技.确实*牛'
pattern = re.escape("数加科技.确实*牛")
# 查找任意位置
print(pattern)
print(re.search(pattern, text))
输出结果:
注意事项
Python 正则表达式知识基本讲解完毕,最后稍微给大家提一提需要注意的点。
1.字节串 与 字符串
模式和被搜索的字符串既可以是 Unicode 字符串 (str) ,也可以是8位字节串 (bytes)。 但是,Unicode 字符串与8位字节串不能混用!
2.r 的作用
正则表达式使用反斜杠(’’)来表示特殊形式,或者把特殊字符转义成普通字符。
而反斜杠在普通的 Python 字符串里也有相同的作用,所以就产生了冲突。
解决办法是对于正则表达式样式使用 Python 的原始字符串表示法;在带有 ‘r’ 前缀的字符串字面值中,反斜杠不必做任何特殊处理。
3.正则查找函数 返回匹配对象
查找一个匹配项(search、match、fullmatch)的函数返回值都是一个 匹配对象Match ,需要通过match.group() 获取匹配值,这个很容易忘记。 另外还需要注意:match.group() 与match.groups() 函数的差别!
-
group() 获取到的是匹配到的整体内容
-
groups() 获取到分组后的内容,以元组形式输出 示例:
4.重复使用某个正则
如果要重复使用某个正则表达式,推荐先使用 re.compile(pattern)函数 返回一个正则对象,然后复用这个正则对象,这样会更快!
Numpy模块(矩阵)
几种 numpy 的属性
- ndim:维度
- shape:行数和列数
- size:元素个数
使用 numpy 首先要导入模块
import numpy as np #为了方便使用numpy 采用np简写
列表转化为矩阵:
array = np.array([[1,2,3],[2,3,4]]) #列表转化为矩阵
print(array)
输出结果:
import numpy as np
array = np.array([[1,2,3],[2,3,4]]) #列表转化为矩阵
print('number of dim:',array.ndim) # 维度
print('shape :',array.shape) # 行数和列数
print('size:',array.size) # 元素个数
输出结果:
Numpy 的创建 array
关键字
-
array:创建数组
-
dtype:指定数据类型
-
zeros:创建数据全为0
-
ones:创建数据全为1
-
empty:创建数据接近0
-
arrange:按指定范围创建数据
-
linspace:创建线段
import numpy as np
a = np.array([2, 23, 4]) # 创建一维数组
print('创建一维数组:')
print(a)
a = np.array([[2, 23, 4], [2, 32, 4]]) # 创建2d 矩阵 2行3列
print('创建2d 矩阵 2行3列:')
print(a)
a = np.zeros((3, 4)) # 创建全0数组,数据全为0,3行4列
print('全0数组,数据全为0,3行4列:')
print(a)
a = np.ones((3, 4)) # 创建全1数组,数据全为0,3行4列
print('创建全1数组,数据全为0,3行4列')
print(a)
a = np.empty((2, 4))
print('全空数组:')
print(a) # 创建全空数组, 其实每个值都是接近于零的数
a = np.arange(10, 20, 2) # 用 arange 创建连续数组,步长为2,区间10-20
print('用 arange 创建连续数组:')
print(a)
a = np.arange(12).reshape((3, 4)) # 使用 reshape 改变数据的形状,3行4列,
print('使用 reshape 改变数据的形状:')
print(a)
a = np.linspace(1, 10, 20) # 用 linspace 创建线段型数据,开始端1,结束端10,且分割成20个数据,生成线段
print('用 linspace 创建线段型数据')
print(a)
输出结果:
Numpy 的基础运算
加减乘
import numpy as np
a = np.array([10, 20, 30, 40]) # array([10, 20, 30, 40])
b = np.arange(4) # array([0, 1, 2, 3])
c=a+b #加
d=a-b #减
e=a*b #乘
print(c,d,e)
输出结果:
标准乘
import numpy as np
a=np.array([[1,1],[0,1]])
b=np.arange(4).reshape((2,2))
c_dot1 = np.dot(a,b)
c_dot2 =a.dot(b)
print(c_dot1,'\n',c_dot2)
输出结果:
max min sum sin
import numpy as np
a = np.random.random((2, 4))
print(a)
print(np.sum(a)) # 总和
print(np.min(a)) # 最小值
print(np.max(a)) # 最大值
print(np.sin(a) * 10) # sin
输出结果:
常用方法
其中的 argmin() 和 argmax() 两个函数分别对应着求矩阵中最小元素和最大元素的索引。
mean(),average()对应求矩阵所有元素的均值 median()对应求中位数
另外,Numpy 中具有 cumsum() 函数,生成的每一项矩阵元素均是从原矩阵首项累加到对应项的元素之和
A.T转置
import numpy as np
A = np.arange(20).reshape((4,5))
print(A)
print(np.mean(A))
print(np.average(A))
b=[3,4,51,3,4]
print(np.cumsum(b))
输出结果:
索引
一维索引
A[3]
二维索引
A[1,3:5]
分割
import numpy as np
A = np.arange(20).reshape((4,5))
print(np.split(A, 5, axis=1)) #纵向分割
print(np.split(A, 2, axis=0)) #横向分割
输出结果:
注:必须为等量分割,否则会报错
不等量分割
print(np.array_split(A, 3, axis=1))
输出结果:
A = np.array([[1, 2, 3, 4], [11, 22, 33, 44], [12, 13, 14, 15]])
for i in A.flat:
print(i)
#一个一个输出所有元素