以用代学。
Day 1 认识Pythonpython解释器:
python是解释型语言 c/c++ 编译型语言编译型语言比解释型语言执行速度快。python代码必须顶格书写
注释
注释分为单行注释和多行注释
单行注释 用# 快捷键:ctrl /(注:可以对多行使用)多行注释 用三个单引号或者三个双引号
PEP 8规范
- 单行注释# 后面应该有一个空格代码文件最后一行是空行行内注释前需要两个空格
绿色下划线为拼写检查,不需要处理。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JiqsXohp-1647751188441)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220121171224753.png)]
变量
字符串:引号引起来的内容 包括单引号和双引号快捷键ctrl enter在下方插入一个空行快捷键ctrl d 快速复制一行代码
标识符和关键字
标识符命名规则: 由字母,数字和下划线组成,不能以数字开头
变量的命名规范
遵循标识符的规则见名知意使用下划线连接不能使用系统的关键字
关键字: 系统定义好的标识符,具有特殊的作用
不需要刻意的记忆,后续课程中会逐渐学习
输出
# 输出
print("isaac", 18) # isaac 18 空格隔开
格式化输出:%.nf 保留n位小数 默认保留6位ctrl d 快速复制一行代码shift enter在下方新建一行代码
# %.nf 保留n位小数 默认保留6位
height=1.7
print("shengao:%.3f"%height)
# 输出50% %需要打两遍,因为这是语法
print("及格人数为%d%%" % 50)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TT5tZmma-1647751188441)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220121180411221.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vhz3QcIS-1647751188442)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220121182311504.png)]
直接写变量
关于print()和n
输入python用input进行输入,input 括号内可写提示信息特别需要注意的是input返回的是字符串类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7oiHDYMA-1647751188443)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220129152522971.png)]
类型转换
类型转换:将原始数据转换为我们需要的数据类型,在这个过程中,不会改变原始的数据,但会生成一个新的数据。
整数类型的字符串 如 “10”,“32” 这种可以转换为int类型;而“3.14”这种则不能转换为int类型,会出现类型转换错误数字类型的字符串转换为float 如 “10” “3.14”
eval() 还原原来的数据类型 ——即去掉字符串的引号
eval里面不能为空
num2 = eval("3.14")
print(type(num2))
print(num2) # 3.14
运算符
算数运算符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VfoC3Jui-1647751188443)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220129160728255.png)]
注:混合运算时,运算的优先顺序为:** 高于 * / % // 高于+ - ,为了避免歧义,建议使用()来处理运算符的优先级。
此外,不同类型的数字在进行混合运算时,整数将会转换成浮点数进行运算。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5R8cYIdY-1647751188444)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220129162435038.png)]
算数运算符 : + - * / // 整除(求商) % 取余数 ** 指数,幂运算 ()改变运算级赋值运算符
= 将等号右边的结果赋值给等号左边的变量 等号左边,必须是变量,不能是具体的数字复合赋值运算符
+= c+=a ---->c=c+a比较运算符
比较运算符的结果是bool类型 即 True 或者是 False
== 判断是否相等,相等则为True,否则则为False != 判断是否不相等。不相等为True,相等为False > < >= 大于或等于 <=逻辑运算符
逻辑运算符可以连接表达式,多个表达式共同的结果,共同的结果决定最终结果是True 还是False
and 逻辑与, 连接的两个条件都必须为True,结果才为True "有假则假" or 逻辑或,连接的两个条件都为False ,结果才为False "有真则真" not 逻辑非,取反 原来是True 变为False 原来是 False,变为True
Day 2短路原理:and:如果第一个条件为False,则不会判断第二个条件
or:如果第一个条件为True,则不会判断第二个条件
判断 if 结构在python中单引号与双引号没用区别,配对即可。需要将数字类型的字符串转换为数字类型(int,float),就可以使用eval(),也可以直接使用int(),float()
if 判断条件:
判断条件为True,会执行代码
...
顶格书写的代码,代表和if判断没用关系在 python 中使用缩进,代替代码的层级关系,在if语句缩进内,属于if语句的代码块(多行代码的意思)
example:
a = input('哥的年龄:') # str
b = int(a) # int 字符与数字不能直接比较
if b >= 18:
# 条件满足才会执行
print("哥18了,进入网吧.")
print("if 判断结束")
if else 结构
if 判断条件:
判断条件为 True 会执行的代码.
判断条件为 True 会执行的代码.
····
else:
判断条件为 False 会执行的代码.
if 和else 只会执行一个
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ke4ECLkP-1647751188444)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220224120248219.png)]
Debug调试
可以查看代码的执行过程可以排查错误
步骤:
- 打断点(一般可以在代码的开始打上断点,或者在查看代码的地方打断点)右键 debug运行代码点击 下一步,查看代码执行的过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rVU6LiuN-1647751188445)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220224131312303.png)]
if elif 结构if -elif 结构与 if -if结构 有很大的不同.if elif elif else结构只要有一个条件满足,后续的条件就不再判断了。
if 判断条件1:
判断条件1成立,执行的代码
elif 判断条件2:
判断条件1不成立,判断条件2成立,会执行的代码
else:
判断条件1和判断条件2都不成立,执行的代码
-----------------------------------------
if 判断条件1:
判断条件1成立执行的代码
if 判断条件2:
判断条件2成立执行的代码
pycharm重命名文件快捷键:shift F6 if嵌套的结构
if 判断条件1:
判断条件1成立,会执行的代码
if 判断条件2:
判断条件1成立,判断条件2成立执行的代码
else:
判断条件1成立,判断条件2不成立执行的代码
else:
判断条件1不成立,会执行的代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CtuRumb1-1647751188445)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220224144320989.png)]
猜拳游戏if 嵌套,只有外层的条件成立,才会判断内层的if内层需要注意缩进
产生随机数
三目运算import random # 导入随机数模块
random.randint(参数1,参数2) # 使用
参数1、参数2必须是整数函数返回参数1和参数2之间的任意整数, 闭区间,包含参数1,参数2。
if else 结构变形:将这个结构扁平化
if 判断条件1:
表达式1
else:
表达式2
----判断条件成立,执行表达式1,条件不成立,执行表达式2
变量 = 表达式1 if 判断条件 else 表达式2 # 推荐使用扁平化代码
判断条件成立,表达式1的值
条件不成立,表达式2的值
可多加括号,使得看的更加清楚。
循环
while 循环
while 判断条件:
判断条件成立,执行的代码
判断条件成立,执行的代码
不在 while 的缩进内,代表和循环没有关系
while 和 if 的区别:
if 的代码块,条件成立,只会执行一次
while 的代码块,只要条件成立,就会一直执行
example:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-49aQNh1P-1647751188446)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220224182654752.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZsOAqIqq-1647751188446)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220224183019704.png)]
while True: # 无限循环
代码
死循环:相当于是代码的bug,错误
无限循环:人为书写的,故意这样写的
while循环应用
累加1—100
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iETxTSh2-1647751188447)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220224185026027.png)]
while循环嵌套[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-alV8PEn4-1647751188447)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220224190452629.png)]
计数的位置比较重要,需要关注。
while 判断条件1:
代码1
while 判断条件2:
代码2
for循环
for循环格式:
for 变量 in 列表或字符串可迭代对象:
代码
for 循环也称为 for 遍历,会将字符串中的字符全部取到
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-syImy0xy-1647751188448)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220224194905280.png)]
for 循环有个缺点 不能实现无限循环
for循环嵌套
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CoLZ5JOe-1647751188448)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220224195759817.png)]
for循环嵌套的应用可以使用range来控制循环的次数
打印正方形:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DdID6GZT-1647751188449)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220224201012159.png)]
打印三角形:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PPY9wLd5-1647751188449)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220224205425666.png)]
Break 和 continuebreak 和 continue 是python 两个关键字 break 和 continue 只能用在循环中 break是终止循环的执行,即循环代码遇到 break 就不再循环了 continue 是结束本次循环,继续下一次循环,即本次循环剩下的代码不会执行,但会进行下一次循环。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-onPPXjeH-1647751188450)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220225095544711.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-llTEr7CL-1647751188450)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220225095553743.png)]
循环 else 结构 for x in xx:
if xxx:
xx # if 判断条件成立
else:
xxx # if 判断条件不成立,会执行
else:
xxx # for 循环代码运行结束,但是不是被break终止的时候会执行 (正常循环结束 会执行这个else中的)
else与循环for对齐。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V5njut8s-1647751188451)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220225101223971.png)]
总结:
判断:if elif else
if 判断条件:
pass # 占位,空代码,让代码不报错
elif 判断条件:
pass
else:
pass
循环:while for
while 判断条件:
pass
for i in xxx:
pass
break 和 continue区别
循环与 else 结合
Day 3
字符串
如果字符串本身包含单引号,使用双引号定义,如果包含双引号,可以使用单引号定义,或者统一使用三引号在python中,字符串可以乘上一个整数,字符串会重复拼成一个新字符串
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-phw6tW6B-1647751188451)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220225154300803.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P7ghw3wD-1647751188452)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220225154511253.png)]
字符串的输入和输出# 输入input() input() 函数得到的内容就是字符串 # 输出print()函数 %s f-string下标
下标也称为索引,是一个整型数字,可以是整数,也可以是负数正数下标从0开始,负数下标从**-1**开始[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qld6XFf0-1647751188452)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220225160906940.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zPBkeRkw-1647751188453)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220225160718599.png)]
len()
可以使用len()函数得到字符串的长度
使用正数下标书写字符串中最后一个元素
print(my_str[len(my_str)-1])切片
切片语法:[起始==:结束:==步长]
步长可以不写,默认为1。步长可以是负数(从右到左)。
end位可不写,默认是len(),即取到最后一个元素
start位可不写,默认是0,即第一个元素
start位和end位都不写,但是冒号需要写
从起始位开始到结束位前一位结束,步长表示选取间隔
切片可以获取一段数据,多个数据,下标(索引只能获得一个数据)
⭕️字符串的逆置:my_str[::-1] # olleh 若字符串为hello
⭕️得到原来一样的字符串:my_str[:]
查找find()&rfind()
find()在字符串中查找是否存在某个字符串my_str.find(sub_str, start, end)其中,sub_str:要在字符串中查找的内容,类型是str;start:开始位置,从哪里开始查找,默认是0;end:结束的位置,查找到哪里结束,默认是len()返回值(方法执行的结果是什么):如果找到sub_str,返回sub_str在 my_str 中的位置的==正数下标==。如果没用找到,返回-1rfind()从右边(后边)开始查找。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eQhlyDeU-1647751188453)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220225182924053.png)]
index()&rindex()
在字符串中查找是否存在某个字符串(与find()一样)my_str.index(sub_str, start, end)其中,sub_str:要在字符串中查找的内容,类型是str;start:开始位置,从哪里开始查找,默认是0;end:结束的位置,查找到哪里结束,默认是len()返回值(方法执行的结果是什么):如果找到sub_str,返回sub_str在 my_str 中的位置的==正数下标==。如果没用找到,会报错
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tctWenVa-1647751188454)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220225193409235.png)]
index()与find()的区别就在于find()找不到返回-1;而index()找不到报错误
count()统计出现的次数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2WadlEoN-1647751188454)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220225194048046.png)]
替换replace()默认全部替换,且不会对原来字符串有改动
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZXa8USuL-1647751188455)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220225210027378.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cfDmuoSY-1647751188455)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220225210103095.png)]
分割split()方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6I06H4rA-1647751188456)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220226102718293.png)]
连接[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KMA0RDN6-1647751188456)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220226224234277.png)]
⭕️将列表内容连接成一个字符串(也可以是字符串)。
补充[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VqENuV1k-1647751188457)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220227084630347.png)]
列表 列表遍历[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tjl65PFF-1647751188458)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220228082948863.png)]
列表的相关操作 1.添加数据(append、extend、insert)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Fj2ueHZ-1647751188458)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220228085320096.png)]
2.修改下标修改
3.查询[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4IXysZ64-1647751188459)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220228143332330.png)]
4.删除(del, pop, remove)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-21ruwIB4-1647751188459)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220228181432481.png)]
5.排序和逆置 列表的嵌套[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEcIyA7E-1647751188460)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220228230739182.png)]
列表应用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mzgdRIfb-1647751188460)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301084713694.png)]
元组python 的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。
没用增删改的操作只有查询操作元组与列表一样是只有index方法,没用find方法(find只限于字符串,返回正数下标)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QPoUMOiC-1647751188461)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301133131331.png)]
Day 4tips:查看方法有没有返回值.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YlGhQEnz-1647751188461)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301132558047.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nhqTlgIL-1647751188462)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301134005975.png)]
不能用循环,而使用这种切片的方式循环是因为,当删除一个元素后,默认其余元素往前移,会导致漏删元素。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ASE9amY-1647751188462)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301135300528.png)]
字典 字典的定义加法合并列表可以使用集合来去重
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fymVnRVu-1647751188463)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301141912194.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eeYayz0u-1647751188463)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301143636916.png)]
字典的添加和修改数据[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t8kI2ihV-1647751188464)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301191231742.png)]
字典的删除数据[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nVnXt4fM-1647751188465)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301193149383.png)]
字典中的遍历数据for循环遍历
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j5NPyafe-1647751188466)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301230208953.png)]
for循环遍历,遍历的是字典的key值
字典.keys()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lkRY3AnY-1647751188466)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301231022417.png)]
字典.values()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fTf8TWnz-1647751188467)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301231608816.png)]
字典.items()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mpfLfCXq-1647751188468)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220301232505864.png)]
enumerate()item() 是一个列表中多个元组的形式,可以用拆包的方式分别赋值.
把下标列出来[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L345AR46-1647751188468)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302084818244.png)]
公共方法
+ 支持字符串、列表、元组进行操作,得到一个新的容器
* 整数 复制,支持 字符串、列表、元组进行操作,得到一个新的容器
in/not in 判断存在或者是不存在,支持字符串、列表、元组进行操作。注意:如果是字典的话,判断的是key值是否存在或者不存在
max/min 方法对于字典来说,比较的是字典的key值大小
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SIvVznpy-1647751188469)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302092041012.png)]
字母的大小: ‘A’ < ‘Z’<‘a’<‘z’
ASCII码 65 97
27之前,键盘不可见
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FGQOIzEA-1647751188469)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302093007589.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtzRqk6I-1647751188470)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302093123968.png)]
函数 函数基本概念print() 打印输出 input() 输入 len() 求容器长度的 函数可以实现一个具体的功能
def 函数名():
代码
需要用 函数名()调用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6mYfFznm-1647751188470)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302154120485.png)]
函数的文档说明**PEP8代码规范:**函数定义上下空两行快速格式化代码:reformat code 格式化代码 ctrl+alt+l
特殊的字符串(注释)
help(函数名)可以查看函数注释或者用ctrl+b[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gmu3nrsv-1647751188471)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302155405729.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JDU6Fcik-1647751188471)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302155721431.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0VBkgCTr-1647751188472)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302160434298.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yl4IX5vK-1647751188472)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302162206036.png)]
局部变量好处:可以使函数代码更加通用,适用更多的场景
局部变量的作用域(作用范围):当前函数的内部 局部变量的生命周期:在函数调用的时候被创建,函数调用结束之后,被销毁(删除) 局部变量只能在当前函数的内部使用,不能再函数的外部使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jfFhxAWw-1647751188472)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302163925922.png)]
全局变量全局变量:定义在函数外部的变量 在函数内部可以访问全局变量的值,如果想要修改,需要使用global关键字生命
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Kv4qTkS-1647751188473)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302170215540.png)]
函数的返回值在函数中定义的局部变量,或者通过计算得出的局部变量,想要在函数 外部访问和使用 ,此时就可以使用 return 关键字,将这个返回值返回
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H5SNqa1c-1647751188473)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302231308921.png)]
return 返回多个数据值程序代码遇到一个 return 之后,后续的代码不再执行了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H5atjUcd-1647751188474)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220302232817387.png)]
return 关键字后边可以不写数据值,默认返回None
def func():
xxx
return # 返回None,终止函数的运行
函数可以不写return,返回值默认为None
def func():
xxx
pass
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ht47o5JK-1647751188475)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220303084853846.png)]
用debug的方式查看每一步
函数的嵌套调用
在一个函数中可以调用另外一个函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G4c4kQjC-1647751188475)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220303091007653.png)]
应用打印横线
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PUb1yIIG-1647751188475)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220303115113121.png)]
求三个数的和、平均值 复习
标识符命名规则:由字母、数字和下划线组成,不能以数字开头
变量名不能和关键字重名
关键字是系统定义好的标识符,具有特殊的作用
type()函数可以查看变量的数据类型
输入:input() -->str 类型转换
输出:print() %s---字符串 %d----int
%f----float %s比较万能,可以将所要输出内容转换为字符串,然后输出
格式化输出:想要输出% 用%% 如:print("%d%%" % 50)
f-string{变量}
逻辑运算符:
and 一假为假
or 一真为真
not 取反
比较运算符
== !=
判断:
if elif else
循环
wile
for xx in 容器/range():
pass
range(a, b, step) [a,b)之间的整数
break 终止循环 continue
循环 else 结构:循环不是被break终止的时候会执行else里面的代码
str : 下标 切片
list : insert append extend ...
tuple:元组中的数据不能修改 查询的方法 :index()
dict :key:value键值对形式
函数:
定义: def 关键字
def 函数名(形参):
函数体
return 数据
pass
函数调用,才会执行函数中的代码 函数名(实参列表)
局部变量 全局变量
局部变量只能在当前函数内部使用,如果想要将这个变量在函数外部使用,1.可以使用return将这个变量返回,2.使用 global将其变为全局变量
全局变量:在任何地方都可以访问,想要在函数内部修改全局变量的值,使用 global 声明
Day 5
函数传参的两种形式(传递实参)
位置传参1️⃣关键字传参2️⃣ 函数形参(三种形参类型)
普通参数
缺省参数(默认参数)
不定长参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mX9CWN3v-1647751188476)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220303233859730.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AjKsNO1c-1647751188476)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220303234825368.png)]
注意:
函数定义中的args 和 kargs可以是任意的形参变量,不过习惯使用 args和 kwargs。(潜规则)
*参数 要在 **参数 之前。
形参格式规则:
拆包print函数的sep参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQ6aq3r0-1647751188477)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220304133629933.png)]
容器中元素个数需要和变量的个数保持一致
常见应用:交换两个变量值
找一个变量存起来加减法构造组包、拆包 引用(难点)
引用看作内存地址,这样取理解。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rhzMZU4K-1647751188477)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220304143713938.png)]
*使用赋值运算===== 能改变变量的引用。*
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vC3LBVBb-1647751188478)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220304145316767.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tUQWnSzg-1647751188478)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220304145510438.png)]
可变类型和不可变类型python中的内存优化,对于不可变类型数据的引用是一样的。set也是可变类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iVhlThhs-1647751188478)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220304190027987.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zkt3MPJf-1647751188479)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220304190104148.png)]
补充:(在交互终端中)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPCXfG4m-1647751188479)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220304231930520.png)]
引用做函数参数注意点[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ObvAARLk-1647751188480)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220304233630155.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QTbddfW1-1647751188480)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220305090533731.png)]
学生管理系统+= 对于列表而言不会改变变量的引用
增删改查操作
存储学生信息
姓名
年龄
班级
性别
...
{'name': 'issac', 'age': 18, '...'} 每个学生用字典
存储所有的学生信息
列表:[{}, {}, {}....] 所有的学生放在一个列表中
搭建业务框架
def show_menu():
print('1.添加学生')
print('2.删除学生')
print('3.修改学生信息')
print('4.查询单个学生信息')
print('5.查询所有学生信息')
print('6.退出')
# def main():
while True:
show_menu()
opt = input('请输入要选择的操作编号')
if opt == '1':
print('1.添加学生')
elif opt == '2':
print('2.删除学生')
elif opt == '3':
print('3.修改学生信息')
elif opt == '4':
print('4.查询单个学生信息')
elif opt == '5':
print('5.查询所有学生信息')
elif opt == '6':
print("退出,欢迎下次使用本系统")
break
else:
print("输入有误,请再次输入")
continue
input("......回车键继续操作........")
添加学生信息
通过input函数获取学生的信息,姓名,年龄,性别 将学生信息转换为字典进行保存 将这个学生字典添加到列表当中 # 对代码的优化: 假设学生名字都不重复,在添加学生的时候进行判断,如果学生名字已经存在,则不添加。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XQrkIdJB-1647751188481)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220306182908127.png)]
删除/修改/查询学生信息我觉得这里只能使用return了。
都使用 name 对学生进行判断 1. 使用input 获取获取要删除/修改/查询 的学生姓名 2. 判断学生信息是否存在 3. 学生存在,对学生进行 操作 4. 学生信息不存在,直接结束。
利用拆包传参:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DOfhvhVF-1647751188481)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220307084935230.png)]
Day 6 递归函数格式化输出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kHA8OWFC-1647751188482)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220307141526880.png)]
匿名函数函数自己调用自己必须有终止条件不是所有的循环都可以使用递归,但是可以使用递归的一定能用循环解决递归是入栈、压栈的过程
lambda 关键字定义的函数就是匿名函数匿名函数中不能使用if语句,while 循环, for循环,只能编写单行的表达式,或者函数调用不需要使用return,表达式的运行结果就是返回结果。匿名函数也可以不返回结果。例如:lambda:print(‘hello world’)
- 无参数无返回值
def 函数名(): 函数代码 lambda:函数代码
- 无参数有返回值
def 函数名():
return 1 + 2
lambda:1 + 2
- 有参数无返回值
def 函数名(a, b):
print(a, b)
lambda a, b:print(a, b)
- 有参数有返回值
def 函数名(a, b): return a + b lambda a, b: a + b
调用
加大括号 加小括号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c0atrfJm-1647751188482)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220308091050471.png)]
匿名函数的使用场景——函数作为参数去使用:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VZ3Hdox1-1647751188483)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220308134248552.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yPOGeMLR-1647751188483)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220308140110808.png)]
key 值函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uyimlgZx-1647751188484)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220308140219076.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pG1rY0kF-1647751188484)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220308141051194.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9m5JIloG-1647751188485)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220308141752934.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFwm5ZX0-1647751188485)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220308181728482.png)]
列表推导式1️⃣
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTjPiJ8N-1647751188485)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220308182816102.png)]
2️⃣
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B91TO3L4-1647751188486)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220308183244276.png)]
3️⃣
4️⃣
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgoR2VaQ-1647751188486)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220308185050925.png)]
集合[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N9aWOERh-1647751188487)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220308232629909.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WqVb3Y4K-1647751188487)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220308231733025.png)]
文件操作集合,列表,元组之间可以相互转换
文件的作用:可以永久保存数据。
文件在硬盘中存储的格式是二进制。
- 打开文件读写文件关闭文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wAP9EbUe-1647751188487)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220309083355837.png)]
写文件 -w[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V51crGSH-1647751188488)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220309090504096.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3GsjuCOb-1647751188488)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220309090718813.png)]
追加文件 -a[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HVNIGKUB-1647751188489)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220309112715898.png)]
Day 7递归函数一般是有参数的
def func():
global 变为全局变量解决
if num == 1:
return
func()
mylist = [20, 30]
print(mylist)
def func(a):
a += 20, # 对于列表而言 +=,相当于extend a.extend(20,) #extend里面放的是容器,str,list,tuple,dict
func(my_list)
print(my_list) # [20, 30, 20]
文件的读操作
read():按照字节读取文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aKr6Fxtv-1647751188489)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220310130659740.png)]
按行读取文件:一次度一行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yb8sL9WL-1647751188490)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220310131349482.png)]
使用strip()方法可以去除 空格 n这些字符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-47lvARY4-1647751188490)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220310131641860.png)]
模拟读取大文件
read() 一次读取全部的内容 read()、readline 读到文件末尾返回为空
第一种
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XAcTFznV-1647751188490)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220310135141703.png)]
第二种(更好)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-siiBV85J-1647751188491)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220310135254214.png)]
补充:计算机的大小计算机只认识 0 和 1 , 进制: 二进制 只有 0 1;逢二进一 十进制 0 1 2 3 4 5 6 7 8 9 逢十进一 十六进制 0 1 2 3 4 5 6 7 8 9 A B C D E F 逢16进1 计算机最小的单位是 bit(位) 只有两个数据值 0 和 1 字节:计算机中基本的存储单位,byte 1 byte = 8 bit 1 KB = 1024 byte 1 MB = 1024 KB 1 GB = 1024 MB 1 TB = 1024 GB ... 100Mbits 200 Mbits 12.5MB/s 25MB/s文件打开模式
文本文件: .txt .py .md (能够使用记事本打开的文件) 二进制文件: 具有特殊格式的文件 mp3 mp4 rmvb avi png jpg 等 (不能被记事本打开) 文本文件可以使用 文本的方式打开文件,也可以使用二进制的方式打开文件 而二进制文件,只能使用二进制的方式打开文件 二进制打开方式如下:不管读取还是书写,都需要使用二进制的方式 rb wb ab 添加b 二进制打开 注意点:不能指定 encoding 参数
写入、读取二进制文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gyw5SDOC-1647751188491)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220312143226233.png)]
文件备份
使用只读的方式打开文件
读取文件的内容
关闭文件
只写的方式打开新文件
将第二步读取的内容写入新文件
关闭新文件
代码优化:
1.如果文件比较大,循环读取文件
2.复制备份的文件可能是 txt 文件,可能是二进制文件----->使用二进制方式打开文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FfYRVAu6-1647751188492)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220312150056082.png)]
文件和文件夹的操作文件重命名:
import os os.rename(需要修改的文件名, 新的文件名)
删除文件
import os os.remove(待删除的文件名)
- 创建文件夹
import os
os.mkdir('新文件夹的名字')
- 获取当前目录
import os os.getcwd()
- 改变默认目录
import os
os.lisdir("../")
- 获取目录列表
import os
os.listdir("./")
- 删除文件夹
import os
os.rmdir('文件夹名')
批量修改文件名
应用–学生管理系统文件版用open创建文件
用chdir切换目录,操作完要记得换回来
学生管理系统
{'name':'issac', 'age': 18, 'gender': 'm'}
[{}, {}, {}]
需要将所有的学生信息保存到文件中,最简单的方法是将整个列表保存到文件中
'[{}, {}, {}]'转换为字符串,保存进文件中
w
'[{}, {}, {}]'--->[] eval()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p89QRqA3-1647751188492)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220312204742691.png)]
'[{}, {}, {}]' ----> eval('[{}, {}, {}]')
stu_list
优化:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0PXZwsYE-1647751188493)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220312223511238.png)]
面向对象 概念介绍面向过程和面向对象是两种编程思想,编程思想是指对待同一个问题,解决问题的套路方式。
面向过程:中小型项目 C语言 开发的步骤或过程(亲力亲为、函数)面向对象:大型项目 Java 或 C++ 看重结果,找人帮做(偷懒、封装、继承和多态)
三大特征:封装性、继承性、多态性(三大技术) 类和对象
类和对象是面向对象中非常重要的两个概念
类
类是泛指的,指代多个,是由对象抽象来的类在代码中,是通过关键字 class定义的
对象
对象是特指的,指代一个,是具体参在的在代码中,对象是由类创建的 类的组成
类(class):
类名属性:特性,变量方法:允许进行操作的方法(行为),函数
类的抽象:
名词提炼法所见即所得 类的定义
有三种定义方法:
随后的代码,使用狗类进行演示说明
类名:Dog :(狗类)
属性:
姓名 name
年龄 age
......
方法:
吃 eat()
玩 play()
.......
Day 8while True:
pass
使用场景,在书写代码时,不确定循环一共执行多少次,即不知道循环在什么时候结束,具体结束时间,在运行代码的过程中才能确定,在代码中进行 if 判断,如果条件不满足,就使用 break,终止循环。
my_list = list() # 创建列表类对象
my_dict = dict() # 创建字典类对象
my_tuple = tuple() # 创建元组对象
都是对象
------------------
class 类名(object):
def 函数名(self):
pass
类外部添加和获取对象属性rfind/find(字符串) 找到内容,返回正数下标,没有找到,返回-1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M2DkOCoL-1647751188493)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220313175130989.png)]
类内部操作属性[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJglEcow-1647751188493)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220313182712372.png)]
魔法方法在 python 的类中,有一类方法,这类方法以'两个下划线开头'和'两个下划线结尾',并且在'满足某个特定条件的情况下,会自动调用'.这类方法,称为魔法方法 魔法方法有三个要点: 1.魔法方法在什么情况下会自动调用 2.这个魔法方法有什么作用 3.这个魔法方法有哪些注意事项__init__()
调用时机:在创建对象之后,会立即调用 作用: 1.用来给对象添加属性,给对象属性一个初始值(构造函数) 2.代码的业务需求,每创建一个对象,都需要执行的代码可以写在 '__init__'中 注意点: 如果'__init__'方法中,有除了 self 之外的形参,那么在 创建对象 的时候,需要给额外的形参传递实参值 比如:类名(实参) 给对象添加属性就写在__init__方法中
带参数的init方法 __str__()
调用时机:
1.'print(对象)',会自动调用'__str__'方法,打印输出的结果是'__str__'方法的返回值.
2.'str(对象)'类型转换,将自定义对象转换为字符串的时候,会自动调用.
应用:
1.打印对象的时候,输出一些属性信息
2.需要将对象转换为字符串类型的时候
注意点:
'方法必须返回一个字符串' ,只有 self 一个参数
__del__()一是输出对象时会调用__str__二是做类型转换[ str(对象) ]的时候会调用__str__
# 析构函数
调用时机:
对象在内存中被销毁删除的时候(引用计数为 0 )会自动调用 __del__ 方法
1.程序代码运行结束,在程序运行过程中,创建的所有对象和变量都会被删除销毁
2.使用'del 变量' , 将这个对象的引用计数变为 0.会自动调用__del__方法
应用场景:
对象被删除销毁的时候,要书写的代码可以写在'__del__'中.一般很少使用
*引用计数:
是 python 内存管理的一种机制,是指一块内存,有多少变量在引用
1.当一个变量,引用一块内存的时候,引用计数加 1
2.当删除一个变量,或者这个变量不再引用这块内存,引用数减 1
3.当内存的引用数变为 0 的时候,这块内存被删除,内存中的数据被销毁
my_list = [1, 2] # 1
my_list1 = my_list # 2
del my_list # 1
del my_list1 # 0
对象引用数为0的例子:
查看引用数 案例:烤地瓜
封装的套路: 1.根据文字的描述信息,确定对象,对象有什么,就是属性 2.根据文字的描述信息,对象能干什么,就是方法 3.根据文字的描述信息,确定方法怎么书写
类名:地瓜类 Potato
属性:
状态 status = '生的'
烧烤总时间 total_time = 0
方法:
def cook(self, 烧烤时间)
计算烧烤时间
修改地瓜的状态
pass
输出信息 __str__()
定义属性 __init__()
烤地瓜—调料版
属性:
调料: name_list = []
方法:
添加调料: add()
案例:搬家具
类名:家具类 Furniture
属性:
类型 name
面积 area
方法:
输出家具信息 __str__
定义属性 __init__
---------------------------------------
类名:房子类 House
属性:
地址:address
面积:h_area
家具列表: furniture_list = []
方法:
添加家具 add_furniture()
输出房子信息 __str__
定义属性 __init__
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QlBcntfV-1647751188494)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220315103357222.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vByuH70Y-1647751188494)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220315103413895.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1NTNderg-1647751188495)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220315125532446.png)]
Day 9 继承的基本语法继承:描述类与类之间的所属关系
基本语法:
class 类B(类A):
pass
称类 B 继承 类A
特点:B类的对象可以使用 A类的属性和方法 (公有属性、公有方法/而私有属性、私有方法 不能被调用、不能被继承)
优点:代码复用(重复相同的代码不用多次书写)
名词:
类A:父类 基类
类B:子类 派生类
单继承与多层继承
子类重写父类的同名方法
重写:子类定义和父类名字相同的方法。 为什么重写:父类中的方法,不能满足子类对象的需求,所以要重写。 重写之后的特点:子类对象调用子类自己的方法,不再调用父类的方法,父类对象调用父类自己的方法。子类调用父类的同名方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JoqC9Pko-1647751188495)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220317103021591.png)]
继承中的init子类调用父类的同名方法,特别的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gw5FUPIB-1647751188496)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220317125728238.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3NMNwDPY-1647751188496)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220317125742676.png)]
多继承如果一个类有两个及两个以上的父类,就把这种继承关系称为多继承。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qux22LJN-1647751188497)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220317132521681.png)]
查看 当前类的继承顺序链
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z2WjfLXC-1647751188497)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220317164432833.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0NfCk7pO-1647751188498)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220317164658912.png)]
私有权限访问权限控制:在什么地方可以使用和操作.
私有权限:
定义:在方法和属性前加上两个下划线,就变为私有。
1.不能在类外部通过对象直接访问和使用,只能在类内部访问和使用
2.不能被子类继承
公有:不是私有的,就是公有的
私有属性
修改属性,区分好私有 公有私有属性的本质可以使用 实例对象.__dict__ 可以查看对象具有的属性信息通过公有方法处理私有属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MItd1ixP-1647751188498)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220317181943607.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8s4BCahE-1647751188499)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220317181851252.png)]
私有方法:本质也是修改方法名字
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Th4DVONS-1647751188499)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220317211607644.png)]
类属性[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePTlBp1f-1647751188499)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220317222858212.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xmVpirA2-1647751188500)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220317223001210.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KWhqFI9R-1647751188500)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220317223845037.png)]
类方法实例方法:类中默认定义的方法,就是实例方法,第一个参数为self,表示实例对象 类方法: 使用 @classmethod 装饰的方法,称为类方法,第一个参数是cls,代表的是类对象自己。 什么情况下定义为实例方法,什么情况下定义为类方法? 1.如果在方法中使用了实例属性,那么该方法必须定义为实例方法 2.前提:不需要使用实例属性,需要使用类属性,可以将这个方法定义为类方法静态方法
静态方法:使用 @staticmethod 装饰(标志)的方法,称为静态方法,对参数没有特殊要求,可以有,可以没有 什么情况下去定义静态方法呢? 不需要使用实例属性,同时也不需要使用类属性,此时可以把这个方法定义为静态方法 如果静态方法有参数,就必须传递实参值 (了解)没有继承的多态-------鸭子类型多态
在需要使用父类对象的地方,也可以使用子类对象,得到不同的结果 这种情况就叫做多态 如何使用? 1.子类继承父类 2.子类重写父类的方法 3.定义一个共同的方法,参数为父类对象,在方法中调用子类和父类同名的方法 好处:提高灵活性,拓展性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ddXyWyj4-1647751188500)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220318131027390.png)]
多态意义:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BkDa0SV6-1647751188501)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220318145938624.png)]
and优先级比or高
实例属性:
类外部: 实例对象.属性名 = 属性值
类内部: self.属性名 = 属性值 (一般在__init__中定义)
类属性:
类内部,方法外部直接定义的变量,就是类属性
实例方法:
直接定义的方法
def 方法名(self):
# 方法使用了实例属性
self.属性
pass
类方法:
@classmethod
def 方法名(cls):
# 类名.类属性
cls.类属性
pass
静态方法:
@staticmethod
def 方法名():
pass # 都不用
Day 10
异常的概念
异常的组成: '异常类型':'异常具体信息'捕获单个异常 捕获多个异常
方法1:
方法2:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fEaNIPyL-1647751188501)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220318210804377.png)]
打印异常描述信息 捕获所有类型的异常try:
可能发生异常的代码
except: # 缺点: 不能获取异常的描述信息
发生异常执行的代码
====================================
try:
可能发生异常的代码
except Exception as e:
发生异常执行的代码
print(e)
pass
# Exception 是常见异常类的父类
ZeroDivisionError--->ArithmeticError--->Exception--->baseException--->object
ValueError--->Exception--->baseException--->object
不能写object,最多写baseException,常用Exception
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WwPnMhes-1647751188502)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220318220021955.png)]
异常的完整结构try:
可能发生异常的代码
except Exception as e: # e就是异常信息
发生异常执行的代码
print(e)
else:
代码没有发生异常,会执行
finally:
不管有没有发生异常,都会执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sx0T81Dz-1647751188502)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220318223110402.png)]
异常的传递是 python 异常处理的底层机制,不需要我们写代码实现,是 python 已经实现好的. 异常传递: 当一行代码发生异常之后,会向外层将这个异常进行传递,直到被捕获或者程序报错为止 有两种: 1. try 嵌套 2. 函数嵌套
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ACmkb3XU-1647751188502)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220318231013455.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-URQJGqKJ-1647751188503)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220318232522892.png)]
自定义异常类程序代码为什么会报错?
因为不符合语法,因为 python 的作者在代码中使用了 if 判断,如果除数为 0,就会在代码中抛出异常错误.
抛出异常:
raise 异常对象 # 当程序代码遇到 raise 的时候,程序就报错了
异常对象 = 异常类(参数)
抛出自定义异常:
1. 自定义异常类,继承 Exception 或者 baseException
2. 选择书写,定义 __init__,定义 __str__ 方法(重写父类的方法)
3. 在合适的时机抛出异常对象即可
模块
import random random.randint(a, b) 产生[a, b] 之间的随机整数,包含b的 import os 模块 就是一个python 代码文件(.py),是别人已经写好的代码文件,文件中的函数,类,变量,我们都可以使用 使用模块的好处:直接使用别人已经实现好的功能
模块制作
模块就是一个python 文件 制作一个模块,其实就是定义一个python 代码文件 注意点:模块的名字要遵循标识符的规则(由字母、数字、下划线组成,且不能以数字开头) 模块中可以定义变量,定义函数, 定义类模块导入
想要使用模块中的内容,必须先导入模块 注意点:如果导入的是自己书写的模块,使用的模块和代码文件需要在一个目录中 方法一:import 模块名 使用: 模块名.功能名
方法二 from 模块名 import 功能名1, 功能名2, ...... 使用:功能名 注意点:如果存在同名的方法名,则会被覆盖
方法三 from 模块名 import * #将模块中所有的功能进行导入 不建议使用 使用:功能名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zJIj4PaM-1647751188503)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220319104702116.png)]
as 关键字 起别名,可以对模块和功能起别名
注意点:如果使用as别名,就不能再使用原来的名字[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8zFY4Q8Z-1647751188504)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220319112254449.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q1OfvgqM-1647751188504)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220319115854977.png)]
列表、元组里写的是字符串
在导入模块时,模块(文件)中所有没有任何缩进的代码都会被执行一遍. 而我们的开发场景是这样的: 每个模块独立开发,每个模块下方通常会增加一些测试代码(这些测试代码仅供模块内使用,被带入到其他文件中不需要执行) 为解决这个问题 ----> __name__属性 这个属性在每个模块即代码文件中都有,是系统自己定义的 __name__ 是python的内置属性,记录着一个字符串 如果是被其他文件导入,__name__ 就是模块名(文件名),而如果是当前执行的程序,__name__ 是 __main__
tips:if __name__ == "__main__": 可用main + 回车直接使用
因此在很多 python 文件中 都是这种格式的代码:
# 导入模块
# 定义全局变量
# 定义类
# 定义函数
# 在代码最下方
def main(): # 测试代码
#......
pass
# 根据 __name__ 判断是否执行下方代码
if __name__ == "__main__":
main()
注意点:
包包:功能相近或者相似的模块放在一个目录中,并在目录中定义一个 __init__.py文件,这个目录就是包.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xgnUE6B9-1647751188505)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220319155818344.png)]
学生管理系统——面向对象版 框架对象 = 管理系统类()
对象.start()
================
管理系统类
类名:StudentManageSystem
属性:
所有学生信息
学生字典 = {'学号': 一个学生对象,......}
方法:增删改查 显示菜单信息
学生:字典
类名:Student
属性:
姓名 name
年龄 age
性别 gender
学号 stu_id
方法:
__init__
__str__
面向对象开发的一般方式
1.一个类作为一个python文件
2.定义一个 main.py 作为程序代码的启动文件
==============================================
代码文件的组成:
student.py # 定义Student类
student_manage_system.py # 定义管理系统类
main.py # 作为程序的启动代码
实现功能
实现添加学生的功能
1. 使用 input 获取学生的信息 2. 使用学生信息,创建学生对象 3. 将学生对象 t
删除/修改/查询 学生
1.使用 input 输入学生学号 2.判断学生信息是否存在 3.存在进行操作
修改
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7JId7on3-1647751188505)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220319201204643.png)]
删除
查询
保存
{'11':对象, '22':对象}
直接打印:{'11':0x100,'22':0x200}----->保存 str({'11':0x100,'22':0x200})
但是不可以这样,因为内存释放
应该:
把具体的学生信息保存到文件中
11,aa,18,m
22,bb,16,f
for x in {}.values(): #对象
pass
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JAmEe2ya-1647751188506)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220319205217157.png)]
读取
读取文件,一行内容就是一个学生信息 readlines 读取所有行 ['11,aa,18,mn', '22,bb,16,fn'] 将列表中的每一项数据转换为对象 student(stu_id, name, age, gender) '11,aa,18,mn'.strip() ----->'11,aa,18,m'.split() ------>[11,aa,18,m]
代码优化:
- 用try except 捕获异常来处理没有打开文件用私有属性、私有方法来防止外部访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cEE4Ohuk-1647751188506)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220319213708243.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ob8WIBts-1647751188507)(C:UserslenovoAppDataRoamingTyporatypora-user-imagesimage-20220319213818988.png)]
因此,把那些方法做成私有方法
学生管理系统——面向对象版
框架对象 = 管理系统类()
对象.start()
================
管理系统类
类名:StudentManageSystem
属性:
所有学生信息
学生字典 = {'学号': 一个学生对象,......}
方法:增删改查 显示菜单信息
学生:字典
类名:Student
属性:
姓名 name
年龄 age
性别 gender
学号 stu_id
方法:
__init__
__str__
面向对象开发的一般方式
1.一个类作为一个python文件
2.定义一个 main.py 作为程序代码的启动文件
==============================================
代码文件的组成:
student.py # 定义Student类
student_manage_system.py # 定义管理系统类
main.py # 作为程序的启动代码
实现功能
实现添加学生的功能
1. 使用 input 获取学生的信息 2. 使用学生信息,创建学生对象 3. 将学生对象 t
删除/修改/查询 学生
1.使用 input 输入学生学号 2.判断学生信息是否存在 3.存在进行操作
修改
[外链图片转存中…(img-7JId7on3-1647751188505)]
删除
查询
保存
{'11':对象, '22':对象}
直接打印:{'11':0x100,'22':0x200}----->保存 str({'11':0x100,'22':0x200})
但是不可以这样,因为内存释放
应该:
把具体的学生信息保存到文件中
11,aa,18,m
22,bb,16,f
for x in {}.values(): #对象
pass
[外链图片转存中…(img-JAmEe2ya-1647751188506)]
读取
读取文件,一行内容就是一个学生信息 readlines 读取所有行 ['11,aa,18,mn', '22,bb,16,fn'] 将列表中的每一项数据转换为对象 student(stu_id, name, age, gender) '11,aa,18,mn'.strip() ----->'11,aa,18,m'.split() ------>[11,aa,18,m]
代码优化:
- 用try except 捕获异常来处理没有打开文件用私有属性、私有方法来防止外部访问
[外链图片转存中…(img-cEE4Ohuk-1647751188506)]
[外链图片转存中…(img-Ob8WIBts-1647751188507)]
因此,把那些方法做成私有方法


![python中列表[0:10:-2]什么意思(python基础班课件) python中列表[0:10:-2]什么意思(python基础班课件)](http://www.mshxw.com/aiimages/31/772759.png)
