Python Class 03-程序的控制结构

本文深入讲解程序设计中的分支和循环结构,包括if、if-else、if-elif-else、for、while等语句的使用,以及异常处理try-except的机制。通过多个示例程序,如闰年判断、成绩分级、购物折扣计算等,帮助读者掌握不同场景下的流程控制技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序的分支结构

单分支结构 if

#单条件判断
s = eval(input("请输入一个整数:"))
if s % 2 == 0:
    print("%d是偶数。" % s)
#多条件判断
s = eval(input("请输入一个整数:"))
if s % 3 == 0 and s % 5 == 0:
    print("%d既能被3整除,又能被5整除。" % s)

二分支结构 if-else

s = eval(input("请输入一个整数:"))
if s % 3 == 0 and s % 5 == 0:
    print("%d既能被3整除,又能被5整除。" % s)
else:
    print("%d不能同时被3和5整除。" % s)
s = eval(input("请输入一个整数:"))
token = ""if s % 3 == 0 and s % 5 == 0 else "不"
print("{}{}能同时被3和5整除。" .format(s, token))

多分支结构 if-elif-else   成绩分级   注意逻辑先后顺序关系

score = eval(input("请输入一个百分制成绩:"))
if score >= 90.0:
    grade = 'A'
elif score >= 80.0:
    grade = 'B'
elif  score >= 70.0:
    grad = 'C'
elif grad >= 60.0:
    grad = 'D'
else:
    grad = 'E'
print("对应的五分制成绩是:{}".format(grad))

判断条件及组合 >、>=、<、<=、==、!=、and、or、not

>>> 4<5
True
>>> 'Pyhon'>'python'
False
>>> 0==False
True
>>> ''==True
False
>>> not True
False
>>> a=80
>>> (a>100)or(a>50 and a<90)
True
>>> 

示例分析1:多分支程序示例。根据月份计算该月的天数(不考虑闰年的情况)。

month = eval(input("请输入您选择的月份:"))
days = 0;
if (month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12):
    
    days = 31
elif (month == 4 or month == 6 or month == 9 or month == 11):
    days = 30
else:
    days = 28
print("{}月份的天数是{}天。".format(month, days))

示例分析2:多分支嵌套示例。例如,一个计算购书款的程序。如果有会员卡,购书5本以上,书款按7.5折结算,5本以下,按8.5折结算:如果没有会员卡,购书5本以上,书款按8.5折结算,5本以下,按9.5折结算。

flag = 1
books = 8
price = 234
actualpay = 0

if flag == 1:
    if books >= 5:
        actualpay = price * books * 0.75
    else:
        actualpay = price * books * 0.85
else:
    if books >= 5:
        actualpay = price * books * 0.85
    else:
        actualpay = price * books * 0.95
print("您的实际付款金额是:{}".format(actualpay))

小作业:
1、输人一个年份,输出是否为闰年。#闰年条件:能被4整除但不能被100整除,或者能被400整除的年份都是闰年。
2、输入三个整数,按从大到小的顺序输出。
3、输入温度t的值,判断是否适合晨练。(25<=t<=30,则适合晨练ok,否则不适合no)
4、乘坐飞机时,当乘客行李小于等于20公斤时,按每公斤1.68元收费,大于20公斤时,按每公斤1.98元收费,编程计算收费(保留2位小数)。
5、根据从键盘上输入的表示星期几的数字,对应输出它的英文名称。Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday、input  error!
6、一个最简单的计算器支持+,-,*,/四种运算。输入只有一行:两个参加运算的数和一个操作符(+,-,*,/)。输出运算表达式的结果。
考虑下面两种情况:(1)如果出现除数为0的情况,则输出:Divided by zero!  (2)如果出现无效的操作符(即不为+,-,*,/之一),则输出:Invalid operator!
输入样例:34  56  +  输出样例:90

7、期末来临了,班长小Q决定将剩余班费X元钱,用于购买若干支钢笔奖励给一些学习好、表现好的同学。已知商店里有三种钢笔,它们的单价为6元、5元和4元。小Q想买尽量多的笔(鼓励尽量多的同学),同时他又不想有剩余钱。请您编一程序,帮小Q制订出一种买笔的方案。
【分析】对于以上的实际问题,要买尽量多的笔,易知都买4元的笔肯定可以买最多支笔。因此最多可买的笔为x div 4支。由于小q要把钱用完,故我们可以按以下方法将钱用完: 若买完x div 4支4元钱的笔,还剩1元,则4元钱的笔少买1支,换成一支5元笔即可;若买完x div 4支4元钱的笔,还剩2元,则4元钱的笔少买1支,换成一支6元笔即可;若买完x div 4支4元钱的笔,还剩3元,则4元钱的笔少买2支,换成一支5元笔和一支6元笔即可。

程序的循环结构

遍历循环 for

>>> for i in "python":
	print(i)
p
y
t
h
o
n
>>> for i in range(5):
	print(i)	
0
1
2
3
4
#for循环与else
for i in 'py':
    print("循环执行中:" + i)
else:
    print("循环正常结束")

无限循环 while

>>> n=0
>>> while n<10:
	print(n)
	n=n+3	
0
3
6
9

循环示例1:将一个列表中的元素进行头尾置换,即列表中第1个元素和倒数1个元素交换,第2个元素和倒数第2个元素交换,依次进行,最后打印输出列表。

lst = [1, 3, 7, -23, 34, 0, 23, 2, 9, 7, 79]

#用while循环做翻转
head = 0
tail = len(lst) - 1
while head < len(lst) / 2:
    lst[head], lst[tail] = lst[tail], lst[head]
    head += 1
    tail -= 1
for i in lst:
    print(i, end = " ")
print()

#用for循环做翻转
tail = len(lst) - 1
n = int(len(lst) / 2)   
for i in range(0,n):
    lst[i], lst[tail-i] = lst[tail-i], lst[i]
for i in lst:
    print(i, end = " ")
print()

循环示例2:使用嵌套循环计算1!+2+...+n!。

n = eval(input("请输入正整数n:"))

#for循环嵌套
s = 0
for i in range(1, n + 1):
    t = 1
    for j in range(1, i + 1):
        t *= j
    s += t
print(s)

#while循环嵌套
s = 0
i = 1
while i <= 10:
    t = 1
    j = 1
    while j <= i:
        t *= j
        j += 1
    s += t
    i += 1
print(s)

循环当中的else语句: 

#while和else 正常循环结束执行else 如果有break也会跳过else
s, idx = 'PYTHON', 0
while idx < len(s):
    print("循环执行中:" + s[idx])
    idx += 1
else:
    print("循环正常结束")

#二重循环中的else语句:将100以内的素数加入列表
num = []
i = 2
for i in range(2, 100):
    j = 2
    for j in range(2, i):
        if i % j == 0:
            break
    else:
        num.append(i)
print(num)

循环控制 break 和 continue

#单循环 break跳出循环
while True:
    s = input("请输入一个名字(按Q退出):")
    if s == "Q":
        break
    print("输入的名字是:{}".format(s))
print("程序退出")
#多层循环,break退出最内层循环
while True:
    s = input("请输入一个名字(按Q退出):")
    if s == "Q":
        break
    for i in s:
        if i == "E":
            break
        print(i, end = " ")
print("程序退出")
#不能结束循环 跳出本次循环
for s in "PYTHON":
    if s == "Y":
        continue
    print(s, end = " ")
print("\n")

跳转示例break:求n的最大真约数。

a = eval(input("请输入一个整数:"))
i = int(a / 2)
while i > 0:
    if a % i == 0:
        break
    i -= 1
print("{}的最大真约数是:{}".format(a, i))

跳转示例continue:输入6个整数,输出输入数值中正整数之和,忽略负数。

sum = 0
for i in range(6):
    n = eval(input("请输入一个整数:"))
    if n < 0:
        continue
    sum += n
print(sum)

流程控制实例1:蒙特卡罗方法计算圆周率

import random
NUM = 10000
n = 0
for i in range(NUM):
    x = random.random() *2 - 1
    y = random.random() *2 - 1
    if ((x * x + y * y) <= 1):
        n += 1
print("PI=%.5f" % (n *4.0 / 10000))

流程控制实例2:输出数字金字塔

n = eval(input("请输入正整数n:"))
for i in range(1, n + 1):
    for j in range(1, n - i + 1):
        print(end = " ")
    for j in range(1, i + 1):
        print((i - j + 1), end = "")
    for j in range(2, i + 1):
        print(j, end = "")    
    print()

小作业:
1、输入一个整数N,并计算1到N相加的和。
2、 利用for循环,分别计算1—100中奇数的和、偶数的和。
3、利用for循环计算n!的值。
4、 求s=1 +2 +3……+n,当加到第几项时,s的值会超过1000?
5、最大公约数计算。获得两个整数,求出这两个整数的最大公约数和最小公倍数。最大公约数的计算般使用辗转相除法,最小公倍数则使用两个数的乘积除以最大公约数。
6、 编一程序求满足不等式1+ 1/2 + 1/3 …+1/n >=5的最小n值。
7、 校体操队到操场集合,排成每行2人,最后多出1人;排成每行3人,也多出1人;分别按每行排4,5,6人,都多出1人;当排成每行7人时,正好不多。求校体操队至少多少人?
8、 对于给定的自然数n(n<20),在屏幕上输出仅由“*”构成的n行的直角三角形。 例如:当n=5时,输出:
    *     
   * *
  * * *
 * * * *
* * * * *
9、百钱买百鸡问题。鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
10、 求100-999中的水仙花数。若三位数ABC,ABC=A3+B3+C3,则称ABC为水仙花数。 例如153,13+53+33=1+125+27=153,则153是水仙花数。
11、输出100—200中所有的素数。
12、输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等)。
13、把一个合数分解成若干个质因数乘积的形式(即求质因数的过程)叫做分解质因数。分解质因数(也称分解素因数)只针对合数。输入一个正整数n,将n分解成质因数乘积的形式。输入样例:36 输出样例:36=2*2*3*3
【分析】 将任意的n分解为质因数的乘积,要从最小的质数开始,那么,我们就不妨从2开始试除,能整除就输出2,再对商继续试除,直到不再含有因子2;然后用下一个质数反复试除,……,再用下一个质数试除,……,一直到商为1,停止操作。这里,质因数的递增,是一层循环,每一个质因数的反复试除,又是一层循环。因此,本题使用两层循环来解决。
14、阶乘之和,输入n,计算S=1! + 2! + 3! + … + n!的末6位(不含前导0)。n<=106, n!表示前n个正整数之积。样例输入:10     样例输出:37913

程序的异常处理  try-except

#输入异常
>>> n=eval(input("请输入一个数字:"))
请输入一个数字:python
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    n=eval(input("请输入一个数字:"))
  File "<string>", line 1, in <module>
NameError: name 'python' is not defined
#输入异常处理
try:
    n = eval(input("请输入一个数字:"))
    print("{}的3次方为:{}".format(n, pow(n, 3)))
except:
    print("输入有误,请重新输入!")
#执行异常
>>> for i in range(5):
	print(10/i,end="")	
Traceback (most recent call last):
  File "<pyshell#6>", line 2, in <module>
    print(10/i,end="")
ZeroDivisionError: division by zero
#执行异常处理
try:
    for i in range(5):
        print(10/i,end="")
except:
    print("某种原因,出错了!")
#特定错误类型处理
try:
    for i in range(5):
        print(10/i,end="")
except ZeroDivisionError:
    print("除数为零,产生除零错误!")
except:
    print("某种原因,出错了!")

实例解析——猜数字游戏

import random
target = random.randint(1, 1000)
count = 0
while True:
    guess = eval(input("请输入猜测的整数(1至1000):"))
    count += 1
    if guess > target:
        print("大了!")
    elif guess < target:
        print("小了!")
    else:
        print("对了!")
        break
print("本轮猜测的次数是:{}".format(count))
import random
target = random.randint(1, 1000)
count = 0
while True:
    try:
        guess = eval(input("请输入猜测的整数(1至1000):"))
    except:
        print("输入有误,请重新输入,本轮不计入猜测次数!")
        continue
    count += 1
    if guess > target:
        print("大了!")
    elif guess < target:
        print("小了!")
    else:
        print("对了!")
        break
print("本轮猜测的次数是:{}".format(count))

小作业:
1.猜数游戏续。当用户输人的不是整數(如字母、浮点数等)时,程序会终止执行退出。改编题目1中的序,当用户输入出错时给出“输入内容必须为整数!"的提示,并让用户重新输人。
2.羊车门问题。有三扇关闭的门,一扇门后面停着汽车,其余门后是山羊,只有主持人知道每扇门后面什么。参赛者可以选择一扇门,在开启它之前,主持人会开启另外一扇门,露出门后的山羊,然后允许参赛者更换自己的选择。请问:参赛者更换选择后能否增加猜中汽车的机会?一这是 一个经典问题。请使用random库对这个随机事件进行预测,分别输出参赛者改变选择和坚持选择获胜的概率。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宏阳李老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值