day 7 while循环,深浅copy
1 while循环
1.1 循环的语法与基本使用
count=0
while count < 5: # 5 < 5
print(count) # 0,1,2,3,4
count+=1 # 5
print('顶级代码----->')
1.2 死循环与效率问题
count=0
while count < 5: # 5 < 5
print(count) # 0,1,2,3,4
while True:
name=input('your name >>>> ')
print(name)
纯计算无 io 的死循环会导致致命的效率问题
while True:
1+1
------------------
while 1:
print('xxxx')
1.3 循环的应用
username = 'egon'
password = '123'
两个问题:
1、重复代码
2、输对了应该不用再重复
while True:
inp_name=input('请输入您的账号:')
inp_pwd=input('请输入您的密码:')#
if inp_name == username and inp_pwd == password:
print('登录成功')
else:
print('账号名或密码错误')
1.4 退出循环的两种方式
方式一:将条件改为 False,等到下次循环判断条件时才会生效
tag=True
while tag:
inp_name=input('请输入您的账号:')
inp_pwd=input('请输入您的密码:')
if inp_name == username and inp_pwd == password:
print('登录成功')
tag = False # 之后的代码还会运行,下次循环判断条件时才生效
else:
print('账号名或密码错误')
方式二:break,只要运行到 break 就会立刻终止本层循环
while True:
inp_name=input('请输入您的账号:')
inp_pwd=input('请输入您的密码:')
if inp_name == username and inp_pwd == password:
print('登录成功')
break # 立刻终止本层循环
else:
print('账号名或密码错误')
1.5 while 循环嵌套与结束
1.5.1 循环结构
tag=True
while tag:
while tag:
while tag:
tag=False
--------------------------------------
**每一层都必须配一个 break**
while True:
while True:
while True:
break
break
break
1.5.2 循环嵌套的结束方式
break 的方式
while True:
inp_name=input('请输入您的账号:')
inp_pwd=input('请输入您的密码:')
if inp_name == username and inp_pwd == 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_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('账号名或密码错误')
1.5.3 while +continue:结束本次循环,直接进入下次循环
强调:在 continue 之后添加同级代码毫无意义,因为永远无法运行
count=0
while count < 6:
if count == 4:
count+=1
continue
count+=1 # 这行代码放在这里是错误的
print(count)
count+=1
1.5.4 while +else:针对 break
count=0
while count < 6:
if count == 4:
count+=1
continue
print(count)
count+=1
else:
print('else 包含的代码会在 while 循环结束后,并且 while 循环是在没有被 break 打断的情况下正常结束的,才不会运行')
应用案列:
版本 1:登录功能
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
版本 2:登录功能优化
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 次,退出')
2 深浅copy
list1=[ 'egon', 'lxx', [1,2] ]
1、二者分隔不开,list 改 list2 也跟着该,因为指向的就是同一个地址
list2=list1 # 这不叫 copy
list1[0]='EGON'
print(list2)
2、需求:
1、拷贝一下原列表产生一个新的列表
2、想让两个列表完全独立开,并且针对的是改操作的独立而不是读操作
3、如何 copy 列表
2.1 浅 copy
浅 copy:是把原列表第一层的内存地址不加区分完全 copy 一份给新列表。浅拷贝就是指向列表本身。
list1=[ 'egon', 'lxx', [1,2] ]
list3=list1.copy()
print(list3)
print(id(list1))
print(id(list3))
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))
实验 1:对于不可变类型的赋值,都是产生了新值,让原列表的索引指向新的内存地址,并不会影响新列表
实验 2:但对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变
即原列表的索引指向仍然指向原来的内存地址,于是新列表也跟着一起受影响,如下
list1[2][0]=111
list1[2][1]=222 # print(list1)
print(list3)
综合实验 1 和实验 2 可以得出,要想 copy 得到的新列表与原列表的改操作完全独立开,必须有一种可以区分开可变类型与不可变类型的 copy 机制,这就是深 copy
2.2 深 copy
import copy
list1=[ 'egon', 'lxx', [1,2] ]
list3=copy.deepcopy(list1)
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))
'''
4497919088 4498367856 4498449216
4497919088 4498367856 4498595328
'''

浙公网安备 33010602011771号