Python 循环语句之 while

while 循环

摘要

while 循环是Python 中最简单的循环模式,可表述为 当条件成立,则执行循环体

但众所周知,Python 中的使用 for 语句进行遍历操作是最容易的。

while 的应用更多是死循环,依靠 break 语句终止。


语法

完整语法

while 条件:
	循环体
[else:
	结束片段]  # [] 表示可选

else 结束片段

else 最后的结束片段,被执行的前提是:结束是由于条件不满足而结束。所以,在循环体中被 break 结束是不会执行结束片段的。

一个很好的用途是,释放循环中留存下来的一些变量,如临时建立的某些类对象,以释放空间。

import random

class Employee:
    def __init__(self, name, age):
        self.name = name
        self.age = age

emp_list = []
i = 0
while i < 10:
    emp = Employee(f"No.{i}", random.randint(18, 60))
    if emp.age < 35:
        emp_list.append(emp.name)	# 保留年龄 < 35 的员工
    i += 1
else:
    del emp

print(emp_list)

示意流程图

循环体
False
True
..
continue
...
break
....
In
条件
Out

死循环

不以外力终止就会无限循环的循环,被认为是死循环。一个操作系统或是一款APP开启后,都要维持一定的效果(显示、跑内存等)直到关闭。


break 跳出、continue 跳过

break 将跳出最近的一层循环,是循环的终止。

continue 将跳过某次循环过程。


案例

死循环的应用

蒙特卡罗方法计算圆周率

Monte Carlo method 是一种通过无限多的样本下,概率逼近真实值的办法。于是计算圆周率可模拟如下:

  1. 一个边长为 2 2 2 的正方形内切一个圆,在正方形区域内撒细小沙粒,其落入内切圆中的概率为 π 4 \frac{\pi}4 4π
  2. 重复 N N N 次,记录成功撒进内切圆中的次数 M M M ,概率 π 4 = M N \frac{\pi}4 = \frac{M}N 4π=NM ,即 π = 4 M N \pi = \frac{4M}N π=N4M
  3. 模拟时,建立坐标系如下:
    • 使用两个 ( − 1 , 1 ) (-1, 1) (1,1) 的随机数表示横纵坐标 ( x , y ) (x, y) (x,y)
    • 是否在内切圆内通过 x 2 + y 2 < 1 x^2 + y^2 < 1 x2+y2<1 进行判断;
    • 终止条件是次数达到 1 0 7 10^7 107 或精度接近 1 0 − 6 10^{-6} 106 ,即精确到 3.14159。

在这里插入图片描述

import random

large_num = 1e7
incircle_times = 0

i = 1
while True:
    if i > large_num:
        break
    x = 1 - 2 * random.random()
    y = 1 - 2 * random.random()
    if x * x + y * y < 1:
        incircle_times += 1
    pi = 4 * incircle_times / i
    if abs(pi - 3.141592) < 1e-6:
        break
    i += 1

if i < large_num:
    pi = 4 * incircle_times / i
    print(f"{i}次实验中,{incircle_times}次落入园内,满足精度要求:{pi}")
else:
    pi = 4 * incircle_times / large_num
    print(f"{large_num}次实验,满足次数要求:{pi}")
    
# result bellow
1741641次实验中,1367881次落入园内,满足精度要求:3.1415911775159175

跳过与跳出的区别

import random

r = []
i = 1
while i < 100:
    r.append(i)
    if i % 2:
        i = i ** random.randint(1, 4) + 1
        continue
    i += 1
    if i in [16, 45, 87]:
        print(f"{i} in [16, 45, 87] SO break")
        break
r

循环嵌套,打印乘法表

简单的九九乘法表:

i = 1
while i < 10:
    j = 1
    while j <= i:
        print(f"{j}x{i}={i*j}", end=";")
        j += 1
    print()
    i += 1

# result bellow
1x1=1;
1x2=2;2x2=4;
1x3=3;2x3=6;3x3=9;
1x4=4;2x4=8;3x4=12;4x4=16;
1x5=5;2x5=10;3x5=15;4x5=20;5x5=25;
1x6=6;2x6=12;3x6=18;4x6=24;5x6=30;6x6=36;
1x7=7;2x7=14;3x7=21;4x7=28;5x7=35;6x7=42;7x7=49;
1x8=8;2x8=16;3x8=24;4x8=32;5x8=40;6x8=48;7x8=56;8x8=64;
1x9=9;2x9=18;3x9=27;4x9=36;5x9=45;6x9=54;7x9=63;8x9=72;9x9=81;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值