补day06
可变类型:比喻瓶子里装水,换水不换瓶,一种容器类型。
不可变类型:是一个不可分割的整体,如name="egon",不能说name="e"
短路运算(偷懒原则,偷懒到那个位置,就把当前的值返回)
10>3 and true -----true#要算到第二个
10<3 and true------false#只用算到第一个
10>3 and 10 and 0 and 10-------0#算到第三个,返回第三个的值
10>3 and 10----10#算到第二个,返回第二个的值
(10>3 and 10 and 0 and 10) or (10>3 and 1==1)-----false or true -----true#先算and ,算到后面才能停止
一,深浅copy之浅copy
1.1
list1=['egon','lxx',[1,2]]
list2=list1#这叫赋值不叫copy
此时两者不可分割,list1改list2也会跟着修改,因为指向的是同一个内存地址
1.2 需求:
1,拷贝一下原列表产生一个新列表
2,想让两个列表完全独立开来,针对的是改操作而不是读操作
1.3 如何copy列表
1.3.1浅copy
把原列表第一层的内存地址不加区分,完全copy一份给新列表
对于可变类型,任然可以改变可变类型中包含的值,但浅copy中可变类型的内存地址不变
list1=['egon','lxx',[1,2]]
list3=list1.copy
list1[0]='EGON'
list1[1]='LXX'
list1[2][0]='111'
list1[2][1]='222'
print(list1)-------['EGON','LXX',[111,222]]
print(list3)------['egon','lxx',[111,222]] #浅copy的话把原列表的第一层内存地址复制下来,即使list1赋新值,产生了新的内存地址,list3复制的原来第一层内存地址,不可变类型顺着原列表第一层的内存地址不会变,但是可变类型会顺着第一层的内存地址找到第二层内存地址里list1可变类型所改的值,所以可变类型会变。
想要copy得到的新列表与原列表的改操作完全独立开来,必须有一种区分可变类型与不可变类型的copy机制,就是深copy
1.3.2深copy
import copy
list1=['egon','lxx',[1,2]]
list4=copy.deepcopy(list1)
list1[0]='EGON'
list1[1]='LXX'
list1[2][0]='111'
list1[2][1]='222'
print(list1)-------['EGON','LXX',[111,222]]
peint(list4)-----['egon','lxx',[1,2]]#独立于list1的copy,深copy会区分可变与不可变类型,不可变类型会把原列表的第一层内存地址复制下来,即使list1赋新值,产生了新的内存地址,list4复制的不可变类型的第一层内存地址,所以不可变类型不会变,但可变类型会产生一个新的内存地址,存放原列可变类型的内容(如换了一个瓶子,装原来的水),所以可变类型不会变
二,while循环(条件循环)介绍与基本使用
'''
while 条件:
代码1
代码2
代码3
'''
流程如图
count=0
while count <5
print(count)
count +=1
print('小白菜')-----------0 1 2 3 4 小白菜
三,死循环与效率问题
涉及到io问题
while True:
name=input(''your name>>>>>")
print(name)------输入名字后会继续输出your name>>>>>
纯计算无io的死循环会导致致命的效率问题
while 1:
print('xxx')------将会一直输出xxx
四,while循环的应用
use_name='egon'
password='123'
#输入错误的账号和密码需要重复
#输入对后不需要重复
while:
inp_name=input('请输入您的账号')
inp_password=input('请输入您的密码')
if inp_name == use_name and inp_password == password
print('登入成功')
else:
print('请重新输入账号')------账号输入小程序
五, 退出循环的两种方式
方式一:将条件改为false
tag=True
while tag:
inp_name=input('请输入您的账号')
inp_password=input('请输入您的密码')
if inp_name == use_name and inp_password == password
print('登入成功')
tag=false #下面的代码还会运行,等到下次循环判断条件才生效
else:
print('请重新输入账号')
print('=====end====')
方式二:break(只要运行到break就会立刻终止本层循环)
tag=True
while tag:
inp_name=input('请输入您的账号')
inp_password=input('请输入您的密码')
if inp_name == use_name and inp_password == password
print('登入成功')
break #立刻终止本层循环
else:
print('请重新输入账号')
print('=====end====')------这行代码就不会运行了
六, while的嵌套
方式一:
'''#每一层都需要配套的break
while True:
whileTrue:
whileTrue:
break
break
break
'''
方式二:
'''
tag=True
while tag:
while tag:
while tag:
tag=false#结束循环
'''
方式一的案例
tag=True
while tag:
inp_name=input('请输入您的账号')
inp_password=input('请输入您的密码')
if inp_name == use_name and inp_password == password
print('登入成功')
while True:
cmd=input'输入命令:'
if cmd=='q'
break
print('命令{x}正在运行' .format(x=cmd))
break #立刻终止本层循环
else:
print('请重新输入账号')
方式二的案例:
tag=True
while tag:
inp_name=input('请输入您的账号')
inp_password=input('请输入您的密码')
if inp_name == use_name and inp_password == password
print('登入成功')
while True:
cmd=input'输入命令:'
if cmd=='q'
tag=false
else:
print('命令{x}正在运行' .format(x=cmd))
else:
print('请重新输入账号')
七,while+continue :
结束本次循环,直接进入下一次
#强调:在continue之后添加同级代码毫无意义,因为不会执行
跳过4,打印0,1,2,3,5
count=0
while count <6
if count == 4
count +=1
countinue
#count +=1#放这里哒mei
print(count)
count+=1
八, while+else
while True:
....
else:
print('else包含的代码会在while循环结束后,并且while循环是在没有被break打断的情况下正常结束,才会运行')
实现输错三次,停止运行,并且有提示语提示
版本一
count=0 tag=True while tag: if count == 3: print('输错三次退出') break inp_name=input('请输入您的账号:') inp_pwd=input('请输入您的密码:') if inp_name == username and inp_pwd == password: print('登录成功') while tag: cmd=input("输入命令>: ") if cmd == 'q': tag=False else: print('命令{x}正在运行'.format(x=cmd)) else: print('账号名或密码错误') count+=1
版本二:优化
count=0 while count < 3: inp_name=input('请输入您的账号:') inp_pwd=input('请输入您的密码:') if inp_name == username and inp_pwd == password: print('登录成功') while True: cmd=input("输入命令>: ") if cmd == 'q': # 整个程序结束,退出所有while循环 break else: print('命令{x}正在运行'.format(x=cmd)) break else: print('账号名或密码错误') count+=1 else: print('输错3次,退出')