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("无效的操作,请重新输入")
        

总结

分支结构和循环结构非常重要,是构造程序逻辑的基础,是增强自己逻辑思路的方法,一定需要大量的练习来达到融会贯通。
上述案例中最后两个练习,如果可以熟练的写出来,那么分支和循环结构就已经掌握了。

Logo

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

更多推荐