【Python中while循环】

一、深拷贝、浅拷贝

1、需求

1)拷贝原列表产生一个新列表

2)想让两个列表完全独立开(针对改操作,读的操作不改变)

要满足上述的条件,只能使用深拷贝

2、如何拷贝列表

1)直接赋值

py 复制代码
# 定义一个数组
list1=[
    "paipai",
    "3",
    [10,3]
]
# 1、使用赋值的方式,值的变动肯定是对等的
list2=list1
print(list1)
print(list2)
# 重新为list1赋值
list1[0]='achao'
print(list1)
print(list2)

执行结果

py 复制代码
/usr/local/bin/python3.8 /Users/achao/PycharmProjects/Achao/day07/深浅拷贝&while循环.py
['paipai', '3', [10, 3]]
['paipai', '3', [10, 3]]
['achao', '3', [10, 3]]
['achao', '3', [10, 3]]

Process finished with exit code 0

2)浅拷贝 xxx.copy()

实现方式🔽

py 复制代码
# 定义一个列表
list1 = [
    'paipai',
    'eat',
    [3, 12]
]
# 使用浅拷贝
list2 = list1.copy()
print(list1)
print(list2)
# 修改list1中的值但是list2中的值不会随之改变
list1[2][1] = 'chaochao'
list1[1] = 'sleep'
print(list1)
print(list2)
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list2[0]),id(list2[1]),id(list2[2]))

执行结果

py 复制代码
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/深浅拷贝.py
['paipai', 'eat', [3, 12]]
['paipai', 'eat', [3, 12]]
['paipai', 'sleep', [3, 'chaochao']]
['paipai', 'eat', [3, 'chaochao']]
4302011504 4302021232 4303476416
4302011504 4302021232 4303476416
Process finished with exit code 0

可以看出使用浅拷贝时,当修改原列表中不可变的元素(不可变类型的赋值)时,复制出的列表值是不会随之改变的,但是,如果原列表中修改的值是可变元素,那么复制出的列表值也是会随之变化的。
1)对于不可变类型的赋值:

赋值都是产生了新的值,让原列表的索引指向新的内存地址,所以并不会影响到新拷贝过去的列表
2)对于可变类型的赋值

虽然改变了可变类型中包含的值,但是整体的内存地址是不变的。新复制的列表的索引仍然指向原来的内存地址,但内存地址中存放的值的内存地址已经改变,所以大家就都变了

总结 :浅copy是把原列表第一层的内存地址不加区分完全copy一份给新列表。

原理图:

3) 深拷贝 新列表名=copy.deepcopy(要复制的列表名)

说明 :对每一层数据都做一个区分(区分对应的数据类型是否可变)

根据浅拷贝的表现。要想copy得到新列表与原列表的改操作完全独立开,必须有一种可以区分开可变类型与不可变类型的copy机制,这就是深copy。

但复制的数据类型可变时,会产生一个新的地址空间

py 复制代码
# 2)深拷贝

import copy

list1 = [
    'paipai',  # 不可变
    'eat',  # 不可变
    [3, 12]  # 可变
]
list2 = copy.deepcopy(list1)
# print(id(list1))
# print(id(list2))
# print(id(list1[0]),id(list1[1]),id(list1[2]))
# print(id(list2[0]),id(list2[1]),id(list2[2]))
print(id(list2))
print(id(list1[2][0]), id(list1[2][1]))
print(id(list2[2][0]), id(list2[2][1]))
# 修改原列表的值,可以发现只有原列表的值被改变了,copy出来的值是没有被改变的
list1[2][1] = 18
print(id(list1[2][0]), id(list1[2][1]))
print(id(list2[2][0]), id(list2[2][1]))

执行结果🔽

py 复制代码
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/深浅拷贝.py
4300084288
4296927600 4296927888
4296927600 4296927888
4296927600 4296928080
4296927600 4296927888

原理图

4)总结

深拷贝与浅拷贝最本质的区别

浅拷贝
深拷贝

二、while循环(条件循环)

1、定义

2、样式

python 复制代码
while 条件:
		代码1
		代码2
		代码3
print('循环结束开始执行其他代码')

代码块

py 复制代码
count = 0
while count < 5:
    print(count)
    count += 1
print("循环结束啦,开始执行其他代码")

执行结果

py 复制代码
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day02/while循环练习.py
0
1
2
3
4
循环结束啦,开始执行其他代码

Process finished with exit code 0

3、死循环与效率问题

py 复制代码
# 1)死循环与效率问题
count=0
while count < 5 :
		print(count) #会一直输出0
# 2)直接将条件写为真
while True:
		name=input('your name is:') #有用户交互(io)的死循环输入对终端的性能影响问题<纯计算问题
		print(name)
# 3)纯计算无io死循环问题
while True:
		print(1+1)

4、循环应用

1)for循环

遍历序列或其它可迭代对象

py 复制代码
for 变量 in 可迭代对象:
	循环体 

示例:找到一个大于3的数字,并退出循环

py 复制代码
list1=[1,2,3,4,5]
for num in list1:
	print(list)
	if num>3
		print("找到第一个大于3的数字:{num}")
		break

2)while循环

🧬 基于条件重复执行代码块
while循环在给定条件为True时才会执行循环体

python 复制代码
count =0
while count <5:
	print(count)
	count+=1

进阶使用:验证用户账号密码是否正确,给出对应的提示;若验证失败,需要启动循环让用户可以一直输入

**☝🏻第一步:**先实现账号密码验证逻辑正常

py 复制代码
name = "paipai"
password = '123'
username = input("请输入你的用户名:")
userpassword = input("请输入你的密码:")
if username==name and userpassword==password:
    print("账号密码验证通过,登录成功")
else:
    print("账号或密码输入失败,请重新登陆")

🔽执行结果

py 复制代码
#验证成功时
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:paipai
请输入你的密码:123
账号密码验证成功,可以直接登录

Process finished with exit code 0
# 验证失败时
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:KKK
请输入你的密码:hhhh
账号或密码输入失败,请重新登陆

Process finished with exit code 0

可以看到,当验证失败时,理论上用户要可以再次输入账号密码的,也就是代码要可以循环执行,此时引入while

✌🏻第二步 利用while实现循环

py 复制代码
name = "paipai"
password = '123'
while True:
    username = input("请输入你的用户名:")
    userpassword = input("请输入你的密码:")
    if username == name and userpassword == password:
        print("账号密码验证通过,登录成功")
    else:
        print("账号或密码输入失败,请重新登陆")

🔽执行结果

py 复制代码
#验证失败时(符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:123
请输入你的密码:123
账号或密码输入失败,请重新登陆
请输入你的用户名:
#验证成功时(不符合预期,用户账号密码都已经验证通过,但是仍然需要用户再次输入,当条件满足时,循环体缺少一个终止的机制)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:paipai
请输入你的密码:123
账号密码验证通过,登录成功
请输入你的用户名:

3)退出循环

方式一:将while循环的条件改为False,等到下次循环判断条件时才会生效

py 复制代码
# 终止循环
name = "paipai"
password = '123'
tag = True
while tag:
    tag = False# 本次循环中的代码会继续执行,只有在下次循环条件判断时,tag的值才发生改变
    username = input("请输入你的用户名:")
    userpassword = input("请输入你的密码:")
    if username == name and userpassword == password:
        print("账号密码验证通过,登录成功")
    else:
        print("账号或密码输入失败,请重新登陆")
    print("代码会继续执行到这里")

🔽执行结果

py 复制代码
# 验证成功时(符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:paipai
请输入你的密码:123
账号密码验证通过,登录成功
代码会继续执行到这里

Process finished with exit code 0

# 验证失败时(不符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:123
请输入你的密码:123
账号或密码输入失败,请重新登陆
代码会继续执行到这里

Process finished with exit code 0

如何使用方式一来满足验证成功就不循环执行,验证不成功就循环执行呢

只需要把结束循环的条件赋值修改语句换个位置就好了

py 复制代码
# 终止循环
name = "paipai"
password = '123'
tag = True
while tag:

    username = input("请输入你的用户名:")
    userpassword = input("请输入你的密码:")
    if username == name and userpassword == password:
        print("账号密码验证通过,登录成功")
        tag = False  # 本次循环中的代码会继续执行,只有在下次循环条件判断时,tag的值才发生改变
    else:
        print("账号或密码输入失败,请重新登陆")
    print("代码会继续执行到这里")

🔽执行结果

py 复制代码
# 验证成功时(符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:paipai
请输入你的密码:123
账号密码验证通过,登录成功
代码会继续执行到这里

Process finished with exit code 0
# 验证失败时(会继续循环提示我重新输入,符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:123
请输入你的密码:1243
账号或密码输入失败,请重新登陆
代码会继续执行到这里
请输入你的用户名:11
请输入你的密码:

方式二:break,只要运行到break就会立刻终止本层循环

在循环体内,使用控制语句来改变循环的执行流程;

  1. break,终止最内部的循环
py 复制代码

🔽执行结果

py 复制代码
# 验证成功时(符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:paipai
请输入你的密码:123
账号密码验证通过,登录成功

Process finished with exit code 0
# 验证失败时(完美符合预期)
/usr/local/bin/python3.9 /Users/yincheng/local/study/Python基础/2024-11/day07/while循环实际应用.py
请输入你的用户名:123
请输入你的密码:124
账号或密码输入失败,请重新登陆
代码会继续执行到这里
请输入你的用户名:

总结:如果while循环代码后面还需要执行其他代码,就用修改while条件判断的方式

相关推荐
东方佑9 分钟前
利用Python自动化处理PPT样式与结构:从提取到生成
python·自动化·powerpoint
孤独得猿21 分钟前
Qt常用控件第一部分
服务器·开发语言·qt
慕斯策划一场流浪27 分钟前
fastGPT—nextjs—mongoose—团队管理之团队列表api接口实现
开发语言·前端·javascript·fastgpt env文件配置·fastgpt团队列表接口实现·fastgpt团队切换api·fastgpt团队切换逻辑
橘猫云计算机设计33 分钟前
基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·考研·django·毕业设计
时光呢37 分钟前
JAVA常见的 JVM 参数及其典型默认值
java·开发语言·jvm
橙橙子23039 分钟前
c++柔性数组、友元、类模版
开发语言·c++·柔性数组
超级小的大杯柠檬水1 小时前
修改Anaconda中Jupyter Notebook默认工作路径的详细图文教程(Win 11)
ide·python·jupyter
程序媛学姐1 小时前
SpringKafka错误处理:重试机制与死信队列
java·开发语言·spring·kafka
2401_840192271 小时前
如何学习一门计算机技术
开发语言·git·python·devops
巷北夜未央1 小时前
Python每日一题(14)
开发语言·python·算法