Python侧开28期-偕行-学习笔记-python流程控制

流程控制

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}--电脑胜")