python基础day03

63 阅读13分钟

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
  • 其他字符:
其他字符 描述说明 举例 结果
区间字符[ ] 匹配[ ]中所指定的字符

[.?!]

		<p>[0-9]</p>
		</td>
		<td>匹配标点符号点、问号,感叹号<br />
		匹配01234567、<br />
		89</td>
	</tr>
	<tr>
		<td>排除字符^</td>
		<td>匹配不在[ ]中指定的字符</td>
		<td>[^0-9]</td>
		<td>匹配除0123456789的字符</td>
	</tr>
	<tr>
		<td>选择字符 |</td>
		<td>用于匹配|左右的任意字符</td>
		<td>\d{18}\d{15}</td>
		<td>匹配15位身份证或18位身份证</td>
	</tr>
	<tr>
		<td>转义字符</td>
		<td>同python中的转义字符</td>
		<td>\.</td>
		<td>将.作为普通字符使用</td>
	</tr>
	<tr>
		<td>[\u4e00-\u9fa5]</td>
		<td>匹配任意一个汉字</td>
		<td></td>
		<td></td>
	</tr>
	<tr>
		<td>分组()</td>
		<td>改变限定符的作用</td>
		<td>six | fourth<br />
		(six l four)th</td>
		<td>
		<p>匹配six或fourth</p>

		<p>匹配sixth或fourth</p>
		</td>
	</tr>
</tbody>
  • 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代码