Python编程基础-下篇
1.1 集合
- 形式上 {} ,其中两个相同的元素使用逗号分割
- 集合的主要作用,就是去重,因为集合中每一个元素都是唯一的!
- 集合的性质
- 确定性
- 互异性
- 无序性
- 一些函数
a.add( | a.intersection( | a.remove( |
---|---|---|
a.clear( | a.intersection_update( | a.symmetric_difference( |
a.copy( | a.isdisjoint( | a.symmetric_difference_update( |
a.difference( | a.issubset( | a.union( |
a.difference_update( | a.issuperset( | a.update( |
a.discard( | a.pop( |
- 集合的去重
num1=[1,1,2,2,3,3]
num2=[2,2,3,3]
set(num1)#去重
{1, 2, 3}
set(num2)#去重
{2, 3}
- 集合的运算
- set1 - set2 # 差集 difference
- set1 & set2 # 交集 intersection
- set1 | set2 # 并集 union
- set1 ^ set2 # 对称差集 symmetric_difference
set1=set(num1)
set2=set(num2)
set1 - set2 # 差集 difference
{1}
set1 | set2 # 并集 union
{1, 2, 3}
set1 ^ set2 # 对称差集,symmetric_difference,并集-交集
{1}
set1 & set2 # 交集 intersection
{2, 3}
1.2条件判断语句
- 语句
- 单分支
if 条件1:
满足条件后要执行的代码 - 双分支
if 满足条件1:
满足条件后执行的代码
else:
不满足执行的代码 - 多分支
if 满足条件1:
满足条件后执行的代码
elif满足条件2:
满足条件后执行的代码
……
else:
不满足条件执行的代码
#单分支条件判断
grade=90
if grade>=60:
print('你及格了!')
你及格了!
#双分支条件判断
grade=90
if grade>=60:
print('你及格了!')
else:
print('你完了')
你及格了!
#多分支条件判断
grade=(input('成绩'))
if grade.isdigit():
grade=int(grade)
if 90<=grade<=100:#等价于(grade<=100) and (grade>=90)
print('成绩A')
elif 80<=grade<90:
print('成绩B')
elif 70<=grade<80:
print('成绩C')
elif 60<=grade<70:
print('成绩D')
elif 0<=grade<60:
print('成绩E,你完了')
else:
print('非法输入')
else:
print('请输入正确数字')
成绩89
成绩B
- 逻辑
- and同时满足两个或以上
- or 满足两个或两个以上中的任意一个
- not 不满足
- Python的缩进
- 顶级代码必须定顶格书写,即一行代码不依赖任何条件,不可进行缩进
- 同一级代码,缩进相同
- 官方建议用四个空格,或者直接按Tab
1.3循环语句
3.10版本前有两种循环,新版本添加了Switch循环
重复一定的次数,称为计次循环,for 循环
for 迭代变量 in 对象
循环体直到条件满足,才结束循环,只要条件为真,这种循环就一直进行下去,称为条件循环,即while循环。
只要条件为真,这种循环一直持续下去,通过一个表达式,来控制是否继续反复执行循环体中的语句while 条件表达式: 循环体
1.3.1计次循环for
- range() #内置函数,用于生成一系列连续整数,多用于for循环
# range(start,end,step)
for i in range(0,10,2):
print(i)
0
2
4
6
8
- append() 利用循环将数据存入列表
#把1-10之间所有奇数的平方存入到一个列表中
sq=[]
for i in range(1,10,2):
sq.append(i*i)
sq
[1, 9, 25, 49, 81]
- startwith() #以什么开头
#把1-300中以5开头的数字放入一个表中
nums=[]
for i in range(1,300):
if str(i).startswith('5'):
nums.append(i)
nums
[5, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59]
- 列表推导式
#列表推导式
[i*i for i in range(1,20,2)]
[1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
1.3.2条件循环while
#计算1-100的和
count=1
while count<=100:
if count==100:
break
count=count+1
print(count)
100
#生成随机数
import random
random.randint(1,100)
67
- break #退出循环
#要求用户输入数字,判断其是否正确,正确结束,不正确就一直猜
import random
random_num=random.randint(1,100)#生成1-100内的随机数
count=0
while True:
guess_num=int(input('请输入你猜的数字'))
if guess_num==random_num:
print('你猜对了')
break
elif guess_num>random_num:
print('猜大了')
else:
print('猜小了')
#加入计数器,只能猜3次
count+=1
if count==3:
print('还没猜对,好菜哦,继续游戏吗')
countu=input('是否继续:是【Y】,否【N】')
if countu=='Y':
print('再三次机会哦')
count=0
else:
print('结束了')
break
请输入你猜的数字89
猜小了
请输入你猜的数字99
猜大了
请输入你猜的数字85
猜小了
还没猜对,好菜哦,继续游戏吗
是否继续:是【Y】,否【N】N
结束了
- continue #终止本次循环,提前进入下一次
count=0
while count<=10:
if 6<=count<=8:
count+=1
continue #可终止本次循环,提前进入下一次循环
print(count)
count+=1
0
1
2
3
4
5
9
10
1.4文件读写
1.4.1 'txt’文件读写
file=open('a.txt','w',encoding='utf-8')#用写入模式打开文件,并指定编码
file.write('今天是冤种的第一天')#给文件中写入内容
file.close()#关闭
- w 覆盖写入
with open('a.txt','w')as file:
file.write('这是测试语句')
#原内容被覆盖掉了
- a 追加写入
with open('a.txt','a') as file:
file.write('\n今天是2022年5月16日,星期一')
file.write('\n今天是2022年5月16日,星期一')
- r 只读模式
with open('a.txt','r') as file:
print(file.read())
这是测试语句
今天是2022年5月16日,星期一
今天是2022年5月16日,星期一
1.4.2 关于图片文件读写
- 二进制文件导入
import requests
data=requests.get("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201211%2F04%2F20121104194249_nzJij.jpeg&refer=http%3A%2F%2Fb-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1655282348&t=3e2a2fcaff2db7287408cdd41c4c716f.jpg")
- 二进制文件 写wb
- f. 格式化输出
with open('a.jpg','wb')as f:#图片文件没有编码
f.write(data.content)#格式化输出
- 二进制文件 读rb
with open('a.jpg','rb')as f:
dt=f.read()#图片文件没有编码
1.5函数
- 调用函数
- 默认参数
- 非固定参数
- 函数返回值
- #写一个程序,24小时,监控公司网站的服务器状态,当内存,CPU,硬盘使用大于阈值时报警
while True:
if cpu使用率>90%:
#发送邮件提醒
连接邮件服务器
发送邮件
关闭链接
if 内存使用率>90%:
#发送邮件提醒
连接邮件服务器
发送邮件
关闭链接
if 硬盘使用空间>90%:
#发送邮件提醒
连接邮件服务器
发送邮件
关闭链接
#上述代码重复过多,步骤冗余,不便修改
def 发送邮件(内容):#定义函数
#发送邮件提醒
连接邮件服务器
发送邮件
群发功能
关闭链接
while True:
if cpu使用率>90%:
发送邮件("CPU报警")
if 内存使用率>90%:
发送邮件("内存报警")
if 硬盘使用空间>90%:
发送邮件("硬盘报警")
1.5.1 调用函数
- 将一组语句的集合,通过一个名字(函数名)封装起来,想要执行函数,只需调用函数名即可
减少重复的代码
使程序变得可扩展
是程序变得可维护
def 函数名(参数1,参数2...): """ 函数的注释 """ 函数体 return 值
- def : 函数的关键字
- 函数名: 函数的名字
- 参数:
- 函数的注释: 函数的文档描述,函数的功能是什么,函数的输入是什么,输出是什么
- 函数体: 由语句和表达式组成,函数的逻辑
- return值: 函数的返回值是什么
def sayhi():
print("Hello world!!!")
sayhi()
Hello world!!!
def calc(x,y): # x,y, 叫做形式参数,形参
"""
x: 长方形的长
y: 长方形的宽
输出: 长方形的面积
"""
s = x * y
print(f"长方形的长为{x},宽为{y},它的面积是{s}")
return s
calc(4,6) # 实参
长方形的长为4,宽为6,它的面积是24
24
1.5.2默认参数
- 不指定的时候: 会使用默认参数,指定的时候,使用指定的参数
- 数量必须与定义时一致,
- 位置必须与定义时一致,
- 正常情况下,给函数传参要按照顺序,不想按照顺序就可以使用关键参数,只需要指定参数名即可!
def stu_reg(name,age,course,country="中国"):#指定了country
print("----学生注册信息-----")
print(f"姓名:{name}")
print(f"age: {age}")
print(f"国籍: {country}")
print(f"课程: {course}")
stu_reg(24,'张三','python')#在国籍那一栏自动填入默认参数
----学生注册信息-----
姓名:24
age: 张三
国籍: 中国
课程: python
stu_reg('alex','23','linux',"美国")#自定义内容覆盖掉了默认值
----学生注册信息-----
姓名:alex
age: 23
国籍: 美国
课程: linux
stu_reg(age=24,name='alex',course='python')#使用关键字传参,无需考虑顺序
----学生注册信息-----
姓名:alex
age: 24
国籍: 中国
课程: python
1.5.3 非固定参数
- *args #会把多传入的参数变成一个元组
def calc_num_sum(x,*args): # args 会把多传入的参数变成一个元组
sum_z = 0
for i in args:
sum_z += i
sums = x + sum_z
print(f"计算得到总和为{sums}")
calc_num_sum(1,2,3,4,5,67)
计算得到总和为82
calc_num_sum(1,2,3,4,5,6,7,8)
计算得到总和为36
- **kwargs #会将你多传入的参数,组和成一个dict形式
# **kwargs 会将你多传入的参数,组和成一个dict形式
def stu_reg(name,age,**kwargs):
print(name,age,kwargs)
stu_reg('alex',24,sex='Male',course='python')
alex 24 {'sex': 'Male', 'course': 'python'}
- *args和 ** kwargs配合使用
def stu_reg(name,age,*args,**kwargs):
print(name,age,args,kwargs)
info = stu_reg('alpha',24,"中国","Python",
school='陕西科技大学',ID='12101184')
alpha 24 ('中国', 'Python') {'school': '陕西科技大学', 'ID': '12101184'}
1.5.4函数的返回值
- None
- 没有return
- return 空值
- return - 一个返回值
- return 值 - 多个返回值
- return 值1, 值2, 值3
1.5.5一些高阶函数
- lambda #使用lambda函数创建匿名函数,只是一个表达式.函数体比def定义的简单的多
#计算任意一个数字的平方
calc=lambda x:x*x
calc(10000)
100000000
#计算两个数字的乘积
calc = lambda x,y : x*y
calc(10,8)
80
- map #接受两个参数,第一个是函数,第二个是序列,map传入的函数将依次作用于序列的每个元素,并把结果作为新的list返回
#计算1-10数字的平方
list(map(lambda x:x**2,range(1,10)))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
- filter #基于定义的条件筛选一系列数据
list(filter(lambda x:x%3==0,range(30)))
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
- reduce #在数组的每个元素上执行用户提供的回调函数
res = 1
for i in range(1,11):
res = res *i
print(res)
3628800
from functools import reduce
reduce(lambda x,y:x*y,range(1,11))#每次的结果返回给x,y取下一个
3628800
1.6 列表生成式
a = list(range(10))
a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = []
for i in a:
b.append(i+1)
print(b)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- enumerate #内置函数,可以获得索引和元素值
for index,i in enumerate(a):#生成a的索引值
a[index] += 1
a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- map #内置函数,根据提供的函数对指定序列做映射
list(map(lambda x:x+1,range(10)))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[i+1 for i in range(10)] # 列表生成式
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#1-30之间能被3整除的平方,用列表生成式实现
[i*i for i in range(1,30) if i%3 == 0]
[9, 36, 81, 144, 225, 324, 441, 576, 729]
- jion #字符串操作函数,将序列中的元素以指定的字符连接生成一个新的字符串
#乘法口诀表
print("\n".join(["\t".join([f"{j}*{i}={i*j}" for i in range(j,10)]) for j in range(1,10)]))
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*6=36 6*7=42 6*8=48 6*9=54
7*7=49 7*8=56 7*9=63
8*8=64 8*9=72
9*9=81
本文含有隐藏内容,请 开通VIP 后查看