1.结构模型匹配
# 语法:
match data:
case {} :
pass
case () :
pass
case [] :
pass
case _ :
pass
# 示例代码
data=eval(input("请输入要匹配的数据:"))
match data:
case {'name':'ynn','age':19}:
print("字典")
case (10,20,30):
print("元组")
case [20,444,55]:
print("列表")
case _ :
print("未知")
2.字典合并运算
merge_d = d1 | d2
d1={'a':1,'b':2,'c':3}
d2={'name':'张三','age':12}
merge_d=d1|d2
print(merge_d) # {'a': 1, 'b': 2, 'c': 3, 'name': '张三', 'age': 12}
3.同步迭代
# 语法
match data1,data2
case data1,data2:
pass
# 示例代码:
fruits = ['apple', 'banana', 'orange', 'strawberry']
counts=[10,20,88,66]
for f,c in zip(fruits,counts):
match f,c:
case 'apple',10:
print("10个苹果")
case 'banana',20:
print("20个香蕉")
case 'orange',88:
print("88个香蕉")
case 'strawberry', 66:
print("66个草莓")
4.字符串
- 字符串:字符串是Python中的不可变数据类型
- 字符串的常用操作:
| 方法名 | 描述说明 |
| str.lower() | 将str字符串全部转成小写字母,结果为一个新的字符串 |
| str.upper() | 将str字符串全部转成大写字母,结果为一个新的字符串 |
| str.split(sep=None) | 把str按照指定的分隔符sep进行分隔,结果为列表类型 |
| str.count(sub) | 结果为sub这个字符串在str中出现的次数 |
| str.find(sub) | 查询sub这个字符串在str中是否存在,如果不存在结果为-1,如果存在结果为sub首次出现的索引 |
| str.index(sub) | 功能与find()相同,区别在于要查询的子串sub不存在时,程序报错 |
| str.startswith(s) | 查询字符串str是否以子串s开头 |
| str.endswith(s) | 查询字符串str是否以子串s结尾 |
| str.replace(old,news) | 使用news替换字符串s中所有的old字符串,结果是一个新的字符串(第三个参数是替换次数,默认全部替换) |
| str.center(width,fillchar) | 字符串str在指定的宽度范围内居中,可以使用filchar进行填充 |
| str.join(iter) | 在iter中的每个元素的后面都增加一个新的字符串str |
| str.strip(chars) | 从字符串中去掉左侧和右侧chars中列出的字符串 |
| str.lstrip(chars) | 从字符串中去掉左侧chars中列出的字符串 |
| str.rstrip(chars) | 从字符串中去掉右侧chars中列出的字符串 |
- 格式化字符串:
方式一 : 占位符 : %s:字符串格式 %d :十进制整数格式 %f:浮点数格式
方式二 : f-string
方式三 : str.format()方法
# 占位符:
name="马冬梅"
age=30
score=97.88
str1="姓名:%s,年龄:%d,分数:%.2f" % (name,age,score)
print(str1) # 姓名:马冬梅,年龄:30,分数:97.88
# f-string:
str2=f"姓名:{name},年龄:{age},分数:{score}"
print(str2) # 姓名:马冬梅,年龄:30,分数:97.88
# format方法:
str3="姓名:{0},年龄:{1},分数:{2}".format(name,age,score)
print(str3) # 姓名:马冬梅,年龄:30,分数:97.88
- 格式化字符串的详细格式:
| : | 填充 | 对齐方式 | 宽度 | , | .精度 | 类型 |
| 引导符号 | 用于填充单个字符 | <左对齐 >右对齐 ^居中对齐 |
字符串的 输出宽度 |
数字的干位分隔符 | 浮点数小数部分的精度或字符串的最大输出长度 | 整数类型:b\d\o\x\X浮点数类型e\E\f\%(b:二进制;d:十进制;o:八进制;x/X:十六进制) |
str1="helloword"
print("{0:*<20}".format(str1)) # helloword*********** 宽度20/左对齐/填充*
num=189765478.987
print("{0:,.1f}".format(num)) # 189,765,479.0 千分,隔开/保留两位小数
num2=34
print('二进制:{0:b},十进制:{0:d},八进制:{0:o},十六进制:{0:x}'.format(num2)) # 二进制:100010,十进制:34,八进制:42,十六进制:22
- 字符串的编码和解码:
编码 : 将str类型转换成bytes类型,需要使用到字符串的encode()方法
str.encode(encoding= 'utf-8' , errors='strict/ignore/replace')
解码 : 将bytes类型转换成str类型,需要使用到bytes类型的decode()方法
bytes.decode(encoding= 'utf-8’ , errors='strict/ignore/replace')
str1="你好呀"
str2=str1.encode(encoding='utf-8')
print(str2) # b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x91\x80'
str3=str2.decode(encoding='utf-8')
print(str3) # 你好呀
- 字符串验证:
| 方法名 | 描述说明 |
| str.isdigit() | 所有字符都是数字(阿拉伯数字) |
| str. isnumeric() | 所有字符都是数字 |
| str. isalpha() | 所有字符都是字母(包含中文字符) |
| str.isalnum() | 所有字符都是数字或字母(包含中文字符) |
| str.islower() | 所有字符都是小写 |
| strisupper() | 所有字符都是大写 |
| str.istitle() | 所有字符都是首字母大写 |
| str.isspace() | 所有字符都是空白字符(\n、\t等) |
- 字符串拼接
方式一 : 使用"+"拼接
方式二 : 使用str.join()方法进行拼接字符串
方式三 : 直接拼接
方式四 : 使用格式化字符串进行拼接
# 使用"+"拼接
str1="hello"
str2="world"
print(str1+str2) # helloworld
# 使用str.join()方法进行拼接字符串
str3="".join([str1,str2])
print(str3) # helloworld
# 直接拼接
str4="hello""world"
print(str4) # helloworld
# 使用格式化字符串进行拼接
name="马冬梅"
age=30
score=97.88
str5="姓名:%s,年龄:%d,分数:%.2f" % (name,age,score)
print(str5) # 姓名:马冬梅,年龄:30,分数:97.88
5.正则表达式
- 元字符:具有特殊意义的专用字符,例如“^”和“$”分别表示匹配的开始和结束
| 元字符 | 描述说明 | 举例 | 结果 |
| . | 匹配任意字符(除\n) | 'p\nytholtn' | p、y、t、h、o、\t、n |
| \w | 匹配字母、数字、下划线 | 'python\n123' | p、y、t、h、o、n、1、2、3 |
| \W | 匹配非字母、数字、下划线 | 'python\n123' | \n |
| \s | 匹配任意空白字符 | 'python\t123' | \t |
| \S | 匹配任意非空白字符 | 'pythonit123' | p、y、t、h、o、n、1、2、3 |
| \d | 匹配任意十进制数 | 'python\t123' | 1、2、3 |
- 限定符:用于限定匹配的次数
| 限定符 | 描述说明 | 举例 | 结果 |
| ? | 匹配前面的字符0次或1次 | colok?r | 可以匹配color或colour |
| + | 匹配前面的字符1次或多次 | colou+r | 可以匹配colour或colouu...r |
| * | 匹配前面的字符0次或多次 | colou*r | 可以匹配color或colouu....r |
| {n} | 匹配前面的字符n次 | colou{2}r | 可以匹配colouur |
| {n,} | 匹配前面的字符最少n次 | colou{2,}r | 可以匹配colouur或colouuu...r |
| {n,m} | 匹配前面的字符最小n次,最多m次 | colou{2,4}r | 可以匹配colouur或colouuur或 colouuuur |
- 其他字符:
| 其他字符 | 描述说明 | 举例 | 结果 |
| 区间字符[ ] | 匹配[ ]中所指定的字符 |
[.?!]
|
- re模块 : Python中的内置模块,用于实现Python中的正则表达式操作
| 函数 | 功能描述 |
| re.match(pattern,string,flags=0) | 用于从字符串的开始位置进行匹配,如果起始位置匹配成功,结果为Match对象,否则结果为None. |
| re.search(pattern,string,flags=0) | 用于在整个字符串中搜索第一个匹配的值,如果匹配成功,结果为Match对象,否则结果为None。 |
| re.findall(pattern,string,flags=0) | 用于在整个字符串搜索所有符合正则表达式的值,结果是一个列表类型。 |
| re.sub (pattern,repl,string,count,flags=0) | 用于实现对字符串中指定子串的替换 |
| re.split(pattern,string,maxsplit,flags=0) | 字符串中的split()方法功能相同,都是分隔字符串 |
import re
pattern="\d\.\d+"
s1="I study Python 3.11 every day"
s2="3.11Python I study every day"
match1=re.match(pattern,s1,re.I) # 匹配不到
match2=re.search(pattern,s2,re.I)
print(match1,match2) # None <re.Match object; span=(0, 4), match='3.11'>
print("匹配的起始位置",match2.start()) # 匹配的起始位置 0
print("匹配的结束位置",match2.end()) # 匹配的结束位置 4
print("匹配元素的区间位置",match2.span()) # 匹配元素的区间位置 (0, 4)
print("待匹配的字符串",match2.string) # 待匹配的字符串 3.11Python I study every day
print("匹配的数据",match2.group()) # 匹配的数据 3.11
6.Python中的异常处理
- 语法结构:
try:
可能会抛出异常的代码
except 异常类型A:
异常处理代码(报错后执行的代码)
except 异常类型B:
异常处理代码(报错后执行的代码)
else:
没有抛异常要执行的代码
finally:
无论是否产生异常都要执行的代码
- 示例代码:
try:
num1=int(input("请输入数字:"))
num2=int(input("请输入数字:"))
result=num1/num2
except ZeroDivisionError:
print("除数不能为0")
except ValueError:
print("不能将字符串转为数字")
except BaseException:
print("未知错误")
else:
print("结果:",result)
finally:
print("程序执行结束")
7.raise关键字
作用:抛出一个异常,从而提醒程序出现了异常情况,程序能够正确地处理这些异常情况
语法结构:raise [Exception类型(异常描述信息)]
try:
gender=input("请输入性别:")
if gender!="男" and gender!="女":
raise Exception("性别只能是男或者女")
else :
print(f"性别是{gender}")
except Exception as e:
print(e)
8.Python中常见的异常类型:
| 异常类型 | 描述说明 |
| ZeroDivisionError | 当除数为0时,引发的异常 |
| IndexError | 索引超出范围所引发的异常 |
| KeyError | 字典取值时key不存在的异常 |
| NameError | 使用一个没有声明的变量时引发的异常 |
| SyntaxError | Python中的语法错误 |
| ValueError | 传入的值错误 |
| AttributeError | 属性或方法不存的异常 |
| TypeError | 类型不合适引发的异常 |
| IndentationError | 不正确的缩进引发的异常 |
9.函数:
-
函数:函数是将一段实现功能的完整代码,使用函数名称进行封装通过函数名称进行调用。以此达到一次编写,多次调用的目的。
-
语法结构: def 函数名称(参数列表):
函数体
[return返回值列表]
def get_sum(num):
s=0
for i in range(1,num+1):
s+=i
print(f"1-{num}之间的和是:{s}")
get_sum(10)
get_sum(100)
get_sum(1000)
- 函数的参数传递:
位置传参:是指调用时的参数个数和顺序必须与定义的参数个数和顺序相同。
关键字参数:是在函数调用时,使用“形参名称=值”的方式进行传参,传递参数顺序可以与定义时参数的顺序不同。
默认值参数:是在函数定义时,直接对形式参数进行赋值在调用时如果该参数不传值,将使用默认值如果该参数传值,则使用传递的值。
可变参数:又分为个数可变的位置参数和个数可变的关键字参数两种,其中个数可变的位置参数是在参数前加一颗星(*para),para形式参数的名称,函数调用时可接收任意个数的实际参数,并放到个元组中。个数可变的关键字参数是在参数前加两颗星(**para)在函数调用时可接收任意多个“参数=值”形式的参数,并放到一个字典中。
def happy_birthday(name,age):
print(f"祝{name}生日快乐")
print(str(age)+"岁生日快乐")
# 位置传参
happy_birthday("张三",19)
# 关键字传参
happy_birthday(name="李四",age=29)
# 默认值参数
def happy_birthday(name="张三",age=19):
print(f"祝{name}生日快乐")
print(str(age)+"岁生日快乐")
happy_birthday()
# 个数可变的位置参数
def fun(*params):
for item in params:
print(item)
fun(1,2,3) # 1 2 3
fun([11,22,11]) # [11, 22, 11]
fun(*[11,22,33]) # 11 22 33 系列解包操作
# 个数可变的关键字参数
def fun2(**kwparams):
for index,value in kwparams.items():
print(index,value)
fun2(name="张三",age=12)
fun2(**{'name':"李四",'age':15}) # 系列解包操作
10.变量的作用域
- 定义:是指变量起作用的范围,根据范围作用的大小可分为局部变量和全局变量
- 分类:
局部变量 : 定义:在函数定义处的参数和函数内部定义的变量
作用范围:仅在函数内部,函数执行结束,局部变量的生命周期也结束
全局变量 : 定义:在函数外定义的变量或函数内部使用global关键字修饰的变量
作用范围:整个程序,程序运行结束全局变量的生命周期才结束
11.匿名函数lambda
- 定义:是指没有名字的函数,这种函数只能使用一次,一般是在函数的函数体只有一句代码且只有一个返回值时,可以使用匿名函数来简化
- 语法:result=lambda 参数列表:表达式
s=lambda a,b:a+b
print(s(10,20)) # 30
12.常用的内置函数
- 类型转换函数:
| 函数名称 | 描述说明 |
| bool(obj) | 获取指定对象obj的布尔值 |
| str(obj) | 将指定对象obj转成字符串类型 |
| int(x) | 将x转成int类型 |
| float(x) | 将x转成float类型 |
| list(sequence) | 将序列转成列表类型 |
| tuple(sequence) | 将序列转成元组类型 |
| set(sequence) | 将序列转成集合类型 |
- 数学函数:
| 函数名称 | 描述说明 |
| abs(x) | 获取x的绝对值 |
| divmod(x,y) | 获取x与y的商和余数 |
| max(sequence) | 获取sequence的最大值 |
| min(sequence) | 获取sequence的最小值 |
| sum(iter) | 对可迭代对象进行求和运算 |
| pow(x,y) | 获取x的y次幂 |
| round(x,d) | 对x进行保留d位小数,结果四舍五入 |
- 迭代器操作函数:
| 函数名称 | 描述说明 |
| sorted(iter) | 对可迭代对象进行排序 |
| reversed(sequence) | 反转序列生成新的迭代器对象 |
| zip(iter1,iter2) | 将iter1与iter2打包成元组并返回一个可迭代的zip对象 |
| enumerate(iter) | 根据iter对象创建一个enumerate对象 |
| all(iter) | 判断可迭代对象iter中所有元素的布尔值是否都为True |
| any(iter) | 判断可迭代对象iter中所有元素的布尔值是否都为False |
| next(iter) | 获取迭代器的下一个元素 |
| filter(function,iter) | 通过指定条件过滤序列并返回一个迭代器对象 |
| map(function,iter) | 通过函数function对可迭代对象iter的操作返回一个迭代器对象 |
- 其它函数:
| 函数名称 | 描述说明 |
| format(value,format spec) | 将value以format spec格式进行显示 |
| len(s) | 获取s的长度或s元素的个数 |
| id(obj) | 获取对象的内存地址 |
| type(x) | 获取x的数据类型 |
| eval(s) | 执s这个字符串所表示的Python代码 |