3.9
本周内容
周一
- 流程控制
- while
- for
- 补充
- 短路运算
- 深浅拷贝
周二
- 基本数据类型及其内置方法
- 数字,str,列表
周三
- 元组 tuple
- 字典
- 集合
周四
- 字符编码
- 编码与解码
- 怎么不乱码:以什么编码存的,就必须以什么编码格式取
- 文件处理
- 基本流程,打开,读写,关闭
- with语法
- 操作模式
- 控制文件读写,r,w,a
- 控制文件读写内容的模式:t,b
- 操作文件的方法
- 控制文件指针的移动
- 文件修改的两种方式
周五
- 文件处理高级
回顾
- 可变不可变,is,==
- 条件:用于判断
- 比较运算
- 所有的数据类型自带布尔值(隐式布尔值):0,none,空为假,其余全为真
- 布尔值/变量为布尔值
- 逻辑运算符:and,or,not
- and,or返回最后计算结果
- 偷懒原则
- if 流程控制:
- if,elif,else
- 成员运算符
- 缩进,子代码块
正课
-
偷懒原则
-
偷懒到哪个位置,就把那个位置的值返回
-
and在运算时如果左边的条件为假,则不会计算右边的条件,直接返回左边的值:显式布尔值返回True,隐式布尔值返回值本身
10 > 3 and 0 # 返回0
-
深浅拷贝
list1 = list2
不叫拷贝:
- 则两者分隔不开,因为指向同一个内存地址,所以改list1,list2也跟着改。只读形为下没有问题
需求:
- 需求拷贝列表,产生一个新列表
- 想让两个列表完全独立开,针对的是改操作,不是读操作
如何拷贝列表:
浅拷贝
list2=list1.copy()
新开辟一个内存空间,不加区分拷贝原列表第一层的内存地址并存入新列表
- 只拷贝到第一层,新列表的内存地址是新的,但是新列表里面存的内存地址还是原来的;改变list1[0],list2[0]的值也会变
- 对原列表中的不可变类型进行改变,则原列表中指向的内存地址改变,产生了新值,故浅拷贝的列表不会改变
- 对原列表中的可变类型进行改变
- 换瓶不换酒
要想拷贝得到的原列表和新列表哦完全区分开,需要深拷贝
深拷贝
对可变类型和不可变类型加以区分
import copy
list3 = copy.deepcopy(list1)
对不可变类型,指向原地址,对可变类型产生新地址:读的时候,指向原空间,改的时候是独立的
while循环
条件循环
-
while 条件: 代码1 代码2 顶级代码
-
死循环与效率问题
io操作运行有间隔,不会烧掉cpu
纯计算无io的死循环会导致致命的效率问
-
实际上while在识别条件时,写1 比写true会稍快
-
不要写重复的代码
-
退出循环的两种方式
-
break:立刻生效,中止本层循环,下面的代码不予执行
user_name = 'deimos' user_pwd = '123' while True: ipt_user_name = input('请输入你的账号:') ipt_user_pwd = input('输入你的密码:') if ipt_user_name == user_name and ipt_user_pwd ==user_pwd: print('succ') while True: cmd = input('输入指令:') if cmd == 'quit': break print(cmd) break else:print('fail')
-
改变条件为false:运行完子代码块,下次循环判断条件生效
-
-
while + continue
结束当前循环,开始下一次循环
continue之后的同级代码永远不会运行
-
while + else
在while循环结束后,且没有被break打断,才会运行