循环语句之 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)
示意流程图
死循环
不以外力终止就会无限循环的循环,被认为是死循环。一个操作系统或是一款APP开启后,都要维持一定的效果(显示、跑内存等)直到关闭。
break 跳出、continue 跳过
break
将跳出最近的一层循环,是循环的终止。
continue
将跳过某次循环过程。
案例
死循环的应用
蒙特卡罗方法计算圆周率
Monte Carlo method 是一种通过无限多的样本下,概率逼近真实值的办法。于是计算圆周率可模拟如下:
- 一个边长为 2 2 2 的正方形内切一个圆,在正方形区域内撒细小沙粒,其落入内切圆中的概率为 π 4 \frac{\pi}4 4π 。
- 重复 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 。
- 模拟时,建立坐标系如下:
- 使用两个 ( − 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} 10−6 ,即精确到 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;