【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条件判断的方式

相关推荐
cdut_suye9 分钟前
C++11新特性探索:Lambda表达式与函数包装器的实用指南
开发语言·数据库·c++·人工智能·python·机器学习·华为
weixin_5436628611 分钟前
BERT的中文问答系统36-1
人工智能·python·bert
weixin_4314708613 分钟前
人名分类器(nlp)
人工智能·pytorch·python·深度学习·自然语言处理
桃园码工17 分钟前
第一章:Go 语言概述 1.什么是 Go 语言? --Go 语言轻松入门
开发语言·后端·golang
努力更新中24 分钟前
Python浪漫之画一个音符♪
开发语言·python
泰山小张只吃荷园30 分钟前
期末Python复习-输入输出
java·前端·spring boot·python·spring cloud·docker·容器
Mr_Xuhhh32 分钟前
程序地址空间
android·java·开发语言·数据库
凤枭香42 分钟前
Python Selenium介绍(二)
开发语言·爬虫·python·selenium
疯狂吧小飞牛43 分钟前
C语言解析命令行参数
c语言·开发语言
z202305081 小时前
linux之调度管理(13)- wake affine 唤醒特性
java·开发语言