python日记——分支循环(蒙特卡罗方法求解圆周率为例)
一、程序的分支结构
- 单分支结构:
if <条件> :执行语句 - 二分支结构:
if …else… - 多分支结构:
if …elif…elif…else… - 条件判断及组合:
操作符:<,<=,>=,>,==,!=;
保留字:x and y(逻辑与); x or y(逻辑或);not x(逻辑非)。 - 程序的异常处理:
1、异常处理的基本使用:
try:
…
except:
…
注:当程序运行产生异常时,执行except后面的语句,并且except后面可跟上异常类型,当添加异常类型时,仅响应该异常类型。
2、异常处理的高级使用:
try:
…
except:
…
else:
…
finally:
…
注:finally对应语句一定执行,else对应语句在不发生异常时执行。
二、程序的循环结构
- 遍历循环:
for <循环变量> in <遍历结构>
注:遍历结构有多种,例如列表、字符串、字典、元组、文件等,因此常用的有:计数循环、字符串遍历循环、列表遍历循环、文件遍历循环等。 - 无限循环:
while <条件>
注:在程序运行时,可通过“CTRL+C”的方式退出循环。 - 循环控制保留字:
break:跳出并结束当前整个循环,执行循环后的语句,当有多层循环时,仅跳出最内层循环;
continue:结束当次循环,继续执行后续次数循环。 - 循环的高级用法:
将循环与else语句搭配,当循环没有被break语句退出时,执行else语句块,else语句块作为“正常”完成循环的“奖励",这里的else与异常处理中的else用法相似。
三、random库的使用
- random库时使用随机数的python标准库。
- 其产生的随机数是通过梅森旋转算法生成的伪随机数。
- random库包括两类函数:
1、基本随机数函数:
seed():初始化随机数种子,默认为当前系统时间;
random():生成一个[0.0,1.0)之间的随机小数;
注:当使用随机数种子时,只要种子相同,那么产生的随机数也相同,可再现随机过程。
2、扩展随机数函数:
randint(a,b):随机产生a~b之间的整数;
randrange(a,b[,k]):生成一个m~n之间以k为步长的随机数;
getrandbits(k):生成一个k比特长的随机整数;
uniform(a,b):生成一个a~b之间的随机小数,小数点后16位;
choice(seq):从序列seq中随机选择一个元素;
shuffle(seq):将序列seq元素随机排列,返回打乱后的序列。
四、圆周率的计算
- 蒙特卡罗方法:在一个正方形中内切一个圆,通过撒点的方式计算圆周率,随机撒一个点,该点可落在圆内,也可以落在圆外,如果点的数量够多,则可通过圆内的点数与正方形内的点数的比值计算出圆周率。
- 代码如下:
import random
import time
numpoint = 1000*1000
numcircle = 0.0
rcircle = 1.0
start = time.perf_counter()
for i in range(0,numpoint+1):
x = random.random()#点的x坐标
y = random.random()#点的y坐标
if pow(x*x+y*y,0.5) < rcircle:#判断点是否在圆内
numcircle += 1
pi = 4 * (numcircle/numpoint)
print(pi)
print("运行时间:{:.2f}".format(time.perf_counter()-start))
运行结果:
注:此处的圆周率并不准确,若想得到精确的圆周率值,可增加点的数量,或者通过数学公式进行计算。
- 举一反三:
1、数学思维向计算思维的转换;
2、在程序运行时,循环一般最花费时间;
3、在工程计算中寻找蒙特卡罗方法的应用场景。
本文内容参考于北京理工大学嵩天老师相关课程