22 data while循环

循环

目标

  • 程序的三大流程
  • while 循环基本使用
  • break 和 continue
  • while 循环嵌套

01. 程序的三大流程

  • 在程序开发中,一共有三种流程方式:
    • 顺序 —— 从上向下,顺序执行代码
    • 分支 —— 根据条件判断,决定执行代码的 分支
    • 循环 —— 让 特定代码 重复 执行

在这里插入图片描述

02. while 循环基本使用

  • 循环的作用就是让 指定的代码 重复的执行

  • while 循环最常用的应用场景就是 让执行的代码 按照 指定的次数 重复 执行

  • 需求 —— 打印 5 遍 Hello Python

  • 思考 —— 如果要求打印 100 遍怎么办?

2.1 while 语句基本语法

初始条件设置 —— 通常是重复执行的 计数器

while 条件(判断 计数器 是否达到 目标次数):
    条件满足时,做的事情1
    条件满足时,做的事情2
    条件满足时,做的事情3
    ...(省略)...
    
    处理条件(计数器 + 1)

注意

  • while 语句以及缩进部分是一个 完整的代码块
第一个 while 循环

需求

  • 打印 5 遍 Hello Python
# 1. 定义重复次数计数器
i = 1

# 2. 使用 while 判断条件
while i <= 5:
    # 要重复执行的代码
    print("Hello Python")

    # 处理计数器 i
    i = i + 1

print("循环结束后的 i = %d" % i)

注意:循环结束后,之前定义的计数器条件的数值是依旧存在的

死循环

由于程序员的原因,忘记 在循环内部 修改循环的判断条件,导致循环持续执行,程序无法终止!

2.2 赋值运算符

  • 在 Python 中,使用 = 可以给变量赋值
  • 在算术运算时,为了简化代码的编写,Python 还提供了一系列的 与 算术运算符 对应的 赋值运算符
  • 注意:赋值运算符中间不能使用空格
运算符描述实例
=简单的赋值运算符c = a + b 将 a + b 的运算结果赋值为 c
+=加法赋值运算符c += a 等效于 c = c + a
-=减法赋值运算符c -= a 等效于 c = c - a
*=乘法赋值运算符c *= a 等效于 c = c * a
/=除法赋值运算符c /= a 等效于 c = c / a
//=取整除赋值运算符c //= a 等效于 c = c // a
%= (余数)赋值运算符c %= a 等效于 c = c % a
**=幂赋值运算符c **= a 等效于 c = c ** a

2.3 Python 中的计数方法

常见的计数方法有两种,可以分别称为:

  • 自然计数法(从 1 开始)—— 更符合人类的习惯
  • 程序计数法(从 0 开始)—— 几乎所有的程序语言都选择从 0 开始计数

因此,大家在编写程序时,应该尽量养成习惯:除非需求的特殊要求,否则 循环 的计数都从 0 开始

2.4 循环计算

在程序开发中,通常会遇到 利用循环 重复计算 的需求

遇到这种需求,可以:

  1. while 上方定义一个变量,用于 存放最终计算结果
  2. 在循环体内部,每次循环都用 最新的计算结果更新 之前定义的变量

需求

  • 计算 0 ~ 100 之间所有数字的累计求和结果
# 计算 0 ~ 100 之间所有数字的累计求和结果
# 0. 定义最终结果的变量
result = 0

# 1. 定义一个整数的变量记录循环的次数
i = 0

# 2. 开始循环
while i <= 100:
    print(i)

    # 每一次循环,都让 result 这个变量和 i 这个计数器相加
    result += i

    # 处理计数器
    i += 1

print("0~100之间的数字求和结果 = %d" % result)

需求进阶
  • 计算 0 ~ 100 之间 所有 偶数 的累计求和结果

开发步骤

  1. 编写循环 确认 要计算的数字
  2. 添加 结果 变量,在循环内部 处理计算结果
# 0. 最终结果
result = 0

# 1. 计数器
i = 0

# 2. 开始循环
while i <= 100:

    # 判断偶数
    if i % 2 == 0:
        print(i)
        result += i

    # 处理计数器
    i += 1

print("0~100之间偶数求和结果 = %d" % result)

03. break 和 continue

breakcontinue 是专门在循环中使用的关键字

  • break 某一条件满足时,退出循环,不再执行后续重复的代码
  • continue 某一条件满足时,不执行后续重复的代码

breakcontinue 只针对 当前所在循环 有效

在这里插入图片描述

  • 理解
    举例:一共吃5个苹果,吃完第一个,吃第二个…,这里"吃苹果"的动作是不是重复执行?
    情况一:如果吃的过程中,吃完第三个吃饱了,则不需要再吃第4个和第五个苹果,即是吃苹果的动作停止,这里就是break控制循环流程,即终止此循环。
    情况二:如果吃的过程中,吃到第三个吃出一个大虫子…,是不是这个苹果就不吃了,开始吃第四个苹果,这里就是continue控制循环流程,即退出当前一次循环继而执行下一次循环代码。

3.1 break

  • 在循环过程中,如果 某一个条件满足后不再希望循环继续执行,可以使用 break 退出循环
i = 1
while i <= 5:
    if i == 4:
        print(f'吃饱了不吃了')
        break
    print(f'吃了第{i}个苹果')
    i += 1

break 只针对当前所在循环有效

3.2 continue

  • 在循环过程中,如果 某一个条件满足后不希望执行循环代码,但是又不希望退出循环,可以使用 continue
  • 也就是:在整个循环中,只有某些条件,不需要执行循环代码,而其他条件都需要执行
i = 1
while i <= 5:
    if i == 3:
        print(f'大虫子,第{i}个不吃了')
        # 在continue之前一定要修改计数器,否则会陷入死循环
        i += 1
        continue
    print(f'吃了第{i}个苹果')
    i += 1
  • 需要注意:使用 continue 时,条件处理部分的代码,需要特别注意,不小心会出现 死循环

continue 只针对当前所在循环有效

04. while 循环嵌套

4.1 循环嵌套

  • while 嵌套就是:while 里面还有 while
while 条件 1:
    条件满足时,做的事情1
    条件满足时,做的事情2
    条件满足时,做的事情3
    ...(省略)...
    
    while 条件 2:
        条件满足时,做的事情1
        条件满足时,做的事情2
        条件满足时,做的事情3
        ...(省略)...
    
        处理条件 2
    
    处理条件 1

4.2 循环嵌套演练 —— 九九乘法表

第 1 步:用嵌套打印小星星

需求

  • 在控制台连续输出五行 *,每一行星号的数量依次递增
*
**
***
****
*****
  • 使用字符串 * 打印
# 1. 定义一个计数器变量,从数字1开始,循环会比较方便
row = 1

while row <= 5:

    print("*" * row)

    row += 1

第 2 步:使用循环嵌套打印小星星

知识点print 函数的使用做一个增强

  • 在默认情况下,print 函数输出内容之后,会自动在内容末尾增加换行

  • 如果不希望末尾增加换行,可以在 print 函数输出内容的后面增加 , end=""

  • 其中 "" 中间可以指定 print 函数输出内容之后,继续希望显示的内容

  • 语法格式如下:

# 向控制台输出内容结束之后,不会换行
print("*", end="")

# 单纯的换行
print("")

end="" 表示向控制台输出内容结束之后,不会换行

假设 Python 没有提供 字符串的 * 操作 拼接字符串

需求

  • 在控制台连续输出五行 *,每一行星号的数量依次递增
*
**
***
****
*****

开发步骤

  • 1> 完成 5 行内容的简单输出
  • 2> 分析每行内部的 * 应该如何处理?
    • 每行显示的星星和当前所在的行数是一致的
    • 嵌套一个小的循环,专门处理每一行中 的星星显示
 
row = 1
 
while row <= 5:
 
    # 每一行要打印的星星就是和当前的行数是一致的
    # 增加一个小的循环, 专门负责打印当前行中, 每一列星星的显示
    # 1. 定义一个列计数器变量
    col = 1
 
    # 2. 开始循环
    while col <= row:
        # print("%d" % row)
        print("*", end="")
 
        col += 1
 
    # print("第 %d 行" % row)
    # 这行代码的目的就是在一行星星输出完成之后, 添加换行
    print("")
 
    row += 1

第 3 步: 九九乘法表

需求 输出 九九乘法表,格式如下:

1 * 1 = 1	
1 * 2 = 2	2 * 2 = 4	
1 * 3 = 3	2 * 3 = 6	3 * 3 = 9	
1 * 4 = 4	2 * 4 = 8	3 * 4 = 12	4 * 4 = 16	
1 * 5 = 5	2 * 5 = 10	3 * 5 = 15	4 * 5 = 20	5 * 5 = 25	
1 * 6 = 6	2 * 6 = 12	3 * 6 = 18	4 * 6 = 24	5 * 6 = 30	6 * 6 = 36	
1 * 7 = 7	2 * 7 = 14	3 * 7 = 21	4 * 7 = 28	5 * 7 = 35	6 * 7 = 42	7 * 7 = 49	
1 * 8 = 8	2 * 8 = 16	3 * 8 = 24	4 * 8 = 32	5 * 8 = 40	6 * 8 = 48	7 * 8 = 56	8 * 8 = 64	
1 * 9 = 9	2 * 9 = 18	3 * 9 = 27	4 * 9 = 36	5 * 9 = 45	6 * 9 = 54	7 * 9 = 63	8 * 9 = 72	9 * 9 = 81

开发步骤

# 1.打印九行小星星
# 2.将小星星替换成列 * 行 的结果
row = 1
 
while row <= 9:
 
    col = 1
 
    while col <= row:
 
        # print("*",end="")
        print("%d * %d = %d" % (col,row,col*row), end="\t")
 
        col +=1
 
    # print("%d" % row)
    print("")
 
    row += 1
    1. 打印 9 行小星星
*
**
***
****
*****
******
*******
********
*********
    1. 将每一个 * 替换成对应的行与列相乘
# 定义起始行
row = 1

# 最大打印 9 行
while row <= 9:
    # 定义起始列
    col = 1

    # 最大打印 row 列
    while col <= row:

        # end = "",表示输出结束后,不换行
        # "\t" 可以在控制台输出一个制表符,协助在输出文本时对齐
        print("%d * %d = %d" % (col, row, row * col), end="\t")

        # 列数 + 1
        col += 1

    # 一行打印完成的换行
    print("")

    # 行数 + 1
    row += 1

字符串中的转义字符

  • \t 在控制台输出一个 制表符,协助在输出文本时 垂直方向 保持对齐
  • \n 在控制台输出一个 换行符

制表符 的功能是在不使用表格的情况下在 垂直方向 按列对齐文本

转义字符描述
\\反斜杠符号
\’单引号
\"双引号
\n换行
\t横向制表符
\r回车

05. for循环

5.1 语法

for 临时变量 in 序列:
    重复执行的代码1
    重复执行的代码2
    ......

5.2 快速体验

str1 = 'hello python'
for i in str1:
    print(i)

5.3 break

str1 = 'hello python'
for i in str1:
    if i == 'p':
        print('遇到p不打印')
        break
    print(i)

5.4 continue

str1 = 'hello python'
for i in str1:
    if i == 'p':
        print('遇到p不打印')
        continue
    print(i)

06. else

循环可以和else配合使用,else下方缩进的代码指的是当循环正常结束之后要执行的代码。

6.1 while…else

需求:老师生气了,要惩罚:连续说5遍“老师,我错了”,如果道歉正常完毕,老师就原谅我了,这个程序怎么写?

i = 1
while i <= 5:
    print('老师,我错了')
    i += 1
print('老师原谅我了...')

思考: 这个print是不是没有循环也能执行?

6.1.1 语法
while 条件:
    条件成立重复执行的代码
else:
    循环正常结束之后要执行的代码
6.1.2 示例
i = 1
while i <= 5:
    print('老师,我错了')
    i += 1
else:
    print('老师原谅我了,真开心!')
6.1.3 退出循环的方式

需求:老师生气了,要求道歉5遍:老师,我错了。道歉到第三遍的时候,老师说这一遍说的不真诚,是不是就是要退出循环了?这个退出有两种可能性:

更生气,不打算原谅,也不需要道歉了,程序如何书写?
只一遍不真诚,可以忍受,继续下一遍道歉,程序如何书写?

1.break

i = 1
while i <= 5:
    if i == 3:
        print('这遍说的不真诚')
        break
    print('老师,我错了')
    i += 1
else:
    print('老师原谅我了,真开心!')

所谓else指的是循环正常结束之后要执行的代码,即如果是break终止循环的情况,else下方缩进的代码将不执行。

2.continue

i = 1
while i <= 5:
    if i == 3:
        print('这遍说的不真诚')
        i += 1
        continue
    print('老师,我错了')
    i += 1
else:
    print('老师原谅我了,真开心!')

因为continue是退出当前一次循环,继续下一次循环,所以该循环在continue控制下是可以正常结束的,当循环结束后,则执行了else缩进的代码。

6.2 for…else

6.2.1 语法
for 临时变量 in 序列:
    重复执行的代码
    ...
else:
    循环正常结束之后要执行的代码

所谓else指的是循环正常结束之后要执行的代码,即如果是break终止循环的情况,else下方缩进的代码将不执行。

6.2.2 示例
str1 = 'hello python'
for i in str1:
    print(i)
else:
    print('循环正常结束之后执行的代码')
6.2.3 退出循环的方式

1.break终止循环

str1 = 'hello python'
for i in str1:
    if i == 'p':
        print('遇到p不打印')
        break
    print(i)
else:
    print('循环正常结束之后执行的代码')

没有执行else缩进的代码。

2.continue控制循环

str1 = 'hello python'
for i in str1:
    if i == 'p':
        print('遇到p不打印')
        continue
    print(i)
else:
    print('循环正常结束之后执行的代码')

因为continue是退出当前一次循环,继续下一次循环,所以该循环在continue控制下是可以正常结束的,当循环结束后,则执行了else缩进的代码。

总结

  • 循环的作用:控制代码重复执行
  • while语法
while 条件:
    条件成立重复执行的代码1
    条件成立重复执行的代码2
    ......
  • while循环嵌套语法
while 条件1:
    条件1成立执行的代码
    ......
    while 条件2:
        条件2成立执行的代码
        ......
  • for循环语法
for 临时变量 in 序列:
    重复执行的代码1
    重复执行的代码2
    ......
  • break退出整个循环
  • continue退出本次循环,继续执行下一次重复执行的代码
  • else

whilefor都可以配合else使用
else下方缩进的代码含义:当循环正常结束后执行的代码
break终止循环不会执行else下方缩进的代码
continue退出循环的方式执行else下方缩进的代码

<think>我们正在讨论C语言函数的递归,但用户突然询问while循环的相关信息。根据引用内容,用户提供了关于Pythonwhile循环的参考资料,但用户实际想了解的是while循环的原理、使用方法及示例。注意,用户的问题可能偏向于编程语言通用的while循环概念,但引用都是Python示例。由于用户之前的问题是关于C语言递归,而当前问题独立,我们需要专注解答while循环。 参考引用: [^1]: 介绍了while循环的基本语法、控制语句(break, continue)、死循环陷阱以及while-else结构。 [^2]: 强调while循环的用途和注意事项,特别是避免无限循环。 [^3]: 对比了do...whilewhile循环的区别。 根据用户要求,回答需要包括: 1. while循环的原理(工作原理) 2. 使用方法(语法、控制流程) 3. 示例代码 由于引用是Python的,但用户没有指定语言,而之前讨论的是C语言,因此我们将以C语言为主,同时参考引用中的通用概念,并适当对比Python(因为引用是Python)。但用户最后说“我想了解while循环相关信息”,且引用也是Python,所以可以多语言对比,但明确说明。 计划结构: 一、while循环的原理 1.1 基本概念:while循环是一种入口条件循环,先判断条件再执行循环体。 1.2 工作流程:条件测试 -> 循环体执行 -> 再次条件测试,直到条件为假。 二、while循环的使用方法(以C语言为主,对比Python) 2.1 基本语法(C语言): while (condition) { // 循环体 } 对比Pythonwhile condition: # 循环体 2.2 控制语句(break, continue) - break:立即终止循环,跳出循环体。 - continue:跳过本次循环的剩余部分,进入下一次条件判断。 2.3 避免死循环:确保循环条件最终变为假。 2.4 循环条件:可以是任意表达式,非零即真(C语言),True/False(Python)。 三、示例(给出C语言示例,同时可对比Python) 3.1 简单计数循环(1到5) 3.2 使用break和continue的示例 3.3 while循环与do-while循环的对比(根据引用[3]) 四、注意事项 4.1 死循环风险及避免方法(参考引用[1]和[2]) 4.2 初始化循环控制变量 4.3 循环条件的更新 五、while循环与do-while循环的区别(根据引用[3]) 六、与for循环的对比(参考引用[1]中第4部分) 由于用户要求生成相关问题,我们在最后提出相关问题。 注意:用户提供的引用是Python,但我们主要用C语言示例(因为用户之前是C语言递归),同时为了参考引用,可以适当给出Python示例并说明差异。 但是,用户没有指定语言,所以我们需要明确:本回答将同时使用C和Python示例,并指出差异。 另外,用户要求使用中文回答,且数学公式用LaTeX格式。 我们将按照以下步骤组织: 1. 原理部分:描述通用原理,不特定语言。 2. 语法:分别给出C和Python的语法。 3. 示例:分别用C和Python写示例(简单示例即可,避免冗长)。 4. 注意事项:通用。 开始回答: </think>### While循环详解:原理、使用方法及示例 #### 一、While循环的基本原理 while循环是一种**条件控制循环**,其核心原理是通过判断条件表达式的真假来控制循环执行流程: ```mermaid graph TD A[开始] --> B{条件判断} B -- true --> C[执行循环体] C --> D[更新循环条件] D --> B B -- false --> E[退出循环] ``` 1. **入口条件循环**:先判断条件再执行循环体(与do-while对比)[^3] 2. **动态终止**:循环次数由运行时条件决定(区别于for循环的固定次数) 3. **执行流程**: - 条件测试 → 真则执行循环体 → 更新条件 → 再次测试 - 条件初始为假时,循环体**一次都不执行**[^3] 数学表示: 设循环体执行次数为$n$,条件函数$f(x)$,则: $$n = \min\{ k \in \mathbb{N} \mid f^{(k)}(x_0) = \text{false} \}$$ #### 二、While循环的使用方法 ##### 基础语法(跨语言通用) ```cpp // C/C++/Java/C# 语法 while (condition) { // 循环体语句 // 条件更新 } ``` ```python # Python 语法 while condition: # 循环体语句 # 条件更新 ``` ##### 关键控制语句 1. **`break`** - 立即终止循环 ```c int count = 0; while (1) { // 条件永真 count++; if (count > 5) break; // 当count>5时跳出 } ``` 2. **`continue`** - 跳过本次迭代 ```python n = 0 while n < 10: n += 1 if n % 2 == 0: continue # 跳过偶数 print(n) # 仅输出奇数 ``` ##### 避免死循环的实践 1. 确保循环变量在循环体内更新 ```java int i = 0; while (i < 10) { // ✅ 安全:i在循环内更新 System.out.println(i); i++; } ``` 2. 设置安全计数器(防无限循环) ```c int safe_guard = 0; while (complex_condition()) { // ...逻辑处理... if (++safe_guard > 1000) break; // 强制终止 } ``` #### 三、经典应用示例 ##### 示例1:用户输入验证(C语言) ```c #include <stdio.h> int main() { int input; while (1) { printf("请输入1-100间的数字:"); scanf("%d", &input); if (input >= 1 && input <= 100) break; printf("输入无效!\n"); } printf("有效输入:%d\n", input); return 0; } ``` ##### 示例2:文件读取(Python) ```python file = open("data.txt", "r") while True: line = file.readline() if not line: break # 读到文件尾退出 print(line.strip()) file.close() ``` ##### 示例3:实时传感器监控(伪代码) ```javascript let temperature = 0; while (temperature < 100) { // 温度安全阈值 temperature = readSensor(); if (temperature > 80) { activateCoolingSystem(); } sleep(1000); // 每秒检测一次 } ``` #### 四、While与其他循环对比 | 特性 | while | for | do-while | |---------------|---------------|-----------------|----------------| | **检查时机** | 先判断后执行 | 先判断后执行 | 先执行后判断 | | **循环次数** | 动态可变 | 通常固定 | 至少执行1次 | | **适用场景** | 条件驱动 | 计数器驱动 | 必须执行场景 | **选择指南**: - 用`while`当循环次数未知(如:等待网络响应) - 用`for`当迭代已知集合(如:数组遍历) - 用`do-while`当需至少执行一次(如:菜单显示) #### 五、特殊用法:While-Else结构(Python特有) ```python attempts = 0 while attempts < 3: if login(): print("登录成功!") break attempts += 1 else: // 当循环正常结束(未break)时执行 print("超过尝试次数,账号锁定!") ``` #### 六、常见陷阱与解决方案 1. **死循环风险** - ✅ 确保条件变量在循环内更新 - ✅ 添加`break`安全阀(如前文计数器) - ❌ 避免硬编码`while(1)`无退出机制 2. **边缘条件错误** ```c int n = 5; while (n >= 0) { // 当n=0时仍会执行 printf("%d ", n--); } // 输出:5 4 3 2 1 0 而非仅到1 ``` 3. **性能问题** - 避免在循环条件中调用耗时函数: ```python # 错误示范(每次循环都调用) while len(get_large_list()) > 0: ... # 正确做法(缓存结果) size = len(get_large_list()) while size > 0: size -= 1 ``` > 最佳实践:复杂条件应在循环前预计算,循环内只做简单判断[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值