Python学习

444 阅读30分钟

第一个python程序:

新建目录—>新建python文件

😸了解IPO编程方法

image.png

print基本的输出函数

语法结构:

print(内容)

print()函数完整的语法格式:

print(value,...,sep='',end='\n',file=None)

sep叫分隔符


- 1.输出字符串

print('北京欢迎你!')#支持单引号,双引号,三引号
print("北京欢迎你!")
print('''北京欢迎你!''')
print("""北京欢迎你!""")

- 2.不换行输出直接加逗号即可

print(a,b,"可乐加汉堡")

- 3.python还可以通过ASCII码值去显示字符串,用到的是python中的内置函数chr()

image.png

它会将98转成所对应的字符(通过chr函数)

chr()括号里是ASCII值

- 4.使用print输出中文Unicode码(内置函数是ord)

(中文编码的范围是u4e00~u9fa5)

image.png

- 5.使用print函数将内容输出到文件(需要使用内置函数open)


fp=open('note.txt','w')#w,write 打开文件
print("北京欢迎你",file=fp)#把这段文字放到文件里
fp.close()#关闭文件
#程序目的:将"北京欢迎你"写入(输出)文件note.txt中
image.png

- 6.多条print函数输出,结果一行输出

这个操作的原因是因为print函数的完整语法结构中包含换行符

image.png

第一个print的结束由-->替换,而第二个print未作处理,所以下面默认还是有换行符的

- 7.使用连接符来连接两个字符串(就是加号+)

print('北京'+'欢迎你')
#必须是加号两者中间才没有空格,逗号的话默认是空格
#连接只能是字符串和字符串相连

文件 image.png

input基本的输入函数

语法结构:

x=input('提示文字')

无论你输入的数据是什么,x的数据类型都是字符串类型

  • 所以如果想输入整数类型的话,就需要用内置函数int,将字符串类型转为整数类型
image.png

解决方法就是把+加号,改成逗号,意思是在同一行输出

num=input('请输入你的幸运数字:')
print('我的幸运数字是:'+num)#这里的num正常输入,是字符串类型
num=int(num)
print('你的幸运数字是',num)

😸Python中的注释

#中文文档声明(必须写在第一行)
# coding=utf-8
#单行注释
'''
三引号为多行注释
蒽
'''
"""
三个双引号也可以,颜色不同但效果一样
"""

😸数据类型

保留字

image.png
import keyword
print(keyword.kwlist)#关键字严格区分大小写
print(len(keyword.kwlist))#计算个数

标识符

image.png image.png

————————

image.png

变量与常量

  1. 如果想修改变量的数据类型和值,直接赋值不同类型即可,因为python动态修改变量的数据类型
  2. 如果想检查是什么数据类型,只需print里写type(变量名)
  3. python中支持,多个变量指向同一个值,例如no=num=100,两个等式
  4. 查看对象的内存地址用内置函数id,例如print(id(no))

数值类型

整数类型

image.png

浮点数类型

image.png
  • round(0.1+0.2,1),可以保留一位小数(逗号后写几,就保留几位)

字符串类型

image.png
  • 在转义字符之前加上大写或小写的r,转义字符会失效
  • 利用索引切片(中间是冒号,包前不包后,用中括号)
image.png
x='2022年'
y='北京冬奥会'
print(x+y)
print(x*10)
print(10*x)

print('北京'in y)
print('扬州'in y)

结果是

2022年北京冬奥会
2022年2022年2022年2022年2022年2022年2022年2022年2022年2022年
2022年2022年2022年2022年2022年2022年2022年2022年2022年2022年
True
False

布尔类型

数据类型之间的转换

类型转换包括隐式转换和显式转换

下列是显式转换

函数描述说明
int(x)将x转换为整数类型
float(x)将x转换为浮点类型
str(x)将x转成字符串
chr(x)将整数x转换为一个字符
ord(x)将一个字符x转换为其对应的整数值
hex(x)将一个整数x转换为一个十六进制的字符串
oct(x)将一个整数x转换为一个八进制字符串
bin(x)将一个整数x转换为一个二进制字符串

eval函数(Python内置函数)

  • 用于去掉字符串最外侧的引号,并按照python语句方式去掉引号后的字符串
  • 经常和input()函数一起使用
  • 也是一种类型转换函数

语法格式: 变量=eval(字符串)

应用

s='3.14+3'
print(s,type(s))
x=eval(s)#使用eval函数去掉s这个字符串中左右的引号
#去掉引号也就是说执行了加法运算
print(x,type(x))

结果是

3.14+3 <class 'str'>
6.140000000000001 <class 'float'>
  • 常与input()连用,用于获取用户输入的数值
age=eval(input('请输入您的年龄'))#将字符串类型转成了int类型
#相当于int(age)
print(age,type(age))

结果是:

请输入您的年龄18
18 <class 'int'>

字符串也可以用eval

hello='邯郸欢迎你'
print(hello)
print(eval('hello'))
#两个print结果一样
#但是下面这种写法不可以
#因为用了eval后去了引号就变成了变量,而你程序中并没有这个变量
print(eval(邯郸欢迎你))

😸运算符(算术、赋值、比较、逻辑)

算术运算符

print('加法',1+1)
print('减法',1-1)
print('乘法',2*3)
print('除法',10/2)
print('整除',10//3)
print('取余',10%3)
print('幂运算',2**4)#2的四次方
#直接会算出来

优先级:

  1. 第一级:**
  2. 第二级:*、/、%、//
  3. 第三级:+、-

赋值运算符

Python支持链式赋值

a=b=c=100

Python还支持系列解包赋值

a,b=10 20

系列解包赋值还可以交换两数值

a,b=b,a

逻辑运算符

and 逻辑与 从左到右

or 逻辑或 从左到右

not 逻辑非 从右到左

位运算符(转二进制)

把数字看作二进制数来进行计算的

分为 按位与按位或按位异或按位取反

按位与&

使二进制一一对齐后,只有两位都是1结果才是1 ​

按位或|

只要有一个是1,那就是1 ​

按位异或^

两个位置上的数相同,就是0

有一个是1,那就是1 ​

按位取反~(只有一个操作数)

1、0变换 ​

print('按位与运算',12&8) #结果是8
print('按位或运算',4|8) #结果是12
print('按位异或',31^32) #结果是63
print('位取返',~123) #结果是-124

左移位<<

就是将一个二进制数向左移动指定的位数,左边(高位端)溢出的位被舍弃。右边(低位端)的空位用0补充 ​

右移位>>

是将一个二进制数向右移动指定的位数,右边溢出的位被舍弃,左边的空位端

  • 如果最高位是0(正数)则左侧空位补0;
  • 如果最高位是1(负数),左侧空位补1
print('左移位:',2<<2)#8   2*2*2
print('左移位:',2<<3)#16  2* 2*2*2
print('右移位',8>>2) #2    8/2/2
print('右移位',-8>>2)#-2  -8/2/2

总结就是左乘右除

运算符的优先级

**幂运算
~、+、-取反、正负号
乘、/、%、//算术运算符
+、-
<<、>>位运算符
&
尖角号^
I
<、<=、>、>=、!=、==比较运算符
=赋值运算符

🫠程序的流程控制

1.程序的描述方式(三种)

  1. 自然语言(用人类语言 直接描述)
  2. 流程图 ​
  3. 伪代码(介于自然语言和编程语言之间的一种算法描述语言) ​

2.程序的组织结构:顺序、选择(分支)、循环

选择(分支)结构

1. 单分支结构

if 表达式:
    语句块
  • (表达式后面是冒号)
  • Tip:使用if语句时,如果语句块中只有一句代码,可以将语句块直接写在冒号后

2. 双分支结构

number=eval(input('请输入您的号码'))
if number==12345:
    print('恭喜您中奖')
else:
    print('很遗憾')

但是这里可以再简化一下

意思是:把这句话直接赋值给result

又或者:直接print打印

number=eval(input('请输入您的号码'))
result='恭喜中奖'if number==12345 else'很遗憾'
print(result)
print('恭喜中奖'if number==12345 else'很遗憾')

3. 多分支结构

if...elif...else

当表达式结果都为false时,会执行else语句,所以else语句并不是必须的

4. match...case

python中代替switch的是模式匹配 match...case

score=input('请输入你的成绩')
match score:
   case 'A':
       print('优秀')
   case 'B':
       print('良好')
   case 'C':
       print('合格')

循环结构

在Python中循环结构分两类

  • 1.遍历循环结构for,for 循环变量 in 遍历对象:
  • 还有一个是for...else
  • 它这里面的else只有在for循环正常进行完之后才会执行。但是如果for没有正常执行完比如遇到break,那么就不会执行else语句

range()函数,产生一个(n,m)的整数序列,包前不包后

  • 2.无限循环结构while

四个步骤:

  • 初始化变量、条件判断、语句块、改变变量
  • 同时也有while...else结构
s=0
i=1 # 1.初始化变量
while i<=100:# 2.条件判断
    s+=i # 3.语句块
    i+=1 # 4.改变变量
else:
    print('累加和为:',s)

案例

1. 使用while循环模拟用户登录,且只有三次机会

i=0
while i<3:#执行三次0、1、2
    user_name=input('请输入你的用户名:')
    pwd=input('请输入你的密码')
    if user_name=='phy' and pwd=='11111':
        print('系统正在登录中...')
        i=8 # 用户名正确时的改变变量
    else:
        if i<2:
            print('输入错误,您还有',2-i,'次机会')
        i+=1 # 用户名不正确的时候的改变变量
if i==3:
    print('三次都错误')

2. 嵌套循环打印星号图形

# 长方形
for i in range(1,4):
    for j in range(1,5):
        print('*',end='')
    print()
————————————————————————————
# 三角
for i in range(1,6):
    for j in range(1,i+1):
        print('*',end='')
    print()
————————————————————————————
#倒三角
for i in range(1,6):
    for j in range(1,7-i):
        print('*',end='')
    print()
————————————————————————————
#等腰三角形
for i in range(1,6):
    for j in range(1,6-i):
         print(' ',end='')
    for k in range(1,i*2):
        print('*',end='')
    print()
————————————————————————————
#菱形(只有奇数行才能打印出菱形)
row=eval(input('请输入菱形的行数'))
if row%2==0:
    print('重新输入')
    row=eval(input('请输入菱形的行数'))#现在假设为7
#------上半部分
top_row=(row+1)//2 #(7+1)/2
for i in range(1,top_row+1):
    for j in range(1,top_row+1-i):
         print(' ',end='')
    for k in range(1,i*2):
        print('*',end='')
    print()
#------下半部分
bottom_row=row//2
for i in range(1,bottom_row+1):
    for j in range(1,i+1):
        print(' ',end='')
    for k in range(1,2*bottom_row-2*i+2):
        print('*',end='')
    print()
————————————————————————————
#空心菱形(只需加一个判断:只有在第一个和最后一个时才打印星号,不然就打印空格)
row=eval(input('请输入菱形的行数'))
if row%2==0:
    print('重新输入')
    row=eval(input('请输入菱形的行数'))#现在假设为7
#------上半部分
top_row=(row+1)//2 #(7+1)/2
for i in range(1,top_row+1):
    for j in range(1,top_row+1-i):
         print(' ',end='')
    for k in range(1,i*2):
        if k==1 or k==i*2-1:
          print('*',end='')
        else:
            print(' ',end='')#空格而不是空字符串
    print()
#------下半部分
bottom_row=row//2
for i in range(1,bottom_row+1):
    for j in range(1,i+1):
        print(' ',end='')
    for k in range(1,2*bottom_row-2*i+2):
        if k==1 or k==2*bottom_row-2*i+2-1:
           print('*',end='')
        else:
            print(' ',end='')
    print()

3.程序的跳转语句:break或者continue

  • break 用于跳出(退出)循环,通常与if一起搭配
s=0
i=1
while i<11:
    s+=i
    if s>20:
        print('累加和大于20的数是:',i)
        break
    i+=1
  1. 用break来代替上用户名案例中通过改变变量的方式
i=0
while i<3:#执行三次0、1、2
    user_name=input('请输入你的用户名:')
    pwd=input('请输入你的密码')
    if user_name=='phy' and pwd=='11111':
        print('系统正在登录中...')
        break
    else:
        if i<2:
            print('输入错误,您还有',2-i,'次机会')
        i+=1 # 用户名不正确的时候的改变变量
else:
    print('三次都错误')
  • continue 用于跳过本次循环的后续代码,而继续执行下一次循环的操作
s=0
i=1
while i<=100:
    if i%2==1:
        i+=1
        continue
    s+=i
    i+=1
print('1-100之间的偶数和为:',s)

4.空语句 pass

python的保留字,在语法结构中只起到占位符的作用,使语法结构完善,不报错

猜数例子

产生随机数的random内置函数

#产生随机数
import random
rand=random.randint(1,100)#包含1也包含100
#产生随机数
import random
rand=random.randint(1,100)#包含1也包含100
#——————————————循环步骤```````
count=1 #记录猜数次数,循环初始化
while count<=10:
    number=eval(input('有一个数,在1~100,请你猜一猜:'))
    if number==rand:
        print('猜对了')
        break
    elif number>rand:
        print('大了')
    elif number<rand:
        print('小了')
    count+=1
if count<=3:
    print('恭喜,你一共猜了',count,'次')
elif count<=6:
    print('还可以,你一共猜了',count,'次')
else:
    print('继续努力,你一共猜了',count,'次')

🫠组合数据类型

  • 序列和索引
  1. 列表(有序序列)(可变数据类型)
  2. 元组(有序序列)(不可变)
  3. 字典(无序)(可变)
  4. 集合(无序)(可变)

序列:

一个用于存储多个值的连续空间,每个值都对应一个整数的编号,称为索引

操作1:切片

  • 省略开始位置的话,默认是从0开始
  • 步长不写默认是1、
  • 省略结束位置,默认是最后
  • 省略开头和结尾,只写步长,就是默认就是在全部里切,且步长为2

操作2:相加、相乘

tip:字符串属于序列的一种

s='hello'
s2='world'
print(s+s2)
print(s*5)
print('-'*40)

操作n 这里面min和max的判断是按照ASCII码值来计算的

1.列表:

是序列的一种,所以对序列的操作符、运算符、函数均可以使用 ​

列表的创建方式

用法:

enumerate函数,枚举

  • 可以的得到序号和元素
  • 可用于列表的遍历操作 ​

列表遍历操作的三种方式:

lst=['hello','world',111,222]
# 使用for循环
for item in lst:
    print(item)
# for循环+函数
for i in range(0,len(lst)):
    print(i,lst[i])
# 使用enumerate()函数
for index,item in enumerate(lst):
    print(index,item)
#index在这里表示序号,而不是索引,并且可以手动设置序号起始值
#start也可以省略,直接写1
for index, item in enumerate(lst,start=1):
    print(index, item)

列表的相关操作(增删改查)

列表的增删改查并不改变原列表的地址 ​ tip:如果需要查元素的地址,只需 id(元素名) 即可

列表排序的两种方法

排序是在原列表的基础上排序的,并不会产生新的列表

  1. 列表对象的sort方法 lst.sort(key=None,reverse=False)

其中key代表排序的规则,reverse代表排序方式(默认为升序)

  1. 内置函数sorted() sorted(iterable。key=None,reverse=False)

内置函数的方式不会改变原列表,因为会产生新的列表

其中iterable代表的是排序的对象

  • 字符串升降序比的是ASCII值
  • 当然也可以自己指定排序规则,比如:忽略大小写进行比较(str.lower就是都转成小写)
lst=[4,56,3,78,20,56,89]
print('原列表',lst)
#排序,默认是升序
lst.sort()
print('升序',lst)
#降序
lst.sort(reverse=True)
print('降序',lst)
#————————————————————————————
# 内置函数的方式
asc_lst=sorted(lst)
print('升序',asc_lst)
print('原列表',lst)# 原列表没有任何改变

列表的生成式

即(expression即你列表中每个元素形式)

一维列表、二维列表

#——————————————————一维列表
import random\
#
lst=[random.randint(1,100) for _ in range(10)]
print(lst)

#从列表中选择符合条件的元素组成新的列表
# 下面这个可以筛选出偶数
lst=[i for i in range(10) if i%2==0]
print(lst)
#——————————————————二维列表(表格数据)
lst=[
    ['汉堡','可乐','沙拉酱'],
    ['草莓','西瓜','哈密瓜'],
    ['茄子','包子','烤冷面']
]
print(lst)
for row in lst:
    for item in row:
        print(item,end='\t')
    print()

2.元组类型:

  • 不可变序列,没有增删改查的操作
  • 只能用索引获取元素或者用for遍历元素
  • 可以使用判断操作
  • 如果元组中只有一个数,逗号也不可省略,要写成比如t=(10,) ​

操作n

元组的遍历与访问

  • 元组的遍历与列表相同,用for循环
  • 根据索引访问元素
  • 元组也可以执行切片操作
t=(1,2,3)
#
for item in t:
    print(item)
#
for i in range(len(t)):#在len这里我们省略了起始start
    print(i,t[i])
# 使用enumerate
for index,item in enumerate(t):
    print(index,'--->',item)

元组的生成式

元组也有生成式,不过它的结果是一个生成器对象,它需要转成一个元组或者列表我们才可以看到内容

#生成式
t=(i for i in range(1,4))
print(t)
t=tuple(t)# 关键一步转元组,没有这一步得到的只是一个生成器对象
print(t)
#把生成式遍历
for item in t:
    print(item)

--next-- 方法 ​

元组和列表的区别

3.字典类型:

是根据一个信息查找另一个信息的方式构成了“键值对”,它表示索引用的键和对应的值构成的成对关系

  • 可变数据类型,具有增删改等的操作
  • 与列表不同的是,字典中的元素是无序的,所以你第一个添加到字典中的元素并不一定就是在第一位的
  • 并且字典中的键要求必须唯一,不能重复;但是值是可以重复的
  • 但是如果你写的时候键重复了,那么后面的会覆盖代替前面的
  • 要求字典中的键是不可变序列,所以哪些可以作为键呢?整型、字符型、浮点型、元组...都可以,

字典类型的创建方式

映射的结果是一个对象,你看不到实际内容

所以你如果想看到内容,你可以把它转成列表或者字典(一般都是字典)(并且只能选一个,不能都写)

lst1=[10,20,30,40]
lst2=['cat','dog','pet','zoo','car']
zipobj=zip(lst1,lst2)
print(zipobj) # 这时候打印是个对象,看不到内容
#转成列表
#print(list(zipobj))

#转成字典
d=dict(zipobj)
print(d)

第三种创建字典的方式(用参数)

d=dict(cat=10,dog=20)
print(d)

字典的取值(访问)和遍历

  • 在取值上两种方式也有区别,如果你访问的这个key不存在,那么d[key]会报错,但是d.get[key]不会报错,而是得到一个None

字典的相关操作方法

添加就是直接d.[]=''

字典的生成式

4.集合类型:

集合的创建方式

  • 如果你直接使用花括号创建s={},那么创建的就是字典而不是集合
  • 如果你想创建集合:s=set()用内置函数

集合类型的操作符

集合的相关操作方法

集合的遍历和生成式

#普通遍历
for item in s:
    print(item)
# enumerate
for index,item in enumerate(s)
    print(index,'-->',item)
#集合的生成式
s={i for i in range(1,10)}
print(s)
s={i for i in range(1,10) if i%2==1}
print(s)

几种数据类型区别

🫠Python 3.11新特性

  1. 结构模型匹配(match...case)
  2. 字典合并运算符 |
  3. 同步迭代 ​

最后这个case_相当于else,就是别的都不匹配那就走这个

# 同步迭代
fruits=['apple','orange','pear','grape']
counts=[10,3,4,5]
for f,c in zip(fruits,counts):
    match f,c:
        case 'apple',10:
            print('10个苹果')
        case 'orange',3:
            print('3个橘子')
        case 'pear',4:
            print('4个梨')
        case 'grape',5:
            print('5串葡萄')

结果是:

10个苹果
3个橘子
4个梨
5串葡萄

🤖易错

🤖实战

千年虫是什么虫

lst=[88,89,90,98,0,99]
print('原列表:',lst)
# 1.for

for index in range(len(lst)):
    if str(lst[index])!='0':
       lst[index]='19'+str(lst[index])
    else:
        lst[index] = '200' + str(lst[index])
print(lst)

# 2.enumerate
for index,value in enumerate(lst):
    if str(lst[index])!='0':
       lst[index]='19'+str(value)
    else:
        lst[index] = '200' + str(value)
print(lst)

模拟京东的购物流程

#首先创建一个空列表,用来存储入库的商品信息
 #1.入库
lst=[]
for i in range(5):
    goods=input('请输入商品的编号和名称进行商品入库:')
    lst.append(goods)
#2.展示商品(遍历)
for item in lst:
    print(item)
#3.创建一个空列表,用来存储购物车里面的商品
#当我输入q时结束,不然一直循环,所以选用无限循环while
cart=[]
while True:#意思就是一直去执行
    flag=False #代表没有商品的情况
    num=input('请输入你要购买的商品编号:')
    #4.遍历商品列表用来查询商品是否存在
    for item in lst:
        if num==item[0:4]:# 从商品中切出序号,进行比较
            flag=True #代表商品已找到
            cart.append(item)
            print('商品已成功添加入购物车')
            break #退出的是这个for循环
    if not flag and num!='q':#not flag也可以写成flag==False
        print('商品不存在')
    if num=='q':
        break #退出的是while
print('-'*56)
print('购物车里已选择的商品为:')
cart.reverse()
for item in cart:
    print(item)

模拟12306火车票订票流程

 #创建字典用于存储车票信息,使用车次作为key,使用其他信息作为value
dict_ticket={
     'G1111':['北京南-天津南','18:06','18:39','00:33'],
     'G2222':['北京南-天津南','18:15','18:49','00:34'],
     'G3333':['北京南-天津西','18:20','18:53','00:36'],
     'G4444':['北京南-天津东','18:40','19:30','00:54']
 }
print('车次     出发地-到达站     出发时间      到达时间     历时时长')
 #遍历字典中的元素
for key in dict_ticket.keys():
      print(key,end='\t')#为什么不换行,因为车次和车次的详情信息在一行显示
      for item in dict_ticket.get(key): #根据key获取值
          print(item,end='\t\t')
      print()
train_number=input('请输入要购买的车次:')
#根据key获取值
info=dict_ticket.get(train_number,'车次不存在')#info是一个列表类型
# 判断车次是否存在
if info!='车次不存在':
    person=input('请输入乘车人,如果是多位请用逗号分割:')
    s=info[0]+' '+info[1]+' '+'开'
    print('您已购买了'+train_number+' '+s+'请'+person+'尽快换取纸质车票,【铁路客服】')
else:
    print('对不起,车次不存在')

模拟手机通讯录

s=set()
i=1
for i in range(1,6):
#关键f
    info=input(f'请输入第{i}位好友的姓名和手机号码:')
    s.add(info)
for item in s:
    print(item)

🐥字符串

常用操作

  • replace第三个参数为替换次数,默认为全部替换
  • strip()括号里不写,默认就是左右全部空格都去掉,但是如果括号里写了字符串,那就是是只去掉指定字符串

格式化字符串的三种方法

# 使用占位符进行格式化
name='马里奥'
age=18
score=98.5
print('姓名:%s,年龄:%d,成绩:%.1f' %(name,age,score))
#f-string
print(f'姓名:{name},年龄:{age},成绩{score}')
#使用字符串format方法
print('姓名:{0},年龄:{1},成绩:{2}'.format(name,age,score))

format详解

s='helloworld'
print('{0:*<20}'.format(s))#字符串的显示宽度为20,左对齐,空白部分使用*填充
#千位分隔符(也就是三位一个逗号)
print('{0:,}'.format(987654321))
#精度
print('{0:.2f}'.format(3.1415926))
#最大显示长度(与上面精度相比,没有写f)
print('{0:.5}'.format('helloword'))
#整数类型
a=425
print('二进制:{0:b},十进制{0:d},八进制{0:o},十六进制{0:X}'.format(a))
#浮点数类型
b=3.1415926
print('{0:.2f},{0:.2E},{0:.2e},{0:.2%}'.format(b))
#3.14,3.14E+00,3.14e+00,314.16

字符串的编码与解码

  • str转成bytes,叫做编码
  • bytes类型转成str类型去显示,叫做解码
  • 默认是utf-8,中文占3个字节;gbk中文占2个字节

数据的验证

字符串的拼接(数据的处理)

  1. 使用str.join()方法进行拼接字符串
  2. 直接拼接
  3. 使用格式化字符串进行拼接
s1='hello'
s2='world'
# 1.使用加号+拼接
print(s1+s2)
# 2.使用字符串的join()方法
#指定空字符串进行拼接
print(''.join([s1,s2]))#把s1和s2放到列表,那么它就会对列表里的元素进行拼接
# 3.直接拼接
print('hello' 'world')
# 4.使用格式化字符串进行拼接
print('%s%s' % (s1,s2))
print(f'{s1}{s2}')
print('{0}{1}'.format(s1,s2))

字符串的去重操作

s='hellohelloworld'
#字符串
new_s=''
for item in s:
    if item not in new_s:
        new_s+=item
print(new_s)
#索引
new_s2=''
for i in range(len(s)):
    if s[i] not in new_s2:
        new_s2+=s[i]
print(new_s2)
#通过集合去重(无序)+列表排序
#用集合去重是因为,集合有要求,其中元素不能重复
new_s3=set(s)
lst=list(new_s)#转成列表类型
lst.sort(key=s.index)
print(''.join(lst))

🐥正则表达式(特殊的字符串)

字符

元字符 限定符 其他字符

re模块

内置模块,用来实现正则表达式

写之前先要导入reimport re match

import re
pattern='\d.\d+'
s='I study Python 3.12 everyday'
match=re.match(pattern,s,re.I)
print(match)#None
s2='3.12 I study Python everyday'
match2=re.match(pattern,s2)
print(match2)#<re.Match object; span=(0, 4), match='3.12'>

print('匹配的起始位置:',match2.start()) #0
print('匹配的结束位置:',match2.end())  #4
print('匹配区间的位置元素:',match2.span())#(0,4)
print('待匹配的字符串:',match2.string)#3.12 I study Python everyday
print('匹配的数据:',match2.group())#3.12

🤖实战

# 1. 要求根据车牌号,通过切片操作找到其归属地
lst=['京A1111','津B6666','冀C8888']
for i in lst:
    area=i[0:1]
    print(i,'归属于地',area)
# 2.忽略大小写,查找字符出现次数
word=input('请输入你要统计的字符:')
s='HelloPython,HelloJave,hellophy'
print('{0}在{1}一共出现了{2}次'.format(word,s,s.upper().count(word)))
# 3.格式化输出商品的名称和单价
lst=[
    ['01','电风扇','美的','500'],
    ['02', '洗衣机','海尔', '1000'],
    ['03','微波炉','老板','1500']
]
print('编号\t\t名称\t\t品牌\t\t单价')
for item in lst:
    for i in item:
        print(i,end='\t\t')
    print()
#格式化
for item in lst:
    item[0]='0000'+item[0]
    item[3]='${0:.2f}'.format(eval(item[3]))

print('编号\t\t\t名称\t\t品牌\t\t单价')
for item in lst:
    for i in item:
        print(i,end='\t\t')
    print()

🦥异常处理

语法结构

异常关键字:raise

抛出一个异常,从而提醒程序出现了异常情况,程序能够正确地处理这些异常情况 ​

try:
    gender=input('请输入你的性别:')
    if gender!='男' and gender!='女':
        raise Exception('性别只能是男或者女')
    else:
        print('你的性别是:',gender)
except Exception as e:
    print(e)

Python中常见的异常类型

PyCharm的程序调试

1.设置断点——>2.进入调试视图(三种方式)——>3.开始调试

🤖实战

#输入成绩,如果不正确手动抛出异常
# 手动抛出异常用raise
try:
    score=eval(input('请输入你的成绩:'))
    if 0<score<100:
        print('分数为:',score)
    else:
        raise Exception('分数不正确')
except Exception as e:
    print(e)
# 勾股判断三边是否构成三角形(不能的话抛出异常)
try:
    a=int(input('请输入第一条边长:'))
    b = int(input('请输入第二条边长:'))
    c = int(input('请输入第三条边长:'))
    if a+b>c and a+c>b and b+c>a:
        print(f'三边长为:{a},{b},{c}')
    else:
        raise Exception(f'{a},{b},{c},不可以构成三角形')
except Exception as e:
    print(e)

🐧函数及常用的内置函数

函数的定义及调用

自定义函数格式

def 函数名称(参数列表):
    函数体
    [return返回值列表,非必须]

传参方式:

  1. 位置对应传参
  2. 关键字传参
  • 在一个调用里,可以既使用位置传参又使用关键字传参

  • 但是要注意,如果这样写的话,必须位置参数在前,关键字参数或者默认值参数在后

比如:birthday(‘猪猪侠’,age=18)

  1. 默认值参数

是指在函数定义时,直接对形参进行赋值,在调用时如果该参数不传值,将使用默认值,如果该参数传值,则使用传递的值

  1. 可变参数 ​ 在调用时,前加星号会进行系列解包操作

匿名函数lambda

是指没有名字的函数,这种函数只能使用一次,一般是在函数的函数体只有一句代码且只有一个返回值时,可以使用匿名函数来简化

result=lambda 参数列表:表达式

#只有一句的函数
def calc(a,b):
    return a+b
print(calc(10,20))
#匿名函数
s=lambda a,b:a+b
print(type(s))
print(s(10,20))

还可以用于成绩排序:

student_scores=[
    {'name':'john','score':87},
    {'name':'irene','score':95},
    {'name':'lily','score':80},
    {'name':'winter','score':100}
]
student_scores.sort(key=lambda x:x.get('score'),reverse=True)
print(student_scores)

递归函数

  • 一个完整的递归由两部分组成:递归调用和递归终止条件
  • 一般可使用if--else结构来判断递归的调用和递归的终止

斐波那契数列

def fac(n):
    if n==1 or n==2:
        return 1
    else:
        return fac(n-1)+fac(n-2)
print(fac(9)) #34

常用的内置函数

数据类型转换函数

  • int('3.14')这种写法在转整型里是不合法的(在字符串中写浮点数)

常用的数学函数 常用的迭代器函数 常用的其他内置函数 format,数值默认右对齐,字符串默认左对齐

print(format(3.14,'20')) #数值默认右对齐
print(format('hello','20')) #字符串默认左对齐
print(format('hello','*<20'))#<左对齐,*表示填充符,20表示显示的宽度
print(format('hello','*^20'))

print(format(3.1415926,'.2f'))#保留两位小数

🤖实战

import random
def get_max(lst):
    max=lst[0]
    for i in range(1,len(lst)):
        if max<lst[i]:
            max=lst[i]
    return max
lst=[random.randint(1,100) for i in range(10)]#列表生成式
print(lst)
print(get_max(lst))

def get_digit(x):
    s=0
    lst=[]
    for item in x:
        if item.isdigit():
            lst.append(int(item))
    s=sum(lst)
    return lst,s
s=input('请输入一个字符串:')
lst,x=get_digit(s) #系列解包赋值
print('提取的数字列表为:',lst)
print('累加和为:',x)

def lower_upper(x):
    lst=[]
    for item in x:
        if 'A'<=item<='Z':
            lst.append(chr(ord(item)+32))#ord()将字母转为Unicode值,加上32,chr()整数转成字符
        elif 'a'<=item<='z':
            lst.append(chr(ord(item)-32))
        else:
            lst.append(item)
    return ''.join(lst)
s=input('请输入一个字符串:')
print(lower_upper(s))

def get_find(s,lst):
      for item in lst:
          if s==item:
              return True
      return False
lst=['hello','world','python']
s=input('请输入你要判断的字符串:')
result=get_find(s,lst)
print('存在' if result else '不存在') # if--else的简写,三目条件运算符

🐇面向对象程序设计

面向过程和面向对象思想的异同

类和对象

类: 是由n多个对象中抽取像的属性和行为从而归纳出来的

在Python中一切皆对象

  1. 自定义数据类型的语法结构:
class 类名():
    pass

但是你自定义完之后,目前还是不可以使用,它相当于你绘制了一个图纸,只有你创建对象之后才可以使用,对象是具体的实例

  1. 创建对象的语法结构
对象名=类名()
对象名也就是一个变量名

类的组成

创建和调用👇

class Student:
    #类属性:直接定义在类中,方法外的变量
    school='扬州教育中心'

    # 初始化方法,实例属性需要定义在_init_方法中,使用self打点的变量
    def __init__(self,xm,age):
        self.name=xm #左侧是实例属性,xm是局部变量,将局部变量的值xm赋值给实例属性self.name
        self.age=age #实例的名称和局部变量的名称可以相同

    #定义在类中的函数,称为方法,且自带参数self
    def show(self):
        print(f'我叫:{self.name},今年{self.age}岁了')

    #静态方法
    @staticmethod
    def sm():
        #self.name()
        #self.show()
        print('这是一个静态方法,不能调用实例属性,也不能调用实例方法')

    #类方法
    @classmethod
    def cm(cls):
        print('这是一个静态方法,不能调用实例属性,也不能调用实例方法')

#创建类对象
stu=Student('phy',18)
#类属性(直接使用类名去打点调用)
print(Student.school)
#实例属性(它使用对象名进行打点调用,而并不是用self)
print(stu.name,stu.age)
#实例方法(使用对象名进行打点调用)
stu.show()
#静态方法(直接使用类名打点调用)
Student.sm()
#类方法(直接使用类名打点调用)
Student.cm()

动态绑定属性和方法

  • 每个对象的属性名称相同,但属性值不同
  • 可以为某个对象绑定独有的属性或方法

动态绑定属性

动态绑定方法

面向对象的三大特征(封装,继承,多态)

1.封装

python中的权限控制 ​

如果非要访问双下划线的私有属性或方法的话

对象的名字._类的名字_ _属性名

对象的名字._类的名字_ _方法名()

关于属性设置问题:(私有属性)

class Student:
    def __init__(self,name,gender):
        self.name=name
        self.__gender=gender#私有

    #让@property修饰方法,来把方法修改(转)为一个属性去使用
    #虽然这样私有属性就可以显示了,但是它只可读不可写
    #如果非要写,就需要setter
    @property
    def gender(self):
        return self.__gender

    #将我们gender这个属性设置为可写属性
    @gender.setter
    def gender(self,value):
        if value!='男' and value!='女':
            print('性别有误,已将性别默认值为男')
            self.__gender='男'#设置默认值
        else:
            self.__gender=value

stu=Student('zyx','女')
print(stu.name,'的性别是',stu.gender)

#改
stu.gender='其它'
print(stu.name,'的性别是',stu.gender)

2.继承

1. 一个父类可以有多个子类

2. 一个子类可以继承多个父类(多继承)

方法重写

即:在子类里再写一个方法,方法名要跟你要重写的这个父类的方法名相同

  • 当然你也可以完全重写,不使用super调用父类内容

比如: ​

3.多态

class Person():
    def eat(self):
        print('汉堡')
class Cat():
    def eat(self):
        print('鱼')
class Dog():
    def eat(self):
        print('骨头')
#这三个类函数都有一个同名的方法,eat
def fun(obj):#obj是函数的形参,因为此时并不知道参数的数据类型
    obj.eat()

per=Person()
cat=Cat()
dog=Dog()

#python中的多态,不关心对象的数据类型,只关心对象是否具有同名方法
fun(per)#这就已经构成多态了
fun(cat)
fun(dog)

🦙object类(对象)

对象的特殊方法(首尾双下划线)

dir()内置函数,可以查看你的类的对象,它所具有的属性或方法

使用即: ​

对象的特殊属性(首尾双下划线)