流程控制语句是计算机编程中用于控制程序执行流程的语句。它们允许根据条件来控制代码的执行顺序和逻辑,从而使程序能够根据不同的情况做出不同的决策。流程控制实现了更复杂和灵活的编程逻辑。 主要包括下面三种:
顺序语句
顺序语句是按照编写的顺序依次执行程序中的代码。代码会按照从上到下的顺序有且仅执行一次。
分支语句
根据条件的真假来选择性地执行不同的代码块。这使得程序能够根据不同的情况做出不同的响应。
循环语句
允许重复执行一段代码,以便处理大量的数据或重复的任务。循环语句可以用于多次执行相同或类似的代码块,从而实现重复操作的需求。
1. 分支语句
双分支语句
双分支语句是一种编程结构,用于根据条件的真假选择不同的执行路径。它基于条件的结果,决定程序执行的部分。在许多编程语言中,双分支语句通常使用 if-else 语句来实现。
if 条件表达式:
# 条件表达式为True执行的语句块
# pass 语句可以占位
else:
# 条件表达式为False执行的语句块
其中,条件是一个表达式或逻辑判断,它的结果可以是 True(真)或 False(假)。
当条件为真时,执行代码块A,也称为 if 代码块;当条件为假时,执行代码块B,也称为 else 代码块。
双分支语句允许根据不同的条件结果执行不同的代码逻辑,从而实现程序的分支选择和条件判断。它是一种基本的控制流程结构,常用于处理二选一的情况。
# 案例2:根据用户输入的成绩判断其等级。如果成绩大于等于60分,则输出"及格",否则输出"不及格"。
# score = float(input("请输入成绩:"))
# if score >= 60:
# print("及格")
# else:
# print("不及格")
# 案例3: 编写一个程序,判断一个年份是否为闰年。如果是闰年,则输出"是闰年",否则输出"不是闰年"。闰年的判断条件是能够被4整除但不能被100整除,或者能够被400整除。
# year = int(input("请输入年份:"))
# if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
# print(f"{year}是闰年")
# else:
# print(f"{year}不是闰年")
# 案例4:编写一个程序,根据用户输入的三个数字,判断这三个数字是否能够构成一个等边三角形。如果能够构成等边三角形,则输出"能构成等边三角形",否则输出"不能构成等边三角形"。等边三角形的判断条件是三条边的长度相等。
# num1 = int(input("请输入一个数字"))
# num2 = int(input("请输入一个数字"))
# num3 = int(input("请输入一个数字"))
# # if num1 == num2 and num1 == num3:
# # 更好的写法
# if num1 == num2 == num1 == num3:
# print("能构成等边三角形")
# else:
# print("不能构成等边三角形")
# 案例5: 用户输入一个年龄,判断是否符合20-35
# age = int(input("请输入年龄"))
# if 20 < age < 35:
# print("符合")
# 案例6: 输入一个数字,判断是否为偶数
num = int(input("请输入一个数字"))
if num % 2 == 0:
print("偶数")
else:
print("奇数")
重点:
和其它程序设计语言(如 Java、C 语言)采用大括号“{}”分隔代码块不同,Python 采用代码缩进和冒号( : )来区分代码块之间的层次。
在 Python 中,对于类定义、函数定义、流程控制语句、异常处理语句等,行尾的冒号和下一行的缩进,表示下一个代码块的开始,而缩进的结束则表示此代码块的结束。
注意,Python 中实现对代码的缩进,可以使用空格或者 Tab 键实现。但无论是手动敲空格,还是使用 Tab 键,通常情况下都是采用 4 个空格长度作为一个缩进量(默认情况下,一个 Tab 键就表示 4 个空格)。
单分支语句
单分支语句只包含一个条件判断和一个对应的代码块。如果条件为真,执行代码块中的语句;如果条件为假,则直接跳过代码块。
# 示例:获取两个值中的较小值
# 获取两个输入值
value1 = float(input("请输入第一个值:"))
value2 = float(input("请输入第二个值:"))
# 使用单分支语句获取较小值
if value1 > value2:
value1, value2 = value2, value1
print("较小值:", value1)
多分支语句
多分支语句(if-elif-else语句)可用于在多个条件之间进行选择。
if condition1:
# 当条件1为真时执行的代码块
elif condition2:
# 当条件2为真时执行的代码块
elif condition3:
# 当条件3为真时执行的代码块
...
else:
# 当所有条件都为假时执行的代码块
案例1:成绩等级
# 案例1:根据用户输入的成绩判断其等级。
# 如果成绩[90,100],则输出"优秀"
# 如果成绩[80,90],则输出"良好"
# 如果成绩[60,80],则输出"及格"
# 如果成绩小于60,则输出"不及格"
# 如果成绩小于0或大于100,则输出"成绩有误"
score = float(input("请输入您的成绩:"))
# 版本一
if 90 <= score <= 100:
print("成绩优秀!")
elif 80 < score < 90:
print("成绩良好!")
elif 60 <= score <= 80:
print("成绩及格!")
elif 0 <= score < 60:
print("成绩不及格!")
else:
print("成绩有误")
# 版本二
if score < 0 or score > 100:
print("非法输入")
elif score >= 90:
print("成绩优秀!")
elif score >= 80:
print("成绩良好!")
elif score >= 60:
print("成绩及格!")
else:
print("成绩不及格")
注意:
python中不像其他语言使用else if,而是合成成elif了
多分支语句不一定要写 else
多分支语句是从上到下执行,最多只会执行一个分支
python中没有switch语句,但是后面用字典可以实现类似效果(其实是有的,3.10有类似的语法)
案例2:BMI测试
# 示例:计算BMI并给出健康建议
# 获取用户输入的身高和体重
height = float(input("请输入您的身高(单位:米):"))
weight = float(input("请输入您的体重(单位:千克):"))
# 计算BMI
bmi = weight / (height ** 2)
# 根据BMI给出健康建议
if bmi < 18.5:
advice = f"您的BMI为 {bmi:.3f},体重过轻,建议增加营养摄入。"
elif 18.5 <= bmi < 24:
advice = f"您的BMI为 {bmi:.3},体重正常,继续保持健康的生活方式。"
elif 24 <= bmi < 28:
advice = f"您的BMI为 {bmi:.3},体重过重,建议适当控制饮食并增加运动。"
else:
advice = f"您的BMI为 {bmi:.3},体重肥胖,建议减少高热量食物摄入并增加运动量。"
# 输出健康建议
print(advice)
注意:.3是三位有效数字,不是说保留三位小数!要保留三位小数应该用.3f。
案例3:游戏场景选择
# 场景:
# (1)怪物房: 遇到了史莱姆,并打败了它,金币加5,经验加10!
# (2) 宝箱房: 你打开了宝箱,获得了钥匙
# (3) 陷阱房: 你触发了陷阱,受到了毒箭的伤害,血值减10
# (4) 商店: 你来到了商店,购买了药水,金币减5,血值加20
import random
name = "勇士"
health = 100
coins = 0
exp = 0
# 宝箱(背包)
chest = []
print("欢迎来到地下城!")
print(f"""
当前生命值:{health}
当前经验值:{exp}
当前金币:{coins}
""")
input("按下 Enter 进入下一个房间...")
room = random.choice(["怪物房", "宝箱房", "陷阱房", "商店"])
if room == "怪物房":
print("你遇到了史莱姆,并打败了它")
exp += 10
coins += 5
print("金币加5,经验加10!")
elif room == "宝箱房":
print("你打开了宝箱,获得了钥匙")
chest.append("钥匙")
print("当前宝贝:", chest)
elif room == "陷阱房":
print("你触发了陷阱,受到了毒箭的伤害")
health -= 10
elif room == "商店":
print("你来到了商店,购买了药水")
coins -= 5
health += 20
print(f"""
当前生命值:{health}
当前经验值:{exp}
当前金币:{coins}
""")
分支嵌套
分支嵌套是指在一个分支语句内部嵌套另一个分支语句。
"""
勇士与地下城的场景续写:
(1)怪物房: 遇到了史莱姆
1. 选择攻击,战胜史莱姆,则经验加20,金币加20,失败则经验减20,金币减20,血值减20,成功的概率为50%。
2. 选择逃跑,则金币减20
(2) 宝箱房: 你打开了宝箱,获得了钥匙
(3) 陷阱房: 你触发了陷阱,受到了毒箭的伤害,血值减10
(4) 商店: 你来到了商店,打印当前血值和金币,一个金币买一个药水对应10个血值,引导是否购买药水
1. 购买,引导购买几个金币的药水,并完成减金币和增血值
2. 不购买,打印退出商店
"""
import random
name = "勇士"
health = 100
coins = 0
exp = 0
print("欢迎来到地下城!")
print(f"""
当前生命值:{health}
当前经验值:{exp}
当前金币:{coins}
""")
input("按下 Enter 进入下一个房间...")
room = random.choice(["怪物房", "宝箱房", "陷阱房", "商店"])
if room == "怪物房":
action = input("请选择行动:(1)攻击 (2)逃跑")
if action == "1":
attack = random.randint(1, 20)
if attack >= 10:
print("你击败了史莱姆")
coins += 10
else:
print("你的攻击没有命中!")
health -= 20
elif action == "2":
print("你逃跑了,但失去了一些生命值")
health -= 10
else:
print("无效的选择!请重新选择。")
elif room == "宝箱房":
print("你打开了宝箱,获得了钥匙")
elif room == "陷阱房":
print("你触发了陷阱,受到了毒箭的伤害")
health -= 10
elif room == "商店":
choice = input("你来到了商店,购买了药水,是否购买?【Y/N】")
if choice == "Y" and coins >= 5:
print("购买药水成功")
coins -= 5
health += 20
else:
print("退出商店")
print(f"""
当前生命值:{health}
当前经验值:{exp}
当前金币:{coins}
""")
2. 循环语句
预备知识:
PyCharm提供了丰富的功能来帮助开发者编写、调试和运行 Python 代码。其中,PyCharm 的 Debug 模式是一种强大的调试工具,可以帮助开发者在代码执行过程中逐行跟踪和分析程序的行为。以下是关于 PyCharm Debug 模式的介绍:
1. 设置断点:在需要调试的代码行上设置断点,断点是程序的一个暂停点,当程序执行到断点时会暂停执行,允许开发者逐行检查代码。
2. 启动 Debug 模式:在 PyCharm 中,可以通过点击工具栏上的 "Debug" 按钮来启动 Debug 模式,或者使用快捷键(通常是 F9)。
3. 逐行执行:在 Debug 模式下,可以使用调试工具栏上的按钮(如「Step Over」、「Step Into」和「Step Out」)逐行执行代码。Step Over 会执行当前行并跳转到下一行,Step Into 会进入函数调用并逐行执行函数内部代码,Step Out 会执行完当前函数并跳出到调用该函数的位置。
4. 变量监视:在 Debug 模式下,可以查看变量的值和状态。在调试工具栏的「Variables」窗口中,可以看到当前作在 PyCharm 中,Debug 模式是一种强大的调试工具,可以帮助开发者在代码执行过程中逐行跟踪和分析程序的行为。
循环语句
循环语句是编程中的一种控制结构,用于重复执行特定的代码块,直到满足特定的条件为止。它允许程序根据需要多次执行相同或类似的操作,从而简化重复的任务。
while循环
while循环用于在条件为真的情况下重复执行一段代码,直到条件变为假为止。以下是while循环的语法:
while 条件表达式:
循环体
在执行while循环时,程序会先检查条件是否为真。如果条件为真,就执行循环体中的代码,然后再次检查条件。如果条件仍为真,就再次执行循环体中的代码,以此类推,直到条件变为假为止。
# 无限循环
# while 1:
# print("hello yuan!")
# 有限循环方式1
# count = 0 # 初始语句
# while count < 10: # 判断条件
# # print("hello yuan")
# print("count:::", count)
# count += 1 # 步进语句
# 有限循环方式2
# count = 100 # 初始语句
# while count > 0: # 判断条件
# print("count:::", count)
# count -= 1 # 步进语句
循环案例
案例1:计算1-100的和
"""
# 准备:
# 假设有一个变量s的初始值为0,将s增加5次,每次增加值分别为1,2,3,4,5,然后打印s的值。
"""
# 实现代码
count = 1 # 初始语句
s = 0
while count <= 100: # 判断条件
# s = 0 # 会怎么?
print("count:::", count)
s += count
count += 1 # 步进语句
print(s)
案例2:验证码案例
"""
# 假设有一个变量s的初始值为"",将s拼接5次,每次增加值分别为"A","B","C",然后打印s的值。
s = ""
s += "A"
s += "B"
s += "C"
print(s)
"""
import random
import string
char = string.ascii_letters + string.digits
count = 0
randomCodes = ""
while count < 5:
code = random.choice(char)
randomCodes += code
count += 1
print(randomCodes)
补充:
这里用了一个新的库string,它可以获取ASCII码的字母和数字
random.choice方法也可用接收字符串
for循环
for循环用于对一个容器对象(如字符串、列表、元组等)中的元素进行遍历和操作,直到所有元素都被遍历为止。以下是for循环的语法:
for 变量 in 容器对象(字符串,列表,字典等):
循环体
for i in "hello world":
# print("yuan")
print(i)
在执行for循环时,程序会依次将序列中的每个元素赋值给变量,并执行循环体中的代码,直到序列中的所有元素都被遍历完为止。
在 Python 中range()
函数用于生成一个整数序列,它常用于循环和迭代操作。
range(stop) 、range(start, stop, step)
参数解释:
start
(可选):序列的起始值,默认为 0。stop
:序列的结束值(不包含在序列中)。step
(可选):序列中相邻两个值之间的步长,默认为 1。
for i in range(100): # 循环次数
print("yuan")
# 基于for循环实现1+100的和的计算
s = 0
for i in range(1, 101): # 循环次数
s += i
print(s)
嵌套语句
案例1:打印出从 0 到 99 中能被 13 整除的所有数字。
# for i in range(100):
# if i % 13 == 0:
# print(i)
# 同理还可以使用range的步长实现奇数偶数的打印。
for i in range(0, 100, 13):
print(i)
案例2:打印出从 1 到 100 的所有整数,但将整除 3 的数字打印为 "Fizz",整除 5 的数字打印为 "Buzz",同时整除 3 和 5 的数字打印为 "FizzBuzz"。
for i in range(1, 101):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
案例3:循环嵌套分支
import random
name = "勇士"
health = 100
coins = 0
exp = 0
print("欢迎来到地下城!")
while 1:
print(f"""
当前生命值:{health}
当前经验值:{exp}
当前金币:{coins}
""")
input("按下 Enter 进入下一个房间")
room = random.choice(["怪物房", "宝箱房", "陷阱房", "商店"])
# ......
案例4:打印扑克牌
poke_types = ['♥️', '♦️', '♠️', '♣️']
poke_nums = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
for p_type in poke_types:
for p_num in poke_nums:
print(f"{p_type}{p_num}")
退出循环
while是条件循环,条件为False时退出循环,for循环是遍历循环,遍历完成则退出,这都属于正常退出循环,如果想非正常退出循环,分为强制退出当次循环和退出整个循环,分别使用关键字continue
和break
来实现。
break
退出整个循环
# 退出while循环
while True:
userInput = input("请输入一个数字(输入q退出):")
if userInput == 'q':
print("退出循环")
break
number = int(userInput)
square = number ** 2
print(f"{number} 的平方是 {square}")
# 退出for循环
# 查找1-100中第一个能整除13的非零偶数
for i in range(100):
if i % 13 == 0 and i != 0 and i % 2 == 0:
print("获取i值:", i)
break
continue
退出当次循环
for i in range(100):
if i % 13 != 0:
continue
print("获取i值:", i)
for i in range(100):
if i % 13 == 0:
print("获取i值:", i)
3. 今日作业
1、编写一个程序,判断一个字符是否为元音字母(a、e、i、o、u,包括小写和大写)。如果是元音字母,则输出"是元音字母",否则输出"不是元音字母"。
char = input("请输入一个字符:")
if char.lower() in "aeiou":
print("是元音字母")
else:
print("不是元音字母")
2、统计元音字母:编写一个程序,接受用户输入的一段文本,统计其中元音字母(a、e、i、o、u)的个数,并输出结果。
text = input("请输入一段文本")
count = 0
for char in text:
if char.lower() in "aeiuo":
count += 1
print(f"元音字母出现次数:{count}")
【错题】3、计算1-2+3-4+......-1000最终的结果,能整除13的数不参与计
result = 0
for i in range(1, 1001): # 从 1 开始,到 1000 结束
if i % 13 == 0:
continue # 跳过能被 13 整除的数
elif i % 2 != 0:
result += i # 奇数位加
else:
result -= i # 偶数位减
print(result)
4、身份证号码的倒数第二位数字是奇数,表示性别为男性,否则为女性,引导用户输入身份证号,先判断是否为18位,再判断性别。
id_number = ""
while len(id_number) != 18:
id_number = input("请输入身份证号").strip()
if int(id_number[-2]) % 2 != 0:
print("男性")
else:
print("女性")
【错题】5、计算初始本金为1万,年利率为0.0325的情况下,需要多少年才能将本金和利息翻倍,即本金和利息的总和达到原来的两倍。
# 本金
base_money = 10000
# 利率
rate = 0.0325
# 连本带利
total = base_money
year = 0
while total < 2 * base_money:
total = total + total * rate
year += 1
print(year)
6、编写一个程序,生成斐波那契数列的第20个数字(斐波那契数列是指从0和1开始,后面的每一项都是前两项的和)
# n = 20
# def fibo(n):
# if n == 1 or n == 0:
# return n
# return fibo(n - 1) + fibo(n - 2)
# print(fibo(n))
# 这个题目应该是用循环迭代做好点,递归如果数量大了会很慢,但是课程中给的结果应该是错的,少计算了一次
pre = 0
current = 1
for _ in range(1, 20):
next_num = pre + current
pre = current
current = next_num
print(current)
【复习】7、编写一个程序,接受用户输入的一个整数,判断该数是否是素数(只能被1和自身整除的数)。注意,素数的定义是大于1的自然数,只能被1和自身整除,没有其他的正因数。
num = int(input("请输入一个大于1的整数"))
# flag = True
# for i in range(2, num):
# if num % i != 0:
# flag = False
# print("不是素数")
# break
# # 也可以加个else,把上面的打印放到else里面
# if flag:
# print(f"{num}是素数")
# 补充:for-else语法 (正常执行走else,break退出就不走else)
for i in range(2, num):
if num % i != 0:
print("不是素数")
break
else:
print(f"{num}是素数")
8、猜数字游戏
1.首先,程序使用random.randint函数产生一个1~10之间的随机数。
2.然后,程序通过for循环提示玩家输入一个猜测的数字,玩家可以输入一个1~10之间的整数。
3.如果玩家猜对了数字,程序输出恭喜玩家的信息并结束游戏;如果玩家猜错了,程序会根据玩家输入的数字与随机数之间的大小关系来提示玩家是否猜对,并在每次猜错后告诉玩家还剩下几次机会。
4.如果玩家在三次机会内猜对了数字,程序输出恭喜玩家的信息并结束游戏;否则程序输出很遗憾的信息并结束游戏。
import random
answer = random.randint(1,10)
for i in range(3):
num = int(input("请输入一个1~10之间的整数"))
if num > answer:
print("猜大了!")
elif num < answer:
print("猜小了!")
else:
print(f"恭喜你,猜对了,数字正是{answer}")
break
else:
print("很遗憾,三次机会已经用完了!")
9、分支嵌套
在选座购票中扩写,引导用户输入【普通票/学生票/老年票】,然后分支判断。
print("欢迎来到电影订票系统!")
print("请选择您要进行的操作:")
print("1. 查询电影场次")
print("2. 选座购票")
print("3. 查看订单信息")
choice = int(input("请输入您的选择(1-3):"))
if choice == 1:
print("正在查询电影场次...")
# 执行查询电影场次的代码
elif choice == 2:
print("正在选座购票...")
elif choice == 3:
print("正在查看订单信息...")
# 执行查看订单信息的代码
else:
print("无效的选择!请重新运行程序并输入有效的选项。")
```python
print("欢迎来到电影订票系统!")
print("请选择您要进行的操作:")
print("1. 查询电影场次")
print("2. 选座购票")
print("3. 查看订单信息")
choice = int(input("请输入您的选择(1-3):"))
if choice == 1:
print("正在查询电影场次...")
# 执行查询电影场次的代码
elif choice == 2:
print("正在选座购票...")
ticket_type = input("""
1.学生票
2.老年票
3.普通票
""")
if ticket_type == "1":
print("正在购买学生票")
elif ticket_type == "2":
print("正在购买学老年票")
elif ticket_type == "3":
print("正在购买普通票")
elif choice == 3:
print("正在查看订单信息...")
# 执行查看订单信息的代码
else:
print("无效的选择!请重新运行程序并输入有效的选项。")
10、打印一个nxn的矩阵,每个元素的值等于其所在行数和列数之和。
// 比如4*4矩阵
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
n = 4
for i in range(1, 1 + n):
for j in range(1, 1 + n):
print(f"{i + j} ", end="")
print()
11、打印一个如下的九九乘法表
for i in range(1, 10):
for j in range(1, i + 1):
print(f"{j} × {i} = ", i * j, sep='', end=' ')
print()