目录
前课复习
程序的控制结构
一、程序的分支结构
1、单分支结构
2、二分支结构
3、多分支结构
4、条件判断及组合
5、程序的异常处理
总结
二、实例5:身体质量指数BMI
1、问题分析
2、思路1:分别计算并给出国际和国内BMI分类
3、思路2:混合计算并给出国际和国内BMI分类
4、举一反三
三、程序的循环结构
1、遍历循环:保留字 for in 构成
2、无限循环(条件循环):保留字 while
3、循环控制保留字:break 和 continue
4、循环的高级用法(通过else给奖励)
总结
四、模块3:random库的使用
1、基本随机数函数
2、扩展随机数函数
五、实例6:圆周率的计算
1、公式计算
2、蒙特卡罗方法计算
3、举一反三
分支结构是根据判断条件结果而选择不同向前路径的运行方式
guess = eval(input())
if guess == 99:
print("猜对了")
判断条件可以直接使用真假来表示,只要见到 if True,后面的语句就会被执行
if True:
print("条件正确")
根据条件判断的不同而选择不同执行路径的一种结构
guess = eval(input())
if guess == 99:
print("猜对了")
else:
print("猜错了")
if True:
print("语句块1")
else:
print("语句块2") # 事实上这部分永远不会被执行
二分支结构除了简单的 if else 之外,还需知道一种紧凑形式
当条件成立了返回表达式1的信息,当条件不成立else后的表达式2被执行
guess = eval(input())
print("猜{}了".format("对" if guess == 99 else "错"))
上例中的 “对” “错” 都是表达式,而不是带等号的赋值形式
根据多个条件来选择不同语句块运行的一种分支结构
例:对不同分数分级的问题
score = eval(input())
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
print("输入成绩属于级别{}".format(grade))
分支语句中需要大量的条件判断,Python提供了一些操作符来对条件进行判断,并产生真或假的结果
除了操作符之外,Python 也提供了三个用来对条件进行组合的保留字
guess = eval(input())
if guess>99 or guess<99:
print("猜错了")
else:
print("猜对了")
if not True: # 表达假的逻辑,即False
print("语句块2") # 永远不会被执行
else:
print("语句块1") # 只会执行语句块1
try:
num = eval(input("请输入一个整数:"))
print(num**2)
except:
print("输入不是整数")
try:
num = eval(input("请输入一个整数:"))
print(num**2)
except NameError:
print("输入不是整数")
异常处理的高级使用方法
# CalBMIv1.py(国际)
# 用户输入是多元素,建议采用逗号隔开
height,weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]:"))
bmi = weight /pow(height,2)
print("BMI数值为:{:.2f}".format(bmi))
who = ""
if bmi < 18.5:
who = "偏瘦"
elif 18.5 <= bmi < 25:
who = "正常"
elif 25 <= bmi <30:
who = "偏胖"
else:
who = "肥胖"
print("BMI指标为:国际'{0}'".format(who))
# CalBMIv2.py(国内)
# 用户输入是多元素,建议采用逗号隔开
height,weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]:"))
bmi = weight /pow(height,2)
print("BMI数值为:{:.2f}".format(bmi))
nat = ""
if bmi < 18.5:
nat = "偏瘦"
elif 18.5 <= bmi < 24:
nat = "正常"
elif 24 <= bmi < 28:
nat = "偏胖"
else:
nat = "肥胖"
print("BMI指标为:国内'{0}'".format(nat))
# CalBMIv3.py(混合计算)
height,weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]:"))
bmi = weight /pow(height,2)
print("BMI数值为:{:.2f}".format(bmi))
who,nat = "",""
if bmi < 18.5:
who ,nat = "偏瘦" ,"偏瘦"
elif 18.5 <= bmi < 24:
who ,nat = "正常","正常"
elif 24 <= bmi < 25:
who ,nat = "正常","偏胖"
elif 25 <= bmi < 28:
who,nat = "正常","偏胖"
elif 28 <= bmi < 30:
who,nat = "偏胖","肥胖"
else:
who,nat = "肥胖","肥胖"
print("BMI指标为:国际'{0}',国内'{1}'".format(who,nat))
遍历某一个结构形成的循环运行方式
遍历循环的应用
所有 for in 这样可遍历的结构,只要后边的变量或者数据类型是一个由多个元素构成的数据类型,都可以使用 for in 的方式遍历其中的每一个元素,并且根据元素的个数形成相应的循环
由条件控制的循环运行方式
continue 例子
遍历一个字符串,如果这个字符串中出现了T,就不打印T,否则打印其他的所有字符出来在当次循环体执行时,如果遇到了continue保留字,当次循环就结束,去做下一次循环
break 例子
遇到break,整个循环结束。若程序有两层或更多层循环,break该怎么办呢?
# 最开始给出一个字符串,每次循环将字符串的最后一个字符去掉,打印出字符串
s = "PYTHON"
# 双层循环
while s != "": # 若字符串s不是空字符串
for c in s: # 将字符串中的每一个字符拿出来
print(c,end="")
s = s[:-1] # 去掉s的最后一个字符
一个break保留字仅跳出当前的最内层循环,若有多层循环嵌套,它只跳出内层,外层循环仍然有效
# 取出一个字符串,只要遇到T就停止遍历,将字符串的最后一位去掉,再去遍历,遇到T还停止遍历
s = "PYTHON"
# 双层循环
while s != "": # 若字符串s不是空字符串
for c in s: # 将字符串中的每一个字符拿出来
if c== "T":
break # 仅跳出当前最内层循环(一个break只能跳出一层循环)
print(c,end="")
s = s[:-1] # 去掉s的最后一个字符
通过else的扩展,能够知道一段循环中是否被break结束
# 无break语句,循环结束后,将打印出正常退出的这段代码
for c in "PYTHON":
if c == "T":
continue
print(c,end="")
else:
print("正常退出")
# 有break,else部分的正常退出语句就不会被执行
for c in "PYTHON":
if c == "T":
break
print(c,end="")
else:
print("正常退出")
也可以不给种子, 直接调用 random 也可以产生随机数,此时默认的种子是当前调用第一次random函数所对应的系统时间
为什么要给种子?
在random库中,最基本的是seed和random函数,除此之外,random库提供了常用的六个扩展随机数函数
代码:
# CalPiV1.py(通过公式计算圆周率的值)
pi = 0
N = 100 # 假设无穷大是N(100)
for k in range(N):
'''若写一段代码特别长,在一行中无法表达,
可以在这段代码中增加\,使代码进行换行,换行后还可以再使用\再进行换行,
且换行之后的代码,它的功能与写在一行是一致的'''
pi += 1/pow(16,k)*( \
4/(8*k+1) - 2/(8*k+4) - \
1/(8*k+5) - 1/(8*k+6))
print("圆周率值是:{}".format(pi))
蒙特卡罗方法(撒点):圆周率本身就是一个圆形,相对于一个正方形来说,相当于圆的面积除以正方形的面积,这个面积之商与圆周率有关系
代码:
# CalPiV2.py(通过蒙特卡罗方法计算圆周率的值)
from random import random
from time import perf_counter # perf_counter函数能够对程序运行进行计时
DARTS = 1000*1000 # 当前在区域中抛撒点的总数量,为100万
hits = 0.0 # 目前在圆的内部的点的数量
start = perf_counter() # 当前系统时间的一个值,启动计时
# 循环撒点的过程,可以描述为一次遍历循环的过程
for i in range(1,DARTS+1): # 对所有点进行抛撒
x,y = random(),random() # 使用x,y变量生成两个随机数的坐标值,random函数返回的是0-1之间的小数值
dist = pow(x**2+y**2,0.5) # 使用这个点到圆心的距离判断其是否在圆内
if dist <= 1.0: # 这个点在圆的内部
hits = hits+1 # 经过撒点之后,在圆的内部出现的点的数量
pi = 4* (hits/DARTS)
print("圆周率值是:{}".format(pi))
print("运行时间是:{:.5f}s".format(perf_counter()-start))
未用公式,只用计算机、随机方式就可以计算pi