day04

异常

错误类型

语法错误(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,他们的区别分别是:

  1. search: 查找任意位置的匹配项

  2. match: 必须从字符串开头匹配

  3. 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)
#一个一个输出所有元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值