Loading

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
'''
posted @ 2021-12-03 10:15  maju  阅读(32)  评论(0)    收藏  举报