05 Python 程序的控制结构

程序的分支结构

单分支结构

根据判断条件结果而选择不同向前路径的运动方向

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库的计时方法获得程序运行时间
  • 改变撒点数量,理解程序运行时间的分布

计算问题扩展

  • 求解特定图形的面积
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值