跳转至

流程控制语句

add_circle2025-03-02update2025-03-03

1. 前置知识

1.1 表达式

表达式(Expression)是指由数据、标记符或数据、标记符与运算符组合而成的代码片段。本身不执行任何操作,只是计算出一个结果值,它可以被嵌入到代码语句或代码块中使用。

  • 表达式可以是由单独的标记符或数据组成的代码片段,例如:aname100-1[1, 2, 3]
  • 表达式也可以是由标记符、数据与运算符组合而成的代码片段,例如:-aage += 1True > Falsedata = [1, 2, 3]

1.2 代码语句

代码语句(Statement,简称:语句 )是构成程序的最小执行单位,由一个或多个表达式组成,以换行\n表示语句结束,表示一个单独的操作单元,用于执行一个的具体任务或功能的操作。表达式的计算结果通常是交给语句来完成后续操作。

代码语句在Python中根据不同的操作方式、不同的作用可以分为多个不同种类:

1.2.1 表达式语句

表达式语句:对一个或多个表达式的结果做进一步处理的语句,通常用于执行一些简单的操作,如打印输出、获取输入、变量的简单赋值等.

print(1 > 2)  # 打印表达式的结果
input("请输入您的密码:")  # 获取用户输入
x += 1  # 对变量进行自增操作

1.2.2 流程控制语句

流程控制语句:使用一个或多个表达式作为判断条件,控制程序的执行流程的语句。程序代码通常默认是自上而下,从左往右执行的,但是通过流程控制语句,我们可以改变程序的默认执行顺序。而根据执行顺序的不同,我们还可以把流程控制语句划分出多个子类:

1.2.2.1 分支语句

if 语句:根据条件执行不同的代码块。

if x > 0:
    print("x is positive")
elif x == 0:
    print("x is zero")
else:
    print("x is negative")

match语句:根据给出的表达式,进行选项匹配。

match x:
    case 0:
        print("x is zero")
    case 1:
        print("x is one")
    case _:
        print("x is something else")
1.2.2.2 循环语句

for 循环:用于遍历序列类型(如列表、元组、字符串等)数据的所有成员。

for i in range(5):
    print(i)

while 循环:根据条件重复执行代码块。

while x > 0:
    print(x)
    x -= 1
1.2.2.3 跳转语句

break 语句:用于立即退出当前循环语句。

for i in range(10):
    if i == 5:
        break
    print(i)

continue 语句:用于跳过当前循环的剩余部分,继续下一次循环。

for i in range(10):
    if i % 2 == 0:
        continue
    print(i)

return 语句:用于从函数中返回指定数据(通常是执行结果)到调用处,并退出函数结构。

def add(a, b):
    return a + b

1.2.3 结构定义语句

用于定义程序中的结构,如函数、类等.

函数定义:使用 def 关键字定义函数.

def greet(name):
    print(f"Hello, {name}!")

定义:使用 class 关键字定义类.

class Person:
    def __init__(self, name):
        self.name = name

1.2.4. 异常处理语句

用于捕获和处理程序中可能出现的异常/错误。

try-except 语句:捕获和处理异常.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Cannot divide by zero")

finally 子句:无论是否发生异常,都会执行的代码块.

try:
    file = open('file.txt', 'r')
except FileNotFoundError:
    print("File not found")
finally:
    file.close()

1.2.5 上下文管理语句

用于管理资源的上下文,确保资源在使用后正确关闭.

with 语句:自动管理资源的上下文.

with open('file.txt', 'r') as file:
    content = file.read()

1.2.6 关键字语句

pass 语句:空语句,用于占位,通常在需要一个语句但不需要执行任何操作时使用。

if x > 0:
    pass

del 语句:用于删除对象或变量.

del x

globalnonlocal 语句:用于声明变量的作用域。

global x
nonlocal y

assert 语句:断言,检查条件是否为真。用于判断语句结构的输入和输出过程中涉及到的数据是否符合预期,常见于测试方面。

assert x > 0, "x must be positive"

1.3 代码块

代码块(Block)是由1组代码语句组成的代码集合,用于组织和封装一组相关性的代码语句形成一个整体逻辑单元,这个整体逻辑单元中的语句要么一起被执行,要么一起不执行,Python中使用英文冒号:+4个空格缩进来表示一组代码语句处于同一个代码块。

if age > 18:
    print("age大于18。")
    print("该用户已成年。")

一个代码文件(模块)也是一个代码块,我们一般称之为文件代码块或顶级代码块。

num: int = 10
age += 10
print(age)

代码块是可以嵌套的,通过不同缩进作为区分。外层叫父级代码块或父代码块,内层叫子级代码块或子代码块。

a: int = 10
b: int = 5

def add(num1: int, num2: int):
    print(f"{num1=}, {num2=}")
    return num1+num2

print(add(a, b))

2. 流程控制语句

在上面我们了解到,流程控制语句是用来控制程序中代码的执行顺序,开发人员可以通过使用流程控制语句让程序实现更丰富的逻辑以及更强大的功能。

几乎所有编程语言都有流程控制语句,功能也都基本相似。

有了流程控制语句,计算机程序的执行流程可以分成三种结构语句:顺序语句、分支语句、循环语句。

2.1 顺序语句

顺序语句是程序中默认的执行流程结构语句,表示同一个代码块中的语句默认是从上至下,逐行执行。

image-20250104212412660

代码示例:

print("User:Who are you?")
print("System:I'm moluo.")
print("System:Welcome to Python.")
# 从上到下依次执行,每条语句固定执行一次。

顺序结构语句的程序虽然能解决计算、输出等功能,但是固定执行1次,不能实现判断、选择、重复执行等功能。

2.2 分支语句

在程序中,如果有部分代码有时候不希望被执行的话,就可以使用分支语句来完成。

对于要先做判断再选择的问题就要使用分支结构来编写代码。

2.2.1 条件分支语句

2.2.1.1 单分支语句

语法格式:

if 条件表达式:
    代码块

image-20250104211822384

代码示例:假设root用户的密码是"123",编写一个程序让用户通过键盘输入账号与密码,并判断。如果正确,则提示“登陆成功。”,“欢迎回来,root用户。”

username: str = input("账号:")
password: str = input("密码:")

if username == "root" and password == "123":  # 条件表达式的结果为布尔值
    print("登陆成功。")
    print("欢迎回来,root用户。")  # 强烈建议使用四个缩进

print("程序结束")

注意:

对于初学者而言,代码编写完以后,建议使用IDE的debug模式来仔细理解自己编写的代码是如何在计算机内部完成这个过程的。特别是判断与循环,是后续编写所有程序的最重要的一块基石。

image-20250105115400486

image-20250105115941727

2.2.1.2 双分支语句

双分支语句,顾名思义,二条分支二选一执行。

语法格式:

if 条件表达式:
    代码块1
else:
    代码块2

image-20250104211950047

代码示例:假设root用户的密码是"123",编写一个程序让用户通过键盘输入账号与密码,并判断。如果正确,则提示“登陆成功。”,“欢迎回来,root用户。”。如果失败,则提示“账号或密码错误。”,“对不起,登录失败。”。

username: str = input("账号:")
password: str = input("密码:")

if username == "root" and password == "123":  # 条件表达式的结果为布尔值
    print("账号密码正确。")
    print("欢迎回来,root用户。")  # 强烈建议使用四个缩进
else:
    print("账号或密码错误。")
    print("对不起,登录失败。")

print("程序结束")
2.2.1.3 多分支语句

多分支语句,就是多个分支代码选其中一个分支执行,也叫多项巢状分支。

语法格式:

if 表达式 1:
    代码块 1
elif 表达式 2:
    代码块 2
elif 表达式 ....:
    代码块....
elif 表达式 N:
    代码块 N
else:
    代码块M

image-20250105134758953

代码示例:编写程序,让用户通过键盘录入成绩,并判断用户的成绩(1~100分之间为有效成绩)是否输入有误,如果无误则提示优秀,良好,及格与不及格。

score: str = input("请输入您的成绩:")  # "100"
score: int = int(score)  # 100

# 当成绩大于90的时候显示优秀,否则显示一般
if score > 100 or score < 0:
    print("您的输入有误!")
elif score > 90:
    print("成绩优秀")
elif score > 70:  # else if
    print("成绩良好")
elif score > 60:
    print("成绩及格")
else:
    print("成绩不及格")
2.2.1.4 语句嵌套

代码示例:编写程序,让用户通过键盘录入成绩,并判断用户的成绩(1~100分之间为有效成绩)是否输入有误,如果无误则提示优秀,良好,及格与不及格。

score: str = input("请输入您的成绩:")

if score.isdigit():
    score: int = int(score)
    if score > 100 or score < 0:
        print("您的输入有误!")
    elif score > 90:
        print("优秀")
    elif score > 70:  # else if
        print("良好")
    elif score > 60:
        print("及格")
    else:
        print("不及格")
else:
    print("请输入一个数字")

Python中除了部分关键字语句,其他所有的代码语句都支持相互嵌套,以便开发人员根据复杂的业务写出功能更加强大的代码。当然,盲目的嵌套并不可取。

2.2.1.5 三元运算符

在Python中if语句可以简写成三元运算符,用于在单行语句中实现简单的条件判断。

语法格式:

结果1 if 条件表达式 else 结果2

实例代码1:

gender: bool = True
gender_text: str = "男生" if gender else "女生"
print(gender_text)

实例代码2:

angle: int = 90
triangle: str = "直角" if angle == 90 else "锐角" if angle < 90 else "钝角"
print(triangle)

2.2.2 模式匹配语句

根据match给出的表达式进行求值,与case选项列表对值匹配。常用于判断相等的情况,比较大小的情况少见。

语法格式:

match 求值表达式:
    case 选项值1:
        代码块1
    case 选项值2:
        代码块2
    case 选项值...:
        代码块...
    case 选项值N:
        代码块N
    case _:
        代码块M

case选项列表的值可以是任意数据类型的值、标记符或条件表达式,_表示默认选项值,在所有选项列表都匹配不上时默认执行默认选项值。

image-20250105151151823

示例代码1:编写程序,编写一个根据状态码,提示用户本次访问网站的成功与失败的功能。

状态码 状态提示
200 OK
201 Created
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
status: str = input("请输入状态码:")
match status:
    case "200":
        print("OK")
    case "401" | "403":
        print("Not allowed")
    case "404":
        print("Not found")
    case _:
        print("Something Is Wrong!!!")

示例代码2:编写程序,让用户通过键盘录入成绩,并判断用户的成绩(1~100分之间为有效成绩)是否输入有误,如果无误则提示优秀,良好与不及格。

score: str = input("请输入成绩:")
if score.isdigit():
    score: int = int(score)
    match score:
        case score if score > 100 or score < 0:
            print("请输入0~100之间的成绩!")
        case score if score > 85:
            print("成绩优秀!")
        case score if score >= 60:
            print("成绩良好!")
        case _:
            print("成绩不及格!")
else:
    print("请输入一个数字作为成绩!")

2.3 循环语句

在实际开发中有许多具有规律性的重复操作,所以在程序中就需要重复执行某些语句,此时就需要使用循环语句来达成目的。Python支持 while循环和for遍历两种循环语句。在循环语句中,一组被重复执行的代码块称之为循环体,由条件表示式来决定能否重复执行。

image-20250104232348552

2.3.1 while循环

语法格式:

while 条件表达式:
    循环体
else:
    代码块 

while循环会根据条件表达式进行判断,值为True时,会一直重复执行循环体中的代码,直到条件表达式的值为False时,循环结束。

如果while后面写上else语句,在不报错的情况下,必然执行一次else的代码块。else代码块可以不写。

2.3.1.1 无限循环

无限循环就是表达式结果一直为True的循环。

基本格式:

while True:
    print("OK")  # 无限循环打印OK,这样使用没有什么意义

代码示例:编写程序,让用户通过键盘录入成绩,并判断用户的成绩(1~100分之间为有效成绩)是否输入有误,如果无误则提示优秀,良好,及格与不及格。

while True:
    score: str = input("请输入您的成绩:")

    if score.isdigit():
        score: int = int(score)
        if score > 100 or score < 0:
            print("您的输入有误!")
        elif score > 90:
            print("成绩优秀")
        elif score > 70:  # else if
            print("成绩良好")
        elif score > 60:
            print("成绩及格")
        else:
            print("成绩不及格")
    else:
        print("请输入一个数字")
2.3.1.2 有限循环

有限循环就是在重复多次执行循环体以后,表达式结果会从True变成False的循环。

代码示例1:打印从0到9之间的整数。

count: int = 0  # 初始化语句
while count < 10: # 条件判断
    print(count)
    count+=1  # 步进语句
else:
    print("while end")

代码示例2:打印十遍"hello world”。

count: int = 0  # 初始化语句
while count < 10: # 条件判断
    print("hello world")
    count+=1  # 步进语句
else:
    print("while end")

代码示例3:打印从100到1之间的所有偶数。

count: int = 100  # 初始化语句
while count > 1: # 条件判断
    print(count)
    count-=1  # 步进语句
else:
    print("while end")

2.3.2 for循环

for循环是比while循环要更加常用的循环语句,多用于遍历容器类型中的所有成员,并对这些成员进行批量的操作。

for循环在使用上比while循环要简单,不需要编写条件表达式,适合用于对容器数据的成员进行遍历操作或条件不变的有限循环操作,而while循环则适用于一些条件变化的有限循环操作或者无限循环操作中。理论上来说,for循环完全可以平替while,因此开发中看个人,哪个方便就使用哪个。

语法格式:

for 迭代变量 in 容器类型:
    循环体
else:
    代码块 

语法格式中,for语句会自动从容器类型中按序逐个读取成员(元素),并赋值给迭代变量,所以无须像while循环中那样对迭代变量进行手动赋值。

else后面的代码块是for语句结束后执行的代码块。else代码块可以不写。

实例代码1:编写程序,输出"hello world"中的每一个字符。

for i in "hello world":
    print(f"{i=}")
else:
    print("for end")

实例代码2:编写程序,输出列表中的所有成员。

for name in ["张三",'李四',"王五"]:
    print(name)

实例代码3:编写程序,输出0~9之间的整数。

for num in range(10):
    print(num)

范围类型:

range是python解释器中内置的生成等差整数列的函数,结果是一个不可变类型数据,与list/tuple等不同的是,range实际上并非Python的内置基本数据类型,而是一个我们后面所学习到的迭代器类型对象,因此我们无法通过print打印观察到具体成员,必须使用for循环或者转换成list或tuple类型才能查看具体成员。

有以下3种写法:

range(stop):生成一个[0~stop)区间,公差为1的等差整数列。

range(start, stop):生成一个[start, stop)区间,公差为1的等差整数列。

range(start, stop, step) :生成一个[start, stop)区间,公差为step的等差整数列。

itertools

itertools 是 Python解释器内置的标准库模块,提供了许多用于创建和操作迭代器的函数。这些函数可以用于高效地处理可迭代对象,如列表、元组、字符串等。

开发中,通常可以使用itertools配合for循环完成一些循环次数较多或者无限循环的操作。

2.3.3 语句嵌套

在一个循环语句中又包含另一个循环语句,称为循环嵌套。不仅for循环,while循环也能嵌套,而且还能与其他语句(例如:分支语句)进行嵌套。

for 表达式:
    for 表达式:
        循环体

while 表达式:
    while 表达式:
        循环体

image-20250106194036855

2.3.3.1 独立嵌套

示例1,要求:编写程序,使用循环在控制台上打印一个如下图所示的星号矩形。

*****
*****
*****

代码:

for i in range(3):
    for j in range(5):
        print("*",end="")
    print("")

示例2,要求:编写程序,使用循环在控制台上打印九九乘法表。

image-20250106223958313

for a in range(1,10):
    for b in range(1,10):
        print(f"{f"{a}x{b}={a * b}": ^6}", end=" ")
    print()
2.3.3.2 关联嵌套

示例1,要求:编写程序,打印一个如下图所示的三角形

*
**
***
****

代码:

for i in range(4):
    for j in range(i+1):
        print("*", end="")
    print()

扩展:现在你已经学会了循环语句,那么接下来我们接着再完成一个简单练习吧。要求:编写程序,打印一个如下图所示的图案。

☆☆☆☆☆★☆☆☆☆☆
☆☆☆☆★☆★☆☆☆☆
☆☆☆★☆☆☆★☆☆☆
☆☆★☆☆☆☆☆★☆☆
☆★☆☆☆☆☆☆☆★☆
★☆☆☆☆☆☆☆☆☆★
☆★☆☆☆☆☆☆☆★☆
☆☆★☆☆☆☆☆★☆☆
☆☆☆★☆☆☆★☆☆☆
☆☆☆☆★☆★☆☆☆☆
☆☆☆☆☆★☆☆☆☆☆

代码:

total: int = 6
for line in range(total):
    for _ in range(total-line-1):
        print("☆", end="")
    print("★", end="")
    for _ in range(line * 2 -1):
        print("☆", end="")
    if line > 0:
        print("★", end="")
    for _ in range(total-line-1):
        print("☆", end="")
    print()

for line in range(total-1):
    for _ in range(line+1):
        print("☆", end="")
    print("★", end="")
    for _ in range((total-2-line)*2-1):
        print("☆", end="")
    if line < total-2:
        print("★", end="")
    for _ in range(line+1):
        print("☆", end="")
    print()

3. 关键字语句

3.1 跳转语句

如果想提前结束循环体的重复执行,可以使用break或continue语句。

如果把一个循环语句中重复执行代码块这个操作,理解为每天在同一家公司上班的话,那么continue就是有事请假,而break就是抄了老板鱿鱼。

  • break:break语句只能用于循环语句中,可以终止循环语句,包括该语句的else语句。通常和 if 语句一起在循环中使用,即满足某个条件时便提前终止循环。
  • continue:当continue语句只能用于循环语句中,可以终止该循环中的本轮循环的代码块并跳到条件表达式中进行后续循环判断。

代码示例:编写程序,输出1~9之间的整数,并在遇到数字6或8的时候,跳过/终止当前循环。

# 编写程序,输出1~9之间的整数,并在遇到数字6或8的时候,跳过/终止当前循环。
for i in range(1, 10):
    if i == 6 or i == 8:
        # continue # 跳过
        break # 终止
    print(i)
else:
    print("循环结束")

3.2 pass

pass是表示占位,不做任何处理,是python代码块中常用的关键字语句,作用是在开发中针对部分语句如果暂时没有缩进代码的情况下避免报错。

错误示例:

if True:

print("能打印,则表示没有报错!")

正确示例:

if True
    pass
print("能打印,则表示没有报错!")

3.3 del

删除数据语句,可以用于删除标记符或容器类型数据的成员。

代码示例1:

num: int = 10
del num
print(num) # 被删除的变量,再次使用会报错。

如果使用del删除容器类型数据的成员,则默认从左往右开始逐个删除。

代码示例2:

data: list = [3,4,5,6,5,3,5]
del data[2]
print(data) # [3, 4, 6, 5, 3, 5]

4. 练习

1.编写程序,使用循环计算1-100之间偶数的累积。即:2*4*8*10*.....*100

代码:

sum: int = 1
for i in range(2, 101, 2):
    sum *= i
print(f"{sum=}")

2.编写程序,使用循环计算整数1-100的累加和。即:1+(1+2)+(1+2+3)+(1+2+3+4)+....+(1+2+...+100)=?

sum: int = 0
num: int = 100
for i in range(1, num+1):
    for j in range(1, i+1):
        sum += j
print(f"{sum=}")

3.编写程序,使用循环解决数学问题。在1500年前的《孙子算经》中记载了鸡兔同笼一题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?

image-20250106205035220

headers: int = 35
for chicken in range(1, headers+1):
    rabbit = headers - chicken
    if rabbit * 4 + chicken * 2 == 94:
        print(f"兔子:{rabbit=}, 鸡:{chicken=}")

4.编写程序,使用循环解决数学问题。在1500年前的《算经》中记载了百钱买百鸡一题:“鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?”

image-20250106211716554

for a in range(21):
    for b in range(34):
        c = 100 - a - b
        if a * 5 + b * 3 + c//3 == 100 and c %3 == 0:
            print(f"公鸡:{a}, 母鸡:{b}, 小鸡:{c}")

5.编写程序,让用户通过键盘输入账号与密码完成账号注册(记录账号和密码到变量中存储起来),并在后续代码中让用户再次输入同样的账号与密码进行登陆。

判断规则:

  • 如果登陆成功,则提示"登陆成功,欢迎回来!",并退出程序。
  • 如果登陆失败,则提示提示"账号或密码错误,您还有{errs}次重新尝试机会。",errs表示剩余错误次数,三次输错机会,用完退出程序。

代码:

# 注册阶段
reg_username: str = input("注册账号:")
reg_password: str = input("注册密码:")

# 登陆阶段
for i in range(3):
    username: str = input("登陆账号:")
    password: str = input("登陆密码:")
    if username == reg_username and password == reg_password:
        print("登陆成功,欢迎回来!")
        break
    else:
        print(f"账号或密码错误,您还有{2-i}次重新尝试机会。")

6.编写程序,打印一张如下图所示的九九乘法表。

image-20250105003450338

代码:

for a in range(1, 10):
    for b in range(1, a+1):
        print(f"{f"{a}x{b}={a*b}": ^6}", end=" ")
    print()

7.编写程序,使用循环对不同水果进行分类汇总,并统计各种水果的数量。

fruit: list = ["芒果", "苹果", "香蕉", "西瓜", "苹果", "西瓜", "苹果", "香蕉", "芒果", "香蕉", "苹果", "西瓜", "苹果", "香蕉", "西瓜", "苹果", "香蕉", "西瓜", "苹果", "西瓜"]

data: dict = {}
for i in fruit:
    # 判断i 是否在前面出现过,如果没有出现过,则表示第一次出现,我们把它记录到data中作为键,值为1
    if i not in data:
        data[i] = 1
    else:
        # 如果该水果在前面出现过,则在原来的数量上,+1
        data[i] += 1
print(data) # {'芒果': 2, '苹果': 7, '香蕉': 5, '西瓜': 6}

8.编写程序,使用循环统计字符串中各个字符出现的次数。

message: str = "hello, welcome to beijing! thanks, you are welcome."
data: dict = {}
for c in message:
    if c not in data:
        data[c] = 1
    else:
        data[c] += 1

print(data)

9.报数游戏,逢七过。

游戏规则:

从任意一个数字开始报数, 当你要报的数字包含7或者是7的倍数时都要说: 过。

编写程序,使用循环,列出1~100之间,包含7或者能被7整除的数字。

for i in range(1, 101):
    if i % 7 == 0 or '7' in str(i):
        print(i)

10.在已有代码的基础上续写程序,实现猜数游戏。

游戏规则:

随机生成一个[1,100]范围内的整数作为答案,由用户通过键盘输入猜测的生成数字。用户每猜测一次,由系统判断并提示猜测结果:“太大了!”、“太小了!”或者“猜对了!”,直到用户猜对结果或者猜测次数用完导致失败,则退出程序。 设定一个理想数字,比如:66, 让用户三次机会猜数字,如果比66大,则显示猜测的结果大了; 如果比66小,则显示猜测的结果小了; 只有等于66,显示猜测结果正确,退出程序。 最多三次都没有猜测正确,退出程序,并显示‘都没猜对,很遗憾,没有尝试次数了,下次再玩吧。

代码:

import random
answer: int = random.randint(1, 100)
timer: int = 3
for i in range(timer):
    num: int = int(input("请猜猜随机生成的数字[1-100]:"))
    if num == answer:
        print("猜对了!")
        break
    elif num > answer:
        print(f"太大了!你还有{timer-1-i}次数")
    else:
        print(f"太小了!你还有{timer-1-i}次数")
    if i == timer-1:
        print("都没猜对,很遗憾,没有尝试次数了,下次再玩吧。")

11.兔子繁殖问题。假设有一对新生的小兔子,从第3个月开始成熟,每对成熟兔子每个月都能生出一对新的小兔子。问第 n个月时,兔子的总数是多少?

image-20250106211930798

n: int = int( input("输入月份:") )
if n < 3:
    print(1)
else:
    # 前2个月的总数
    a:int = 1
    # 前1个月的总数
    b:int = 1
    for i in range(n-2):
        # # 当前月的兔子总数
        # total: int = a + b
        # # 更新下前2个月的兔子总数
        # a = b
        # # 更新下前1个月的兔子总数
        # b = total

        # 简写:
        a, b = b, a + b
    print(b)