程序的分支结构
单分支结构
根据判断条件结果而选择不同向前路径的运动方向
if <条件>:
<语句块>
单分支实例
guess = eval(input())
if guess == 99:
print("猜对了")
if True:
print("条件正确")
二分支结构
根据判断条件结果而选择不同向前路径的运动方式
if <条件>:
<语句块1>
else:
<语句块2>
二分支实例
guess = eval(input())
if guess == 99:
print("猜对了")
else:
print("猜错了")
if True:
print("语句块1")
else:
print("语句块2")
紧凑形式
<表达式1>if<条件>else<表达式2>
guess = eval(input())
print("猜{}了".format("对"if guess == 99 else "错"))
注意:只支持表达式形式,不支持赋值
多分支结构
if <条件>:
<语句块1>
elif:
<语句块2>
…………
else:
<语句块n>
#ScoreClass.py
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))
#ScoreClass1.py
score = eval(input())
if score < 70:
grade = "D"
elif score < 80 :
grade = "C"
elif score < 90:
grade = "B"
elif score <= 100:
grade = "A"
print("输出成绩等级:{}".format(grade))
三元运算符
max = a if a>b else b
a if a>b else ( c if c>d else d )
程序分支结构 条件判断
操作符
操作符 | 数学符号 | 描述 |
---|---|---|
< | < | 小于 |
<= | ≤ | 小于等于 |
>= | ≥ | 大于等于 |
> | > | 大于 |
== | = | 等于 |
!= | ≠ | 不等于 |
用于条件组合的三个保留字
操作及应用 | 描述 |
---|---|
x and y | 两个条件x和y逻辑与 |
x or y | 两个条件x和y逻辑或 |
not x | 条件x的逻辑非 |
guess = eval(input())
if guess > 99 or guess < 99:
print("猜错了")
else:
print("猜对了")
if nor True:
print("语句块2")
else:
print("语句块1")
异常处理
异常处理的基本使用
try: try:
<语句块1> <语句块1>
except: except:<异常类型>
<语句块2> <语句块2>
示例-1
try:
num = eval(input("请输入一个整数:"))
print(num**2)
except:
print("输入不是整数")
示例-2
try:
num = eval(input("请输入一个整数:"))
print(num**2)
except NameError: #标注异常类型后,仅响应该异常
print("输入不是整数") #异常类型名字等同于变量
异常处理的高级使用
try:
<语句块1>
except:
<语句块2>
else: #else对应语句块3在不发生异常时执行
<语句块3>
finally: #finally对应语句块4一定执行
<语句块4>
实例5
#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组成,完整遍历所有元素后结束
- 每次循环,所获得元素放入循环变量,并执行一次语句块
计数循环(N次)
for i in range(N):
<语句块>
- 遍历由range()函数产生的数字序列,产生循环
>>> for i in range(5):
print("Hello:",i)
Hello: 0
Hello: 1
Hello: 2
Hello: 3
Hello: 4
计数循环(特定次)
for i in range(M,N,K):
<语句块>
>>> for i in range(1,6,2):
print("Hello",i)
Hello 1
Hello 3
Hello 5
字符串遍历循环
for c in s: #s是字符串,遍历字符串每个字符,产生循环
<语句块>
>>> for c in "niudaohong":
print(c,end=",")
n,i,u,d,a,o,h,o,n,g,
列表遍历循环
for item in ls: #ls是一个列表,遍历其每个元素,产生循环
<语句块>
>>> for item in [123,"PY",456]:
print(item,end=",")
123,PY,456,
>>> [0.0 for i in range(5)] # 相当于 [0.0] * 5
[0.0, 0.0, 0.0, 0.0, 0.0]
文件遍历循环
for line in fi: #fi是一个文件标识符,遍历其每行,产生循环
<语句块>
一个文件中包含两行内容:
好好学习
天天向上
>>> for line in fi:
print(line)
好好学习
天天向上
for <循环变量> in <遍历结构>:
<语句块>
Python3 enumerate() 函数
enumerate(sequence, [start=0])
sequence -- 一个序列、迭代器或其他支持迭代对象。
start -- 下标起始位置。
seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
print(i, element)
# 输出
0 one
1 two
2 three
- 计数循环(N次)
- 计数循环(特定次)
- 字符串遍历循环
- 列表循环
- 文件遍历循环
- …………(字典,元组)
无限循环
由条件控制的循环运行方式
while <条件>:
<语句块>
- 反复执行语句开,直到条件不满足时结束
>>> while a>0:
a=a-1
print(a)
2
1
0
>>> a=3
>>> while a>0:
a=a+1
print(a)
4
5
……
CTRL+C 退出
循环控制保留字
break和continue
- break跳出并结束当前整个循环,执行循环后的语句
- contiune结束当次循环,继续执行后续次数循环
- break和continue可以与for和while循环搭配使用
>>> for c in "PYTHON":
if c =="T":
continue
print(c,end="")
PYHON
>>> for c in "PYTHON":
if c =="T":
break
print(c,end="")
PY
>>> s ="PYTHON"
>>> while s !="":
for c in s:
print(c,end="")
s = s[:-1]
PYTHONPYTHOPYTHPYTPYP
>>> s ="PYTHON"
>>> while s != "":
for c in s:
if c == "T":
break
print(c,end = "")
s = s[:-1]
PYPYPYPYPYP
循环的高级用法
循环与else
for <循环变量> in <遍历结构>: while <条件>:
<语句块1> <语句块1>
else: else:
<语句块2> <语句块2>
- 当循环没有被break语句退出时,执行else语句块
- else语句作为“正常”完成循环的的奖励
- 这里else用法与异常处理else相似
>>>
for c in "PYTHON":
if c=="T":
continue
print(c,end="")
else:
print("正常退出")
PYHON正常退出
>>>
for c in "PYTHON":
if c=="T":
break
print(c,end="")
else:
print("正常退出")
PY
random库概述
random库是使用随机数的Python标准库
- 伪随机数:采用梅森旋转算法生成的(伪)随机序列中元素
- random库主要用于生成随机数
- 使用random库:import random
- 基本随机函数: seed(),random()
- 扩展随机函数: randint(),getrandbits(),uniform(),
randrange(),choice(),shuffle()
基本随机数函数
函数 | 描述 |
---|---|
seed(a=None) | 初始化给定的随机种子,默认为当前系统时间 >>>random.seed(10) #产生种子10对应的序列 |
random() | 生成一个[0.0,1.0)之间的随机小数 >>>random.random() 0.5714025946899135 |
扩展随机数函数
函数 | 描述 |
---|---|
randint(a,b) | 生成一个[a,b]之间的整数 >>> random.randint(1,100) 55 |
randrange(m,n[,k]) | 生成一个[m,n)之间以步长为k的随机整数 >>> random.randrange(10,100,10) 80 |
getrandbits(k) | 生成一个k比特长的随机整数 >>> random.getrandbits(16) 37885 |
uniform(a,b) | 生成一个[a,b]之间的随机小数 >>> random.uniform(10,100) 11.334920142209832 |
choice(seq) | 从序列seq中随机选取一个元素 >>> random.choice([1,2,3,4,5,6,7,8,9]) 8 |
shuffle(seq) | 将序列seq中元素随机排列,返回打乱后的序列 >>> s=[1,2,3,4,5,6,7,8,9];random.shuffle(s);print(s) [3, 9, 7, 4, 1, 2, 6, 5, 8] |
需要掌握的能力
- 能够利用随机数种子产生“确定”伪随机数
- 能够产生随机整数
- 能够对序列类型进行随机操作
实例六 圆周率的计算
圆周率近似计算公式
\pi=\sum_{k=0}^\infty[\frac{1}{16^k}(\frac{4}{8k+1}-\frac{2}{8k+4}-\frac{1}{8k+5}-\frac{1}{8k+6})]
#CalPi.py
pi = 0
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))
圆周率值:3.141592653589793
蒙特卡洛方法
#CalPiV2.py
from random import random
from time import perf_counter
DARTS = 1000 * 1000 * 10
hits = 0.0
start = perf_counter()
for i in range(1,DARTS+1):
x , y = random() , random()
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))
#CalPiV2.py
from random import random
from time import perf_counter
DARTS = 1000 * 1000 * 10 #抛洒点数
hits = 0.0
start = perf_counter()
for i in range(1,DARTS+1):
x , y = random() , random()
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))
圆周率值是:3.1412872
运行时间是:11.18369s
举一反三
理解思维方法
- 数学思维: 找到公式,利用公式
- 计算思维: 抽象一个过程,用计算机自动化求解
程序运行时间分析
- 使用time库的计时方法获得程序运行时间
- 改变撒点数量,理解程序运行时间的分布
计算问题扩展
- 求解特定图形的面积