【4】Pyhton程序的控制结构

程序的分支结构

单分支结构

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

if <条件>:
    <语句块>

二分支结构

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

if <条件>:
    <语句块1>
else:
    <语句块2>

紧凑形式:适用于简单表达式的二分支结构

<表达式1> if <条件> else <表达式2>

多分支结构

if <条件1>:
    <语句块1>
elif <条件2>:
    <语句块2>
...
else:
    <语句块n>

条件判断及组合

条件判断

操作符
< <= >= > == !=

条件组合

用于条件组合的三个保留字
and 逻辑与;or 逻辑或;not 逻辑非

程序的异常处理

异常处理的基本使用
日常使用程序放在<语句块1>,异常时执行<语句块2>

try:
    <语句块1>
except:
    <语句块2>

区分异常类型:

try:
    <语句块1>
except <异常类型>:
    <语句块2>

高级使用方法,语句块4一定执行,语句块3在不发生异常时执行:

try:
    <语句块1>
except:
    <语句块2>
else:
    <语句块3>
finally:
    <语句块4>

实例5:“身体质量指数BMI”问题

  • BMI: Body Mass Index,对身体质量进行刻画
  • 定义:BMI=体重(kg)/身高(m)^2
分类 国际标准 国内标准
偏瘦 <18.5 <18.5
正常 18.5~25 18.5~24
偏胖 25~30 24~28
肥胖 >30 >28

问题需求

  • 输入:给定身高和体重值
  • 输出:BMI指标分类信息(国际和国内)

实例讲解

思路:

  • 难点在于同时输出国际和国内对应的分类
  • 思路1:分别计算国际和国内
  • 思路2:混合计算

思路1:

#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))

思路2:

#CalBMIv2.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 <遍历结构>:
    <语句块>
  • 从遍历结构中逐一提取元素,放入循环变量中,执行语句块

计数循环n次

for i in range(N):
    <语句块>

计数循环特定次

m到n-1,步长k

for i in range(M,N,K):
    <语句块>

字符串遍历循环

for c in s:
    <语句块>
  • s是字符串,遍历字符串每个字符,产生循环

列表遍历循环

for item in ls:
    <语句块>

文件遍历循环

for line in fi:
    <语句块>

无限循环

反复执行语句块,直到语句块不满足条件

while <条件>:
    <语句块>

循环控制保留字

  • break跳出并结束当前循环,执行循环后的语句,仅跳出当前最内层循环
  • continue结束当次循环,继续执行后续循环
  • 均可与forwhile一起使用

循环的高级用法

  • else搭配
  • 当循环没有被break退出时,执行else语句块
  • else语句块作为“正常”完成循环的奖励
  • 与异常处理中的else相似
for <循环变量> in <遍历结构>:
    <语句块1>
else:
    <语句块2>
while <条件>:
    <语句块1>
else:
    <语句块2>

例:

for c in PYTHON: 
    if c == "T":
        continue
    print(c, end=='')
else:
    print("正常退出")

结果为:

PYHON正常退出

换成break

for c in PYTHON: 
    if c == "T":
        break
    print(c, end=='')
else:
    print("正常退出")

结果为:

PY

模块3:random库的使用

概述

random库是使用随机数的Python标准库
伪随机数:采用梅森螺旋算法产生的(伪)随机序列中的元素
包含两类函数,常用8个

  • 基本随机数函数:seed(),random()
  • 扩展随机数函数:randint(),getrandbits(),uniform(),randrange(),choice(),shuffle()

基本随机数函数

随机数种子

用随机数种子产生随机序列,给随机数种子,产生的随机数就定了

函数 描述
seed(a=None) 初始化给定的随机数种子,默认为系统当前时间
random() 生成一个[0.0,1.0)之间的小数

扩展随机数函数

函数 描述
randint(a,b) 生成一个[a,b]之间的整数
randrange(m,n[,k]) 生成一个[m,n)之间以k为步长的随机整数
getrandbits(k) 生成一个k比特长的随机整数
uniform(a,b) 生成一个[a,b]之间的随机小数
choice(seq) 从序列seq中随机选取一个元素
shuffle(seq) 将序列seq中元素随机排列,返回打乱之后的序列

需要掌握的能力

  • 利用随机数种子产生“确定”伪随机数
  • 能够产生随机整数
  • 能够对序列类型随机操作

实例6:圆周率的计算

圆周率的近似计算


π的近似计算公式
#CalPiV1.py
pi = 0
N = 100
for k in range(100):
    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
DARTS = 1000*1000
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))

举一反三

理解方法思维:

  • 数学思维:找到公式,利用公式求解
  • 计算思维:抽象一种过程,用计算机求解

程序运行时间分析:

  • 使用time库的计时方法获得程序运行时间
  • 改变撒点数量,理解程序运行时间的分布
  • 初步掌握简单的程序性能分析方法

计算问题的扩展

  • 求特定图形的面积
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • 程序的流程图 a程序的基本结构 程序由三种基本结构组成: 顺序结构 分支结构 循环结构 这些基本结构都有一个入口和...
    井上皓阅读 2,050评论 0 0
  • [The Swift Programming Language 中文版]本页包含内容: Swift提供了多种流程控...
    风林山火阅读 560评论 0 0
  • Swift提供了多种控制流声明。包括while循环来多次执行一个任务;if,guard和switch声明来根据确定...
    BoomLee阅读 1,939评论 0 3
  • 人们往往需要重新拾起之前为自己设定的目标,按常理,当我们为自己或他人设定新目标的时候,经验总是告诉我们,要将目标设...
    Helious阅读 415评论 0 0
  • 前一天闲来无事,就在B站把央视自己拍的唯一一个真人秀节目看了,挑的是最后一期。私心想着最后一期,按照惯例,会给观众...
    渐和阅读 411评论 0 1