流程控制
1、if分支语句
- 练习一
"""
作业要求
编写一个Python程序,输入一个5位数,判断输入的这个数字是否为回文数。
回文数是指从左到右和从右到左读都一样的数。例如12321。如果输入的是回文数,输出是回文数,否则输出不是回文数。
分析:
1、输入5个数;
2、判断:是否为5个数字;
3、判断是否为回文数;
"""
# 1、输入5个数;
while True:
number = input("请输入一个五位数:")
print(type(number)) # <class 'str'>
print("你输入了:{}".format(number))
# 2、判断:是否为5个数字;
if number.isdigit():
if len(number) == 5:
break
else:
print(f"输入位数为{len(number)}为,请重新输入5位数字!")
continue
else:
print("输入内容包含了非数字,请重新输入5位数字!")
continue
# 3、判断是否为回文数;---方式一:使用下角标获取元素进行对比;
def method_01(number):
if number[0] == number[4]:
if number[1] == number[3]:
print(f"你输入的{number}是回文数!")
else:
print(f"你输入的{number}不是回文数!")
else:
print(f"你输入的{number}不是回文数!")
# 3、判断是否为回文数;---方式二:将输入内容逆序和原内容进行对比;
def method_02(number):
new_number = number[::-1]
if new_number == number:
print(f"你输入的{number}是回文数!")
else:
print(f"你输入的{number}不是回文数!")
while True:
method_type = input("请输入验证方法,方式一请输入1,方式2请输入2:")
if int(method_type) == 1:
method_01(number)
break
elif int(method_type) == 2:
method_02(number)
break
else:
print("选择方式错误,请重新选择验证方式!")
continue
- 练习二
"""
作业要求
编写一个 Python 程序,用户输入一个分数,程序将根据分数判断并输出相应的等级。分数在 90 分及以上为 A 等级,60 -89 分为 B 等级,否则为 C 等级。
"""
def getlevel(score):
if score >= 90 and score <= 100:
print("等级为A")
elif score >= 60 and score <= 89:
print("等级为B")
else:
print("等级为C")
score = "not exit"
print("你已进入分数等级判断系统,退出请输入:exit")
while True:
if score != "exit":
while True:
score = input("请输入分数:")
if score == "exit":
print("谢谢使用!")
break
else:
if score.isdigit():
if int(score) <= 100 and int(score) >= 0:
print(f"你输入的分数为:{score}")
getlevel(int(score))
continue
else:
print("请输入0-100的正确分数!")
continue
else:
print("请输入0-100的正确分数!")
continue
elif score == "exit":
print("谢谢使用!")
break
- 练习三
"""
作业要求
编写一个简单的Python程序,实现一个简易的计算器。用户可以输入两个数字和一个运算符(+、-、*、/),程序将根据运算符执行相应的计算操作,并输出结果。
"""
def calculator(number_1,operator,number_2):
if operator == "+":
print(f"计算:{number_1}{operator}{number_2}={number_1+number_2}")
elif operator == "-":
print(f"计算:{number_1}{operator}{number_2}={number_1-number_2}")
elif operator == "*":
print(f"计算:{number_1}{operator}{number_2}={number_1*number_2}")
elif operator == "/":
print(f"计算:{number_1}{operator}{number_2}={number_1 / number_2}")
def while_operator():
input_content = "not exit"
print("欢迎使用计算器,退出请输入exit!")
while True:
if input_content != "exit":
# 输入计算内容
input_1 = input("请输入第一个数字:")
input_content = input_1
print("input_content=",input_content)
if input_content != "exit":
if input_1.isdigit():
while True:
if input_content != "exit":
input_operator = input("请输入运算符(+、-、*、/):")
input_content = input_operator
if input_content != "exit":
if input_operator in "+-*/":
while True:
if input_content != "exit":
input_2 = input("请输入第二个数字:")
input_content = input_2
if input_content != "exit":
if input_2.isdigit():
calculator(int(input_1), input_operator, int(input_2))
# 递归调用,让计算器一直可用,除非用户输入exit--递归调用的时候有bug--TODO
while_operator()
else:
print("输入有误,请输入数字!")
continue
elif input_content == "exit":
print("谢谢使用!")
break
elif input_content == "exit":
print("谢谢使用!")
break
else:
print("运算符输入错误,请输入运算符(+、-、*、/):")
continue
elif input_content == "exit":
print("谢谢使用!")
break
elif input_content == "exit":
print("谢谢使用!")
break
else:
print("输入有误,请输入数字!")
continue
elif input_content == "exit":
print("谢谢使用!")
break
elif input_content == "exit":
print("谢谢使用!")
break
# 方法调用
while_operator()
- 练习四
"""
作业要求
编写一个 Python 程序,模拟乘坐公交车过程,并且可以有座位坐下。要求:输入公交卡当前的余额,只要不低于2元,就可以上公交车;如果车上有空座位,就可以坐下。
分析:
乘客坐的位置是随机的,所以用集合来存放位置
"""
locator = {"座位1","座位2","座位3","座位4","座位5","座位6","座位7"}
while True:
balance = input("请刷卡,余额为:")
if int(balance) >= 2:
# 可以上车
print(f"请上车,选择了座位{locator.pop()}")
# 判断,如果还有作为就继续上人
if len(locator) > 0:
print(f"剩余座位{len(locator)},请下一位乘客刷卡!")
continue
else:
print(f"剩余座位为{len(locator)},已坐满!")
break
else:
print("对不起,卡余额不足,不可以上车!有请下一位乘客刷卡!")
continue
2、match匹配语句
(1) 匹配语句match介绍
- 在 Python 中,match 是 Python 3.10 版本引入的一种模式匹配语法。
- 它提供了一种简洁而强大的方式来匹配和处理不同模式的逻辑,当成功匹配一个模式时,就执行该模式后的代码块。
- match 语句适用于有限的精准值的匹配,不适用于范围值的判断。
(2) 基本语法结构
match value:
case pattern1:
# 处理 pattern1 匹配成功的情况
case pattern2:
# 处理 pattern2 匹配成功的情况
...
case patternN:
# 处理 patternN 匹配成功的情况
case _:
# 处理所有其他情况的匹配(相当于默认情况)
-
match
表示匹配模式的开始 -
value
表示需要进行匹配的目标值 -
case
表示提供一个匹配模式 -
pattern
表示被匹配的值,该值一般为一个字面量值。 -
-
(下划线)表示当所有模式都未匹配成功,则执行该模式下的代码块,本质上-
是一个变量,用来匹配任意值。
# 示例: 根据输入httpCode值不同,输出对应的描述
httpCode = int(input("请输入一个HTTP状态码:"))
match httpCode:
case 101:
print("临时响应")
case 200:
print("请求成功")
case 301:
print("重定向")
case 404:
print("页面找不到")
case 500:
print("服务器内部错误")
case _:
print("无效的状态码")
(3) |
组合多个匹配值
- match 可以在一个匹配模式中,提供多个匹配值,使用
|
组合,在匹配时,只要成功匹配其中一个值即可。
# 示例: 改进 HTTPCode 示例,可以匹配不同级别中的更多状态码
httpCode = int(input("请输入一个HTTP状态码:"))
match httpCode:
case 100 | 101:
print("临时响应")
case 200 | 201 | 203 | 204 | 205:
print("请求成功")
case 301 | 304 | 307:
print("重定向")
case 401 | 403| 404 | 405:
print("页面找不到")
case 500 | 502 | 503:
print("服务器内部错误")
case _:
print("无效的状态码")
(4) 匹配模式绑定变量
- 在提供匹配值时,除可以提供字面值外,还可以提供变量,用来匹配任意值,如
_
,但是在一个匹配语句中,只能出现一个独立的匹配变量。 - 在编写程序过程中,如果需要动态匹配部分数据,比如一个元组中的部分值,此时可以通过绑定变量的方式,提供一个字面值和变量的混合匹配模式,字面值用来精确匹配,变量用来模糊匹配。
# 示例:输入一个坐标,输出该坐标点的位置。
x = int(input("x:"))
y = int(input("y:"))
point = (x, y)
match point:
case (0, 0):
print("坐标在原点上")
case (0, y):
print(f"坐标在Y轴上")
case (x, 0):
print(f"坐标在X轴上")
case (x, y):
print(f"X={x}, Y={y}")
case _:
raise ValueError("没有这个坐标点")
上面代码中:
- 第一个模式有两个字面值,这两个字面值都能精确匹配者能成功匹配当前模式。
- 第二,三两个模式结合了一个字面值和一个变量,而变量绑定了一个来自目标的值(point),此时,字面值需要精确匹配,而绑定的变量可以匹配该位置的任意值。
- 第四个模式捕获了两个值,此时,目标值中的任意值都会被成功匹配。
- 这使得它在概念上类似于解包赋值 (x, y) = point。
3、while循环
- 练习一
"""
实战1: 求 1~10 之间所有整数的和。
"""
number = 0
sum = 0
while True:
number += 1
if number <= 10:
sum += number
print("number=",number)
print("sum=",sum)
else:
print("sum=",sum)
break
- 练习二
"""
实战2: 求 1~10 之间所有整数的乘积。
"""
result = 1
number = 2
while number <= 10:
result *= number
number += 1
print("result=",result)
- 练习三
"""
实战3: 输入密码,直到密码输入正确,输出”登录成功“。
"""
# 方式一
# while True:
# password = input("请输入密码:")
# if password == "123456":
# print("密码输入正确")
# break
# else:
# print("密码错误")
# continue
# 方式二
password = "123456"
input_pwd = ""
while password != input_pwd:
input_pwd = input("请输入密码:")
print("密码输入成功")
- 练习四
"""
实战4: 在行酒令中,有一个数7小游戏,游戏参与者依次报数,但需要跳过所有包含7或7的整数倍的数字,编写程序找出1~100范围内所有符合该条件的数字。
"""
number = 0
n = 1
while number <= 100:
number += 1
if "7" in str(number):
print(f"第{n}个数字是:{number}")
n += 1
elif (number % 7) == 0:
print(f"第{n}个数字是:{number}")
n += 1
4、for in 循环
- 练习一
"""
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
实战作业
使用 for-in 内嵌 while 访问示例中的二维列表
使用 while 内嵌 for-in 访问示例中的二维列表
实现 九九乘法表标准格式输出
"""
# 使用 for-in 内嵌 while 访问示例中的二维列表
for i in range(1,10):
m = 1
while m <= i:
if i >=4 and m> 2:
print(f"{m}*{i}={i * m}", end=" ")# 没有对其--TODO
else:
print(f"{m}*{i}={i * m}", end=" ")
m += 1
print()
# for i in range(1,10):
# for j in range(1,i+1):
# # print(i * j, end=" ")
# print(f"{j}*{i}={i*j}",end=" ")
# print()
- 练习二
"""
作业要求
编写一个Python程序,输入一个5位数,判断输入的这个数字是否为回文数。
回文数是指从左到右和从右到左读都一样的数。例如12321。如果输入的是回文数,输出是回文数,否则输出不是回文数。
分析:使用 for 循环遍历字符串的一半字符。并逆序排列,然后与原字符串比较。如果两者相等,则为回文数,否则不是回文数。
"""
input_content = input("请输入数字:\n")
flag = True
for i in range(len(input_content) // 2):# 中间数不管,只需要验证两边“对应位置”的数是否相等
if input_content[i] != input_content[-i -1]:# 逆角标为-1,-2.-3...
flag = False
# 只要有一个不相等就已经证明不是回文数,直接退出循环
break
# 输出验证结果
if flag:
print(f"{input_content}是回文数")
else:
print(f"{input_content}不是回文数")
- 练习三
"""
作业要求
编写一个Python程序,分别打印以下图案。
正方形:
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
直角三角形:
*
* *
* * *
* * * *
* * * * *
倒立直角三角形:
* * * * *
* * * *
* * *
* *
*
等腰三角形:
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
"""
# 正方形
# 分析:两个for循环,一个控制行,一个控制列
temp = {}
for r in range(1,6):# 5列
temp = ""
for c in range(1,6):# 5行
# 每次打印默认是一行,要想一行显示多个,那得先让多个在一行
temp += "* "
# 打印一行之后进行换行
print(temp)
# 直角三角形:
# 分析:五行五列,每一行增加一个
for r in range(1,6):
print("* " * r)
# 倒立直角三角形:
# 分析:五行五列,每一行减少一个
for r in range(5,0,-1):
print("* " * r)
# 等腰三角形:
# 分析:5行,9列,第5列居中,一边4列
for c in range(1, 10, 2):
temp_1 = (9 - c) * " " + "* " * c
print(temp_1)
- 练习四
"""
作业要求
编写一个Python程序,来计算给定文本中每个单词出现的次数。
text = "
Python is a popular programming language. It is widely used for web development, data science, and more.
Python has a simple and readable syntax, which makes it great for beginners.
"
分析:
1、先将文本以空格分割得到一个list
2、遍历list将单词末尾标点符号去掉
3、以单词为键,重复单词装入list为值
4、判断单词是否出现,如果没有出现则创建一个新list放入,如果出现过就追加进去
4、统计各list的长度
"""
text = """
Python is a popular programming language. It is widely used for web development, data science, and more.
Python has a simple and readable syntax, which makes it great for beginners.
"""
# text_list = text.split()
# 如果不区分大小写,那就全部转成小写来处理
text_list = text.lower().split()
print(text_list)
out_dick = {}
for t in text_list:
new_t = t.strip(".,")
if new_t not in out_dick.keys():
# 没有出现过该单词,那就添加到字典中,值为列表
out_dick[new_t] = [new_t]
else:
# 出现过就追加到对应单词键的列表值中
out_dick[new_t].append(new_t)
# 输出
print(out_dick)
for k,v in out_dick.items():
print(f"单词{k}一共有{len(v)}")
- 练习五
"""
作业要求
编写一个 Python 程序,找出100-999范围内的水仙花数。所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
"""
# 方式一:
flower = []
for number in range(100,1000):
# 将数字转化成字符串遍历
sum = 0
for s in str(number):
# 然后再转成数字求立方和
sum += int(s)**3
if sum == number:
flower.append(number)
print(f"一共有{len(flower)}个水仙花数,分别是:{flower}")# 一共有4个水仙花数,分别是:[153, 370, 371, 407]
# # 方式二:
# for n in range(100, 1000):
# # 获取百位数
# i = n // 100
#
# # 获取十位数--除以10取商,商除10取余
# j = n // 10 % 10
#
# # 获取个位数
# k = n % 10
#
# # 判断是否为水仙花数
# if n == i**3 + j**3 + k**3:
# # 输出水仙花数
# print(n)
- 练习六
"""
作业要求
编写一个 Python 程序,输出所有由数字1、2、3、4 组成的互不相同且无重复数字的三位数。即个位,十位,百位互不相同且无重复数字。
"""
origin = ["1","2","3","4"]
result = []
for b in origin:# 百位
for s in origin:# 十位
for g in origin:# 各位
temp = b + s + g
if b != s and s != g and b != g:
if temp not in result:
result.append(int(temp))
print(f"一共{len(result)}个数字,包括:{result}")
5、循环跳转
(1) Python中提供两种循环跳转语句
-
break
结束当前整个循环(跳出循环); -
continue
结束本次循环进入下一次循环;
(2) loop-else
-
在Python中,不只if 语句可以使用else, 循环语句也可以使用else。
-
当一个循环没有被break中断而正常循环结束,就会执行else后的代码块。
for i in range(5):
print(i)
else:
print("Over")
- 如果循环被break中断,则不会执行else后的语句;
for i in range(5):
print(i)
if i == 2:
break
else:
print("Over")
- 在某些场景下,else 可以简化代码。
names = ["tom","jack","rose","tony"]
inName = input("请输入要查找的姓名:")
# 不使用Else形式
flag = False
for name in names:
if name == inName:
print("找到了")
flag = True
break
if not flag:
print("没找到")
# 使用Else形式
for name in names:
if name == inName:
print("找到了")
break
else:
print("没找到")
6、数字序列
- 在使用for-in循环时,默认是无法实现类似传统for循环方式的使用形式,但是可以配合
range()
函数实现传统的计次循环。 当然,也可以通过while循环来实现计次循环。 在实现某个功能时,循环可以相互替代实现。
(1)range函数
- range() 函数是一个用于生成整数序列的内置函数,通过指定起始值、停止值和步长,它能够生成一个按照指定规则递增(默认)或递减(负步长)的整数序列。
- range() 通常用于配合for-in循环结构中控制迭代次数或遍历特定范围的情况使用。
A、 range函数的基本语法
-
格式:
range(start, stop, step)
–左开右闭区间;-
start
: 可选参数,表示起始值,默认为0。 -
stop
: 表示结束值,不包含在范围内。 -
step
: 可选参数, 表示步长,默认为1。
-
# 确定开始和结束范围
nums = list(range(1, 10))
print(nums)# [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 使用默认开始值
nums = list(range(10))
print(nums)# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 确定范围和步长
nums = list(range(1, 10, 2))
print(nums)# [1, 3, 5, 7, 9]
# 使用负步长--递减
nums = list(range(10, 1, -3))
print(nums)# [10, 7, 4]
冒泡排序
# 冒泡排序
nums = [15,154,45,15,1,451,15,454,15,5,451,54545,151,5,45,151,5,15,1]
# 外层循环控制比较的次数,有n个数只需要比较n-1次即可出结果
for i in range(len(nums)-1):
print(f"源数据为:{nums}")
print(f"一共有{len(nums)}个数据,第{i+1}次比较")
# 内层循环控制前后两个数进行比较,但是比较i次之后需要比较的数据个数就会相应减少i个,所以len(nums)-i
# 前后比较的时候还得消息角标越界,也就是倒数第二个和倒数第一个比较,倒数第一个就不用比了,所以-1
for j in range(len(nums)-i-1):
print(f"比较的数据为角标{j}:{nums[i]}和角标{j+1}:{nums[j+1]}")
# 判断,如果前一个大于后一个就交换位置
if nums[j] > nums[j+1]:
nums[j],nums[j+1] = nums[j+1],nums[j]
print(f"第{i+1}次比较后结果为:{nums}")
print(f"冒泡排序后结果:{nums}")
(2)随机数
-
使用
random
模块中的randint()
函数获取随一个机数。 -
格式:
randint(start, stop)
–闭区间;-
start
为随机数获取初始范围; -
stop
为随机数获取结束范围,包含该值; - 使用该函数前需要导入,
from random import randint
;
-
# 示例: 骰子游戏: 从键盘输入一个数字,和程序随机生成的 1~6范围的数字比较大小
from random import randint
play = int(input("请输入一个1-6之间的数字:"))
bot = randint(1, 6)
print("随机数:",bot)
if play == bot:
print("点数相同,平局")
elif play > bot:
print(f"玩家{play}点,电脑{bot}点,玩家胜")
else:
print(f"玩家{play}点,电脑{bot}点,电脑胜")
- 练习一
"""
作业要求
编写一个 Python 程序,实现一个猜数字的游戏。程序随机生成一个1-100目标数字,
在一定的范围内,玩家需要根据提示猜测目标数字,直到猜中为止。游戏会根据玩家的猜测给出提示,
告诉玩家猜的数字是大了还是小了,最终告诉玩家猜对了,并显示猜测次数。
"""
# 方式一:while循环
from random import randint
# rand_number = randint(1,100)
# # 统计次数
# n = 0
# while True:
# n += 1
# input_number = int(input("请输入一个数字:\n"))
# if rand_number != input_number:
# # 判断大小并提示继续输入
# if rand_number > input_number:
# print("小了,再大一点就好!")
# continue
# elif rand_number < input_number:
# print("大了,再小一点就好!")
# continue
# else:
# print(f"恭喜你猜对了,一共猜了{n}次,rand_number={rand_number}")
# break
# else:
# print(f"恭喜你猜对了,一共猜了{n}次,rand_number={rand_number}")
# break
# 方式二:for循环
rand_number = randint(1,100)
for n in range(1,50):
input_number = int(input("请输入一个数字:\n"))
if rand_number != input_number:
# 判断大小并提示继续输入
if rand_number > input_number:
print("小了,再大一点就好!")
continue
elif rand_number < input_number:
print("大了,再小一点就好!")
continue
else:
print(f"恭喜你猜对了,一共猜了{n}次,rand_number={rand_number}")
break
else:
print(f"恭喜你猜对了,一共猜了{n}次,rand_number={rand_number}")
break
- 练习二
"""
作业要求
编写一个Python程序,实现一个简单的猜拳游戏。玩家和电脑各自选择石头、剪刀或布,根据规则判断胜负关系,并输出比赛结果。
"""
from random import randint
# 方式一:用有效数列存放剪刀石头布,然后随机下标获取
# rules = ["石头","剪刀","布"]
# rand_index = randint(0,2)
# input_content = input("请出剪刀石头布:\n")
# if input_content == rules[rand_index]:
# print(f"电脑出{rules[rand_index]}--平局")
# elif (input_content == "剪刀" and rules[rand_index] == "布") or \
# (input_content == "石头" and rules[rand_index] == "剪刀") or\
# (input_content == "布" and rules[rand_index] == "石头"):
# print(f"电脑出{rules[rand_index]}--玩家胜")
# else:
# print(f"电脑出{rules[rand_index]}--电脑胜")
# 方式二:使用random.choice()方法随机获取一个
from random import choice
"""Choose a random element from a non-empty sequence."""
computer = choice(["石头","剪刀","布"])
input_content = input("请出剪刀石头布:\n")
if input_content == computer:
print(f"电脑出{computer}--平局")
elif (input_content == "剪刀" and computer == "布") or \
(input_content == "石头" and computer == "剪刀") or\
(input_content == "布" and computer == "石头"):
print(f"电脑出{computer}--玩家胜")
else:
print(f"电脑出{computer}--电脑胜")