Python语言程序设计基础——4 程序的控制结构

四 程序的控制结构


目录

基本结构

程序流程图

Python语言程序设计基础——4 程序的控制结构

程序描述方式主要有三种,分别是自然语言,流程图,伪代码。

分支结构

单分支 if

微实例 4.4 PM2.5空气质量提醒

问题描述

目前空气质量等级以PM2.5数值划分为6级,PM2.5数值在0~35空气质量为优,3 5~75为良, 75~115为轻度污染, 115~150为中度污染, 150~250为重度污染, 250~500为严重污染,。

一个简化版的空气质量标准采用三级模式:0~35空气质量为优,3 5~75为良, 75以上为污染。

问题分析

IPO描述

输入:接受外部输入的 PM2.5 值

处理:

​ if PM2.5 值 >= 75 ,打印空气污染警告

​ if 35 <= PM2.5值 < 75 ,打印空气质量良,建议适度户外活动

​ if PM2.5值 < 35 ,打印空气质量优,建议户外活动

代码

#微实例4.4
PM = eval(input("请输入PM2.5 数值: "))
if 0 <= PM <= 35:
 print("空气优异,快去户外运动")
if 35 <= PM <= 75:
 print("空气良好,适度户外活动")
if 75 <= PM:
 print("空气污染,请小心!")

二分支结构: if-else 语句

微实例 4.5 PM2.5空气质量提醒(2

代码:

#微实例 4.5
PM = eval(input("请输入PM2.5数值: "))
if PM >= 75:
 print("空气污染,请小心!")
else:
 print("空气没有污染,可以展开户外活动")

代码:

PM = eval(input("请输入PM2.5数值: "))
print(f'空气{"存在" if PM  >=75 else "没有"} 污染!')

多分支结构: if-elif-else 语句

微实例 4.46 PM2.5空气质量提醒(3)


代码:

PM = eval(input("请输入PM2.5数值:"))
if 0<= PM <=35:
 print("空气优异,快去户外活动!")
elif 35 <= PM <= 75:
 print("空气良好,适度户外活动!")
else:
 print("空气污染,请小心!")

实例5: 身体质量指数

问题描述:

\(BMI = 体重(kg) / 身高^{2}(m^2)\)

BMI指标分类

分类 国际BMI值(\(kg/m^2\)) 国内BMI值(\(kg/m^2\))
偏瘦 <18.5 <18.5
正常 18.5 ~ 25 18.5~24
偏胖 25~ 30 24 ~ 28
肥胖 >=30 > = 28

编写一个根据身高体重计算BMI值的程序,同时输出国际和国内的BMI指标建议值。

问题分析:

IPO描述

输入:身高和体重值

处理:计算BMI值,并根据BMI指标分类找到合适类别

输出L打印指标分类信息

代码:

#示例代码5.1
height , weight = eval(input("请输入身高(m)和体重(kg)[逗号隔开]: "))
bmi = weight / pow(height,2)
print(f'BMI数值为:{bmi:.2f}')
who , dom = "", ""
# WHO标准
if bmi < 18.5:
 who = "偏瘦"
elif bmi < 25:
 who ="正常"
elif bmi <30:
 who = "偏胖"
else:
 who = "肥胖"

#我国卫生部标准
if bmi < 18.5:
 dom = "偏瘦"
elif bmi < 24:
 dom ="正常"
elif bmi <28:
 dom = "偏胖"
else:
 dom = "肥胖"

print(f'BMI指标为: 国际{who},国内{dom}')

循环结构

遍历循环 for

for <循环变量> in <遍历结构> : <语句块>

遍历结构可以是字符串,文件,组合数据类型或range()函数等,常见的使用方式如下:

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

遍历文件fi的每一行 for line in fi: <语句块>

遍历字符串s for c in s: <语句块>

遍历列表ls for item in ls: <语句块>

循环遍历还有一种扩展模式

for <循环变量> in <遍历结构>:
	<语句块1>
else:
	<语句2>

在这种扩展模式中,当for循环正常执行之后,程序会继续执行else语句中的内容。else语句只在循环征程执行并结束才执行。

for s in "BAT":
    print("循环执行中"+s)
else:
     s ="循环正常结束"
print(s)

无限循环 while

while <条件> :
	<语句块>

扩展方式

while <条件> :
	<语句块1>
else:
	<语句块2>
s , idx = "BAT" ,0
while idx < len(s):
    print("循环进行中:"+s[idx])
    idx += 1
else:
    s = "循环正常结束"
print(s)

循环保留字 break 和 continue

break 跳出当前层次循环,结束整个循环过程,不再判断执行循环的条件是否成立。

continue 用来结束当前当次循环,即跳出循环体下面尚未执行的语句,但不跳出当前循环,只结束本次循环,而不终止整个循环的执行。

for s in "PYTHON":
    if s=="T":
        continue
    print(s,end='')
    
for s in "PYTHON":
    if s=="T":
        break
    print(s,end='')

for循环和while循环中都存在一个else扩展用法。else中的语句只在一种条件下执行,即循环正常遍历了所有内容或由于条件不成立二结束循环,没有因为break或return而退出。continue保留字对else没有影响。

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

模块2:random库的使用

概述

random库次用梅森旋转算法(Mersenne Twister)生成伪随机序列,可用于除随机性要求更高的加解密算法之外的大多数工程应用。

random 库常用的随机函数 共9个

函数 描述
seed(a=None) 初始化随机数种子
random(m) 生成一个【0.0,1.0】之间的随机小数
randint(a,b) 生成一个【a,b]之间的整数
getrandbits(k) 生成一个k比特长度的随机整数
randrange(start,stop,[,step]) 生成一个【start,stop]之间以step为步数的随机整数
uniform(a,b) 生成一个【a,b]之间的随机小数
choice(seq) 从序列类型,例如列表中随机返回一个元素
shuffle(seq) 将序列类型中的元素随机排列,返回打乱后的序列
sample(pop,k) 从pop类型中随机选取k个元素,以列表类型返回

生成随机数钟子之前可以通过seed()函数指定随机数种子,随机数种子1一般是一个整数,只要种子相同,每次生成的随机数序列也相同。

思考与练习

4.18 从randon库中选取相应的函数满足下列条件。

1 随机生成100以内的10个整数

2 随机选取0到100间的奇数

3 从字符串‘abcdefghij’中随机选取4个字符

4 随机选取列表[‘apple’,’pear’,’peach’,’orange’]中的一个字符串

from random import *

print(sample(range(100),10))
while(1):
    a=randint(0,100)
    if a %2 == 1 :
        print(a)
        break
print(sample('abcdefghij',4))
print(choice(['apple','pear','peach','orange']))

实例6: \(\pi\)的计算

蒙特卡洛方法,又称随机抽样统计试验方法。当所要求解的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以通过某种‘试验’的方法,得到这种事件发生的频率,或者这个随机变量的平均值,并用它们作为问题的解。这就是蒙特卡罗法的基本思想。

蒙特卡洛求\(\pi\)的就是随机向单位正方形和圆中泡随机点,计算每个点到圆心的距离从而判断该店在园内或者圆外,用圆内的点数除以总点数就是\(\pi\)值。随机点数量越大,越充分覆盖整个圆形,计算得到的\(\pi\)值越精确。这个方法的思想是利用离散点值表示图形的面积,通过面积比例来求解\(\pi\)值。

IPO描述:

输入:抛点数

处理:计算每个点到圆心的距离,统计在圆心点的数量

输出:\(\pi\)值

代码:

# 示例代码 6.1 蒙特卡洛计算pi
from random import random
from math import sqrt
from time import clock

DARTS =10000
hits = 0.0
clock()
for i in range(1,DARTS+1):
 x ,y = random() , random()
 dist = sqrt(x**2 + y**2)
 if dist <= 1.0:
     hits = hits + 1
pi = 4 * (hits / DARTS)
print(f'Pi值是{pi}')
print(f'运行时间是:{clock():5.5} s')

异常处理

try-except

num=eval(input("请输入一个整数: "))
print(num)

Python异常信息含义说明

Python语言程序设计基础——4 程序的控制结构

Python 使用· try -except语句实现异常,其基本语法格式如下

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

代码改进

try:
    num=eval(input("请输入一个整数: "))
    print(num)
except NameError:
    print("输入错误,请输入一个整数")

try except else finally

try - except 语句支持多个except语句,其语法格式如下

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

其中,第一个到第N个except语句后面都指定了异常类型,说明这些except所包含的语句块只处理这些类型的异常。最后一个except没有指定任何类型,表示它对应的语句块可以处理所有其他异常。

异常语句还可以与else和finally配合使用,语法格式如下

try:
    <语句块1>
except <异常类型1>:
    <语句块2>
else :
    <语句块3>
finally:
    <语句块4>

此处的else语句与for循环和while循环中的else一样,当try中的语句块正常执行结束且没有发生异常时,else中的语句块3执行,可以看作是对try语句块正常执行后的一种追加处理。finnally语句块,无论try语句块1是否发生异常都会执行,可以将程序执行语句块1的一些收尾工作放在这里,例如,关闭文件等。

程序练习题

4.1 猜数游戏 。从程序中预设一个0~9之间的整数,让用户输入所猜的数字,如果大于预设的数字,显示“遗憾,太大了”;小于预设的数,显示”遗憾,太小了“,如此循环,直至猜中该数字,显示“预测N次,你猜中了!”,其中N是用户输入数字的次数。

from random import *
result = randint(0,9)
count=0
while(1):
    temp = eval(input("请输入数字"))
    count = count+1
    if (temp<result):
        print("遗憾,太小了")
    elif (temp>result):
        print("遗憾,太大了")
    else:
        print(f'预测{count}次,你猜中了!')
        break

4.2 统计不同字符个数。用户从键盘输入一行字符,编写一个·程序,统计并输出其中英文字符、数字、空格和其他字符的个数。

#统计不同字符
stri = input("请输入字符串:")
kong = 0
alpha = 0 
chi = 0
num = 0
other = 0
for i in stri:
    if ( i == " " ):
        kong = kong+1
    elif ('0' <= i <='9'):
        num = num+1
    elif (i >= u'\u4e00' and i<= u'\u9fa5'):
        chi = chi+1
    elif True == i.isalpha():
        alpha = alpha+1
    else:
        other=other+1
print(f'请输入的字符串中有{kong}个空格,{num}个数字,{chi}个中文,{alpha}个英文字符,{other}个其他字符')

4.3 最大公约数计算。从键盘接受两个整数,编程求这两个整数的最大公约数和最小公倍数.(提示最大公因数可以用辗转相除法,求最小公倍数则用两个数的乘积除以最大公约数即可。)

#最大公约数 最小公倍数
a,b=eval(input("请输入两个整数,中间用,隔开:"))
c=a*b

if a<b:
 a,b=b,a

while False == (a in[0,1]):
 b,a=a,b%a

c=c/b

print(f'最大公约数为:{b},最小公倍数为:{c}')

4.4 猜数字游戏。改编4.1 ,随机数范围改为0-100.

#猜数游戏 0-100整数
from random import *
result = randint(0,100)
count=0
while(1):
    try:
        temp = eval(input("请输入数字"))
        count = count+1
        if (temp<result):
            print("遗憾,太小了")
        elif (temp>result):
            print("遗憾,太大了")
        else:
            print(f'预测{count}次,你猜中了!')
            break
    except:
        print("输入有误!")

4.5 猜数游戏续。当用户输入不是整数时,给出“输入内容必须是整数”的提示,并让用户重新输入。

#猜数游戏 0-100整数
from random import *
result = randint(0,100)
count=0
tim = 0
while(1):
    try:
        temp = eval(input("请输入数字"))
        count = count+1
        if (temp<result):
            print("遗憾,太小了")
        elif (temp>result):
            print("遗憾,太大了")
        else:
            print(f'预测{count}次,你猜中了!')
            break
    except:
        print("输入有误!")

4.6 羊车门问题。有3扇关闭的门,一扇门后停着汽车,其余门后面是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门,在开启它之前,支持人会开启另一扇门,露出后面的山羊,然后允许参赛者更换自己的选择。请问:参赛者更换选择后能否增加猜中汽车的机会?——这是一个经典问题。

请使用random库对这个随机事件进行预测,分别输出参赛者改变选择和坚持选择获胜的几率。

import random
times = eval(input("请输入你希望模拟的次数: "))
pick_first_n = 0
pick_change_n = 0
for i in range(times):
    car = random.randint(0, 2) #生成哪个门后藏车
    pick_first = random.randint(0, 2) #初始随机选一个
    if pick_first == car: #如果直接选中,则初始选择正确,pick_first_n 加 1,换选择一定不中
        pick_first_n += 1
    else: #如果初始选择没中,则主持人打开另一扇没车的门后,换选择一定中
        pick_change_n += 1 #故 pick_change_n 加 1
pick_first_percent = pick_first_n / times #计算坚持不换选择的胜率
pick_change_percent = pick_change_n / times #计算换选择的胜率
print(f'如果坚持初选,胜率为{pick_first_percent *100:.2f}%')
print(f'如果改变初选,胜率为{pick_change_percent *100:.2f}%')

4.7 使用异常处理改造实例1,使其能够接受并处理用户的任何输入。

TempStr = input('请输入带有符号的温度值: ')
if TempStr[-1] in ['F','f']:
    try:
        C = (eval(TempStr[:-1]) - 32)/1.8
        print('转换后的温度是{:.2f}C'.format(C))
    except:
        print('您输入的温度格式有误! ')
elif TempStr[-1] in ['C','c']:
    try:
        F = 1.8 * (eval(TempStr[:-1])) + 32
        print('转换后的温度是{:.2f}F'.format(F))
    except:
        print('您输入的温度格式有误! ')
else:
    print('您输入的温度格式有误! ')

Python123程序练习题

#6922 整数的加减和

编写程序计算如下数列的值:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬

1-2+3-4...966‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬

其中,所有数字为整数,从1开始递增,奇数为正,偶数为负

s = 0
count = 1
while count <=966:
    if count%2 == 0:
        s -= count
    else:
        s += count
    count += 1
print(s)

#6938 水仙花数

"水仙花数"是指一个三位整数,其各位数字的3次方和等于该数本身。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬

例如:ABC是一个"3位水仙花数",则:A的3次方+B的3次方+C的3次方 = ABC。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬

请按照从小到大的顺序输出所有的3位水仙花数,请用"逗号"分隔输出结果。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

s = ""
for i in range(100, 1000):
    t = str(i)
    if pow(eval(t[0]),3) + pow(eval(t[1]),3) + pow(eval(t[2]),3) == i :
        s += f'{i},'  #s += "{},".format(i)
print(s[:-1])

#6913 用户登录的三次机会

给用户三次输入用户名和密码的机会,要求如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬

1)如输入第一行输入用户名为‘Kate’,第二行输入密码为‘666666’,输出‘登录成功!’,退出程序;‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬

2)当一共有3次输入用户名或密码不正确输出“3次用户名或者密码均有误!退出程序。”。

count = 0
while count < 3:
    name = input()
    password = input()
    if name == 'Kate'and password == '666666':
        print("登录成功!")
        break
    else:
        count += 1
        if count == 3:
            print("3次用户名或者密码均有误!退出程序。")

Python123测试题

#6912 四位玫瑰数

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬

四位玫瑰数是4位数的自幂数。自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬

例如:当n为3时,有1^3 + 5^3 + 3^3 = 153,153即是n为3时的一个自幂数,3位数的自幂数被称为水仙花数。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬

请输出所有4位数的四位玫瑰数,按照从小到大顺序,每个数字一行。

s = ""
for i in range(1000, 10000):
    t = str(i)
    if pow(eval(t[0]),4) + pow(eval(t[1]),4) + pow(eval(t[2]),4) + pow(eval(t[3]),4) == i :
        print(i)

#5158 100以内素数之和

描述

求100以内所有素数之和并输出。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬

素数指从大于1,且仅能被1和自己整除的整数。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬

提示:可以逐一判断100以内每个数是否为素数,然后求和。

#Prime
def is_prime(n):
    for i in range(2,n):
        if n%i == 0:
            return False
    return True
sum = 0
for i in range(2,100):
    if is_prime(i):
        sum += i
print(sum)
上一篇:Python进阶|聊聊异常处理


下一篇:python中list.index()异常的解决