【Python中while循环】

一、深拷贝、浅拷贝

1、需求

1)拷贝原列表产生一个新列表
2)想让两个列表完全独立开(针对改操作,读的操作不改变)
要满足上述的条件,只能使用深拷贝

2、如何拷贝列表

1)直接赋值

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

执行结果

/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()

实现方式🔽

# 定义一个列表
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]))

执行结果

/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。
但复制的数据类型可变时,会产生一个新的地址空间

# 2)深拷贝import copylist1 = ['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]))

执行结果🔽

/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、样式

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

代码块

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

执行结果

/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、死循环与效率问题

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

4、循环应用

1)for循环

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

for 变量 in 可迭代对象:循环体 

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

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

2)while循环

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

count =0
while count <5:print(count)count+=1

进阶使用:验证用户账号密码是否正确,给出对应的提示;若验证失败,需要启动循环让用户可以一直输入
**☝🏻第一步:**先实现账号密码验证逻辑正常

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

🔽执行结果

#验证成功时
/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实现循环

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

🔽执行结果

#验证失败时(符合预期)
/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,等到下次循环判断条件时才会生效

# 终止循环
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("代码会继续执行到这里")

🔽执行结果

# 验证成功时(符合预期)
/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

如何使用方式一来满足验证成功就不循环执行,验证不成功就循环执行呢
只需要把结束循环的条件赋值修改语句换个位置就好了

# 终止循环
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("代码会继续执行到这里")

🔽执行结果

# 验证成功时(符合预期)
/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,终止最内部的循环

🔽执行结果

# 验证成功时(符合预期)
/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条件判断的方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/62048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音短视频矩阵源代码部署搭建流程

抖音短视频矩阵源代码部署搭建流程 1. 硬件准备 需确保具备一台性能足够的服务器或云主机。这些硬件设施应当拥有充足的计算和存储能力&#xff0c;以便支持抖音短视频矩阵系统的稳定运行。 2. 操作系统安装 在选定的服务器或云主机上安装适合的操作系统是关键步骤之一。推…

JVM中TLAB(线程本地分配缓存区)是什么

JVM中TLAB&#xff08;线程本地分配缓存区&#xff09;是什么 简单来说 TLAB&#xff0c;线程本地分配缓存区&#xff0c;是在 Java 堆内存中的一块线程专属的内存区域&#xff0c;每个线程在创建对象时&#xff0c;首先会尝试在自己的 TLAB 区域内分配内存&#xff0c;这样多…

kmeans 最佳聚类个数 | 轮廓系数(越大越好)

轮廓系数越大&#xff0c;表示簇内实例之间紧凑&#xff0c;簇间距离大&#xff0c;这正是聚类的标准概念。 簇内的样本应该尽可能相似。不同簇之间应该尽可能不相似。 目的&#xff1a;鸢尾花数据进行kmeans聚类&#xff0c;最佳聚类个数是多少&#xff1f; plot(iris[,1:4…

day04 企业级Linux安装及远程连接知识实践

1. 使用传统的网卡命名方式 在启动虚拟机时&#xff0c;按tab键进入编辑模式 添加命令&#xff1a; net.ifnames0 biosdevname0 这样linux系统会使用传统的网卡命名&#xff0c;例如eth0、eth1…… 2. 快照 做系统关键操作时&#xff0c;一定要使用快照(先将系统关机) 3.…

unity中Rigidbody组件的其他属性和方法

Rigidbody组件的其他属性和方法 velocity和angularVelocityRigidbodyConstraintsSleep和WakeUpClosestPointOnBoundsOnJointBreakCollisionDetectionModeSweepTest和SweepTestAllIsSleeping velocity和angularVelocity velocity:刚体的线速度&#xff0c;类型为Vector3,可以直…

STM32C011开发(2)----nBOOT_SEL设置

STM32C011开发----2.nBOOT_SEL设置 概述硬件准备视频教学样品申请源码下载参考程序自举模式BOOT0设置配置 nBOOT_SEL生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32CubeProgrammer (STM32CubeProg) 是一款用于编程STM32产品的全功能多操作系统软件工…

编译以前项目更改在x64下面时报错:函数“PVOID GetCurrentFiber(void)”已有主体

win32下面编译成功&#xff0c;但是x64报错 1>GetWord.c 1>md5.c 这两个文件无法编译 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(24125,1): error C2084: 函数“PVOID GetCurrentFiber(void)”已有主体 1>C:\Program Files (x…

onvif协议相关:3.1.5 Digest方式获取预置位

背景 关于onvif的其实很早之前我已经在专栏中写了不少了, 使用onvif协议操作设备 但最近有陆陆续续的粉丝问我, 希望我在写一些关于 onvif的设备自动发现、预置位跳转、云台操作的博客。 满足粉丝的需求,安排。 今天我们来实现 获取预置位 准备工作 我们这里的话选择Diges…

5.Feign与ReflectiveFeign

前言 Feign对象作为feign框架的启动门户, 提供构建和运行框架的统一入口, 也是feign框架的核心组件之一 核心逻辑 Feign类结构 public abstract class Feign {public static Builder builder() {return new Builder();}// 获取方法唯一标识public static String configKey(…

docker 通过Dockerfile自定义的镜像部署Springboot项目

一、镜像结构介绍&#xff1a; 镜像&#xff1a;层&#xff08;Layer&#xff09;添加安装包、依赖、配置等&#xff0c;每一次操作都形成新的一层&#xff1b;基础镜像&#xff08;BaseImage&#xff09;应用依赖的系统函数库、环境、配置、文件等&#xff1b;入口&#xff0…

【Canvas与图标】GUI图标

【成图】 120*120的png图标 各种大小图&#xff1a; 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>GUI图标 Draft1</titl…

Spring Boot 整合 ELK 全面指南:实现日志采集、分析与可视化

一、ELK简介 1.1 什么是ELK&#xff1f; ELK 是三个开源工具的组合&#xff1a; Elasticsearch&#xff1a;一个分布式全文搜索和分析引擎&#xff0c;用于存储和查询日志数据。Logstash&#xff1a;一个数据处理管道工具&#xff0c;用于收集、解析和处理日志数据。Kibana&…

数据库编程(sqlite3)

一&#xff1a;数据库分类 常用的数据库 大型数据库 &#xff1a;Oracle商业、多平台、关系型数据库功能最强大、最复杂、市场占比最高的商业数据库 中型数据库 &#xff1a;Server是微软开发的数据库产品&#xff0c;主要支持windows平台 小型数据库 : mySQL是一个小型关系型…

CCF GESP C++ 一级上机题(十六道题及其思路详解合集)

#include <iostream> using namespace std;int main() {// 定义起始年份、结束年份、循环变量以及用于累加的变量&#xff0c;并初始化累加变量为0int start, end, i, sum 0;// 从标准输入读取起始年份和结束年份cin >> start >> end;// 循环遍历从起始年份…

Opencv+ROS实现颜色识别应用

目录 一、工具 二、原理 概念 本质 三、实践 添加发布话题 主要代码 四、成果 五、总结 一、工具 opencvros ubuntu18.04 摄像头 二、原理 概念 彩色图像&#xff1a;RGB&#xff08;红&#xff0c;绿&#xff0c;蓝&#xff09; HSV图像&#xff1a;H&#xff0…

【linux】shell脚本

文章目录 1. jar包启动脚本1.1 方式一1.2 方式二 2. 进程关闭脚本3. 操作mysql4. impala建表语句提取5. 监控磁盘存量6. 清日志脚本7. 替换tomcat的启动端口8. 将一行数据按照空格依次读取 1. jar包启动脚本 1.1 方式一 #!/bin/sh RESOURCE_NAME/usr/local/applications/scre…

Flume和kafka的整合:使用Flume将日志数据抽取到Kafka中

文章目录 1、Kafka作为Source【数据进入到kafka中&#xff0c;抽取出来】2、kafka作为Sink 【数据从别的地方抽取到kafka里面】 1、Kafka作为Source【数据进入到kafka中&#xff0c;抽取出来】 kafka源 --> memory --> 控制台&#xff1a; a1.sources r1 a1.sinks k1…

vue3 reactive响应式实现源码

Vue 3 的 reactive 是基于 JavaScript 的 Proxy 实现的&#xff0c;因此它通过代理机制来拦截对象的操作&#xff0c;从而实现响应式数据的追踪。下面是 Vue 3 的 reactive 源码简化版。 Vue 3 reactive 源码简化版 首先&#xff0c;我们需要了解 reactive 是如何工作的&…

scala模式匹配

object test47 {def main(args: Array[String]): Unit {val id"445646546548858548648"//取出id前两位val provinceid.substring(0,2) // println(province) // if (province"42"){ // println("湖北") // }else if(province&quo…

旋转磁体产生的场 - 实验视频资源下载

先发几个视频&#xff0c;是2019年所作的实验内容 更多视频&#xff0c;到某宝找我吧。注意&#xff1a;是收费的。 20190312-180244-旋转磁体产生的场造成激光功率减小 https://download.csdn.net/download/u014161757/90038058 20190313-090956-旋转磁体产生的场对真空介电…