Python学习系列 - 条件分支、循环结构
非常详细的介绍了Python的条件分支和循环结构以及各种案例练习
Python学习系列 - 分支、结构
第一章 初始 Python
第二章 认识 Python 变量、类型、运算符
第三章 认识 条件分支、循环结构
文章目录
前言
迄今为止,我们编写的代码都是一行一行依次执行的,这种代码称之为线性结构。仅是线性结构是无法解决所有的问题的;
一、分支结构
应用场景:比如需要设计一个登录功能,需要输入账号和密码;这里就会产生两个分支,一个是输入正确的账号和密码登录成功,另一个是输入错误的账号和密码登录失败;这两个分支只会有一个被执行。
需要根据条件判断来决定执行某些代码时可以选择构建条件分支,在Python中,要构建分支结构可以使用if、elif和else关键字。
# 以登录功能为例,模拟只会出现两种可能的场景,1登录成功,2登录失败。
# 账号为admin,密码为123456
username = input("请输入用户名:")
password = input("请输入口令:")
if username == "admin" and password == "123456":
print("身份验证成功")
else:
print("身份验证失败")
# 以学生分数设定范围评分功能为例,模拟会出现多种可能的的场景
# 按照不同的分数设定了评分范围,并使用多重条件判断和嵌套
name = input("请输入你的姓名:")
score = int(input("请输入你的成绩:"))
if score >= 90:
print("你真优秀!")
elif score >= 80:
print("你真不错!")
elif score >= 70:
print("表现良好,继续加油")
elif score >= 60:
print("你很危险!")
elif score < 60:
print("不及格!")
if name == "张三":
print(name, "你让我很失望!")
else:
print("我需要联系你的家长联系一下!")
二、循环结构
应用场景:我们在写代码的时候,一定会遇到希望某一条指令或者某一块代码重复执行的场景,例如想要打印1000遍“我爱你”,不能真的要写1000个print函数吧;某一个行为需要重复的去做,这种情况就需要使用循环结构。
1.for in 循环
如果明确的知道循环执行的次数,推荐使用for-in循环;例如打印1000遍“我爱你”;
被for-in循环控制的语句块也是通过缩进的方式来构造的,这一点跟分支结构完全相同。
range(1000):可以用来产生0到1000范围内的整数,需要注意的是取不到1000。
range(1, 1001):可以用来产生1到1001范围内的整数,相当于前面是闭区间后面是开区间。
range(1, 1001, 2):可以用来产生1到1001范围内的奇数,其中2是步长,即每次递增的值。
range(1000, 0, -2):可以用来产生1000到1范围内的偶数,其中-2是步长,即每次递减的值。
for i in range(1000):
print("第" + str(i) + "次:我爱你") # 会打印1000次
# 因为range默认从0开始计数,如果需要从1开始计数,需要指定起始数和终止数
for i in range(1, 1001):
print("第" + str(i) + "次:我爱你") # 会打印1000次
# range函数还有另外一个参数,叫“步长”,也就是每几次执行一次循环
for i in range(1, 1001, 2):
print("第" + str(i) + "次:我爱你") # 会打印500次,其中i是奇数
2.while 循环
如果要构造不知道具体循环次数的循环结构,推荐使用while循环;
while循环通过一个能够产生bool值的表达式来控制循环,当表达式的值为True时则继续循环,当表达式的值为False时则结束循环。
下面我们通过一个“猜数字”的小游戏来看看如何使用while循环。
"""
猜数字游戏的规则是:
计算机出一个1到100之间的随机数,
玩家输入自己猜的数字,计算机给出对应的提示信息(大一点、小一点或猜对了),
如果玩家猜中了数字,计算机提示用户一共猜了多少次,游戏结束,否则游戏继续。
"""
import random
# 产生一个1-100范围的随机数
answer = random.randint(1, 100)
counter = 0
# while True 代表死循环,使用时需要给定跳出循环的条件
while True:
counter += 1
number = int(input('请输入: '))
if number < answer:
print('大一点') # 猜错了,重新进入循环
elif number > answer:
print('小一点') # 猜错了,重新进入循环
else:
print('恭喜你猜对了!')
break # 猜对了,使用break关键字跳出循环
# 当退出while循环的时候显示用户一共猜了多少次
print(f'你总共猜了{counter}次')
3.continue 和 break
上面的代码中使用while True构造了一个条件恒成立的循环,也就意味着如果不做特殊处理,循环是不会结束的,这也就是常说的“死循环”。
为了在用户猜中数字时能够退出循环结构,我们使用了break关键字,它的作用是提前结束循环。
需要注意的是,break只能终止它所在的那个循环,这一点在使用嵌套循环结构时需要引起注意。
除了break之外,还有另一个关键字是continue,它可以用来放弃本次循环后续的代码直接让循环进入下一轮。
4.循环嵌套
和分支结构一样,循环结构也是可以嵌套的,也就是说在循环中还可以构造循环结构。
# 通过嵌套的循环来输出一个乘法口诀表(九九表)
for i in range(1, 10):
for j in range(1, i + 1):
print(f'{i}*{j}={i * j}', end='\t')
print()
"""
在上面的代码中,
外层循环用来控制一共会产生9行的输出,而内层循环用来控制每一行会输出多少列。
内层循环中的输出就是九九表一行中的所有列,所以在内层循环完成时,
有一个print()来实现换行输出的效果。
"""
三、案例练习
1.矩阵图
打印一个 9 * 9 的矩阵
for i in range(1, 10):
for j in range(1, 10):
print(f"{i}{j}", end="\t")
print()
"""输出如下:
11 12 13 14 15 16 17 18 19
21 22 23 24 25 26 27 28 29
31 32 33 34 35 36 37 38 39
41 42 43 44 45 46 47 48 49
51 52 53 54 55 56 57 58 59
61 62 63 64 65 66 67 68 69
71 72 73 74 75 76 77 78 79
81 82 83 84 85 86 87 88 89
91 92 93 94 95 96 97 98 99
"""
2.计算最公约数
两个数的最大公约数是两个数的公共因子中最大的那个数;两个数的最小公倍数则是能够同时被两个数整除的最小的那个数。
x = int(input('x = '))
y = int(input('y = '))
for factor in range(x, 0, -1):
if x % factor == 0 and y % factor == 0:
print(f'{x}和{y}的最大公约数是{factor}')
print(f'{x}和{y}的最小公倍数是{x * y // factor}')
break
3.百钱百鸡
百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?翻译成现代文是:公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?
# 假设公鸡的数量为x,x的取值范围是0到20
for x in range(0, 21):
# 假设母鸡的数量为y,y的取值范围是0到33
for y in range(0, 34):
z = 100 - x - y
if 5 * x + 3 * y + z // 3 == 100 and z % 3 == 0:
print(f'公鸡: {x}只, 母鸡: {y}只, 小鸡: {z}只')
4.打印100以内的素数
说明:素数指的是只能被1和自身整除的正整数(不包括1)。
for num in range(2, 100):
# 假设num是素数
is_prime = True
# 在2到num-1之间找num的因子
for factor in range(2, num):
# 如果找到了num的因子,num就不是素数
if num % factor == 0:
is_prime = False
break
# 如果布尔值为True在num是素数
if is_prime:
print(num)
5.CRAPS赌博游戏
CRAPS赌博又称花旗骰,是美国拉斯维加斯非常受欢迎的一种的桌上赌博游戏。该游戏使用两粒骰子,玩家通过摇两粒骰子获得点数进行游戏。简化后的规则是:玩家第一次摇骰子如果摇出了7点或11点,玩家胜;玩家第一次如果摇出2点、3点或12点,庄家胜;玩家如果摇出其他点数则玩家继续摇骰子,如果玩家摇出了7点,庄家胜;如果玩家摇出了第一次摇的点数,玩家胜;其他点数玩家继续摇骰子,直到分出胜负。
from random import randint
"""
Craps赌博游戏
我们设定游戏开始时玩家有1000元的赌注
游戏结束的条件是玩家破产(输光所有的赌注)
"""
money = 1000
while money > 0:
print(f'你的总资产为: {money}元')
go_on = False
# 下注金额必须大于0小于等于玩家总资产
while True:
debt = int(input('请下注: '))
if 0 < debt <= money:
break
# 第一次摇色子
# 用1到6均匀分布的随机数模拟摇色子得到的点数
first = randint(1, 6) + randint(1, 6)
print(f'\n玩家摇出了{first}点')
if first == 7 or first == 11:
print('玩家胜!\n')
money += debt
elif first == 2 or first == 3 or first == 12:
print('庄家胜!\n')
money -= debt
else:
go_on = True
# 第一次摇色子没有分出胜负游戏继续
while go_on:
go_on = False
current = randint(1, 6) + randint(1, 6)
print(f'玩家摇出了{current}点')
if current == 7:
print('庄家胜!\n')
money -= debt
elif current == first:
print('玩家胜!\n')
money += debt
else:
go_on = True
print('你破产了, 游戏结束!')
6.ATM机存取款
说明:
模拟ATM存取款机器功能:
如果选择存款,则将用户输入的金额保存到内存,如多次存款需要累加;
如果选择取款,则需要判断余额是否大于等于取款金额,条件成立可以取款,多次取款需要追减;
如果选择查询,则展示余额
如果选择退出,则终止程序
# 定义账户余额
balance = 0
# 循环询问用户操作,直到用户输入“exit”退出程序
while True:
# 显示操作菜单
print("请选择操作(存款/取款/查询余额/退出):")
print("1. 存款")
print("2. 取款")
print("3. 查询余额")
print("4. 退出")
# 获取用户输入的操作类型和金额
operation = input("请输入操作编号:")
# 判断用户的操作选择,只有功能1和2需要输入金额
if operation in ("1", "2"):
amount = float(input("请输入金额:"))
else:
amount = 0
# 判断用户选择的操作类型并执行相应的操作
if operation == "1":
# 存款
balance += amount
print(f"存款成功,您的新的余额为:{balance}")
elif operation == "2":
# 取款
if balance >= amount:
balance -= amount
print(f"取款成功,您的新余额为:{balance}")
else:
print("余额不足,取款失败")
elif operation == "3":
# 查询余额
print("您的余额为:", balance)
elif operation == "4":
# 退出程序
print("谢谢使用,再见!")
break
else:
# 无效的操作,提示用户重新输入
print("无效的操作,请重新输入")
总结
分支结构和循环结构非常重要,是构造程序逻辑的基础,是增强自己逻辑思路的方法,一定需要大量的练习来达到融会贯通。
上述案例中最后两个练习,如果可以熟练的写出来,那么分支和循环结构就已经掌握了。

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)