Python测开28期 - 旎奥 - 学习笔记 - photon基础 - 流程控制

一、分支语句if

if条件判断1:
  执行语句1······
elif判断条件2:
  执行语句2····
elif判断条件3:
  执行语句3····
else:
  执行语句4

demo:

print("请输入数字:")
a =input()   # 从控制台输入内容放到变量a
flag = int(a)   # 输入的内容默认是字符串的
if flag == 1:
  print("喝奶")
elif flag == 2:
  print("吃饭")
elif flag == 3:
  print("吃大餐")
else:
  print("不吃")

作业

回文数实现

def huiwenshu():
    """
    编写一个Python程序,输入一个5位数,判断输入的这个数字是否为回文数。
    回文数是指从左到右和从右到左读都一样的数。例如12321。
    如果输入的是回文数,输出是回文数,否则输出不是回文数。
    """
    # 输入一个5位数
    inp = input("请输入一个五位数:\n")
    re = inp[::-1]
    if re == inp:
        print(f"{inp}是一个回文数")
    else:
        print(f"{inp}不是一个回文数")

成绩判断

def get_grade():
    """
    编写一个 Python 程序,用户输入一个分数,程序将根据分数判断并输出相应的等级。
    分数在 90 分及以上为 A 等级,60 -89 分为 B 等级,否则为 C 等级。
    :return:
    """
    # 用户输入一个分数
    grade = int(input("请输入分数:\n"))
    # 分数在 90 分及以上为 A 等级,60 -89 分为 B 等级,否则为 C 等级。
    if grade >=0 and grade <= 100:
        if grade >= 90:
            print(f"你的等级为A等级,分数是:{grade}")
        elif grade >= 60:
            print(f"你的等级为B等级,分数是:{grade}")
        else:
            print(f"你的等级为C等级,分数是:{grade}")
    else:
        print("请输入正确的分数!")

计算器

def calc():
    """编写一个简单的Python程序,实现一个简易的计算器。
       用户可以输入两个数字和一个运算符(+、-、*、/),
       程序将根据运算符执行相应的计算操作,并输出结果。
       """
    # 输入两个数字和运算符
    num1 = int(input("请输入第一个数字:\n"))
    oper = input("请输入一个运算符:\n")
    num2 = int(input("请输入第二个数字:\n"))

    # 根据运算符执行相应的计算操作
    if oper == "+":
        result = num1 + num2
        print(f"结果为{result}")

    elif oper == "-":
        result = num1 - num2
        print(f"结果为{result}")

    elif oper == "*":
        result = num1 * num2
        print(f"结果为{result}")

    elif oper == "/":
        if num2 != 0:
            result = num1 / num2
        else:
            result = "除数不能为零"
        print(f"结果为{result}")

    elif oper == "%":
        result = num1 % num2
        print(f"结果为{result}")

    else:
        print("请输入正确的运算符!")

乘公交

def take_bus():
    """
    编写一个 Python 程序,模拟乘坐公交车过程,并且可以有座位坐下。
    要求:输入公交卡当前的余额,只要不低于2元,就可以上公交车;
    如果车上有空座位,就可以坐下。
    :return:
    """
    # 输入公交卡当前余额
    balance = int(input("请输入公交卡当前余额:\n"))
    if balance >= 2:
        print("请上车!")
        seat_num = int(input("请输入当前公交空座位数:\n"))
        if seat_num > 0:
            print("请坐!")
        else:
            print("无空座位。")
    else:
        print("余额不足,请充值!")

二、匹配语句match介绍

在 Python 中,match 是 Python 3.10 版本引入的一种模式匹配语法。

它提供了一种简洁而强大的方式来匹配和处理不同模式的逻辑,当成功匹配一个模式时,就执行该模式后的代码块。

match 语句适用于有限的精准值的匹配,不适用于范围值的判断。

基本语法结构

match 语法的基本结构如下:

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("无效的状态码")

| 组合多个匹配值

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("无效的状态码")

匹配模式绑定变量

在提供匹配值时,除可以提供字面值外,还可以提供变量,用来匹配任意值,如_,但是在一个匹配语句中,只能出现一个独立的匹配变量。

在编写程序过程中,如果需要动态匹配部分数据,比如一个元组中的部分值,此时可以通过绑定变量的方式,提供一个字面值和变量的混合匹配模式,字面值用来精确匹配,变量用来模糊匹配。

示例:输入一个坐标,输出该坐标点的位置。

# point is an (x, y) tuple
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。

三、循环语句while

循环的构成要素

  • 初始化语句: 一条或多条语句,用于完成一些初始化工作。初始在循环开始之前执行。
  • 循环条件:一般是一个布尔表达式,这个表达式能决定是否执行循环体
  • 循环体:这个部分是循环的主体,如果循环条件允许,这个代码块将被重复执行。
  • 迭代语句:这个部分在每次执行循环体结束后,对循环条件求值之前执行,通常用于控制循环条件中的变量向趋近于结束条件改变。

while 循环的语法

while 条件表达式: 
    循环体

当条件表达式的返回值为真时,则执行循环体中的语句,执行完毕后,重新判断条件表达 式的返回值,直到表达式返回的结果为假时,退出循环。

numbers = [12, 37, 5, 42, 8, 3]
even = []
odd = []
while len(numbers) > 0:
    # 移除列表中的一个元素(默认最后一个),并返回该元素的值
    number = numbers.pop()
    if(number % 2 == 0):
        # append()列表末尾添加新的对象
        even.append(number)
    else:
        odd.append(number)

print(even)
print(odd)

运行结果:

[8, 42, 12]
[3, 5, 37]

实战

求 1~10 之间所有整数的乘积。

def num_re():
    """求 1~10 之间所有整数的乘积。"""
    # 变量
    num = 2
    # 起始结果
    result = 1
    while num <=10 and num > 0:
        result = num * result
        num += num
    print(f"1~10 之间所有整数的乘积是:{result}")

image

输入密码,直到密码输入正确,输出”登录成功“

def password():
    """输入密码,直到密码输入正确,输出”登录成功“"""
    password = "1599887456"
    str = " "
    while str != password:
        str = input("请输入密码:\n")
    print("登录成功")

image

行酒令

def xingjiuling():
    """
    在行酒令中,有一个数7小游戏,
    游戏参与者依次报数,
    但需要跳过所有包含7或7的整数倍的数字,
    编写程序找出1~100范围内所有符合该条件的数字。
    :return:
    """
    num = 1
    while num >=1 and num <=100:
        num += 1
        if num % 7 == 0:
            print(num)

image

四、循环语句for-in

for-in 循环的语法

for 迭代变量 in 对象:
    循环体

for-in 循环会将可迭代对象中的元素依次取出,保存到迭代变量中。每取出一个变量,便执行一次循环体,在循环体中可以通过引用迭代变量,使用取出的数据。

遍历可迭代对象

使用for-in循环处理可迭代对象,可以使操作过程变的极其简单。
使用场景: 明确的知道循环执行的次数或者要对一个容器进行迭代

range函数:

  • 1.range(101)可以产生一个0-100的整数序列
  • 2.range(1,100)可以产生一个1到99的整数序列
  • 3.range(1,100,2)可以产生一个1到99的奇数序列,其中的2是步长
  • 当range只传入一个参数的时候,传入的是 结束数值,遵循前闭后开原则
  • 当range传入两个参数的时候,传入的是 (开始数值,结束数值),遵循前闭后开原则
  • 当range传入三个参数的时候,传入的是 (开始数值,结束数值,步长)遵循前闭后开原则

遍历字符串

s = "Hello Hogworts!"
for c in s:
    print(c)

image

示例: 输出前面示例中每个字符对应的ASCII码值。

s = "Hello Hogworts!"
for c in s:
    print(f"字符【 {c} 】的ASCII码为:【 {ord(c)} 】")

遍历元组

t = (1,2,3,4,5)
for n in t:
    print(n)

示例:输出前面示例元组中每个数字的立方值

t = (1,2,3,4,5)
for n in t:
    print(f"数字【 {n} 】的立方值为:【 {n*3} 】")

image

遍历列表

requestMethods = ["get", "post", "put","delete", "patch", "header", "options",'trace']
for method in requestMethods:
    print(method)

image

示例:将前面示例列表中所有的请求方式转换为大写输出

requestMethods = ["get", "post", "put","delete", "patch", "header", "options",'trace']
for method in requestMethods:
    print(f"请求方式【 {method} 】转换为大写后:【 {method.upper()} 】")

遍历字典

requestMethods = {
                    "get": "用于获取服务器上的资源,通过在URL中传递参数来发送请求。",
                    "post": "用于向服务器提交数据,一般用于创建新的资源或进行修改操作。",
                    "put": "用于更新服务器上的资源,一般用于修改已存在的资源的全部内容。",
                    "delete": "用于删除服务器上的资源。"
                }
for method in requestMethods:
    print(method)

image

从前面的代码中可以看出,字典是一个比较特殊的数据类型,由key-value组成,在使用for-in遍历字典时,默认遍历的是字典的所有key,相当于下面的代码

requestMethods = {
                    "get": "用于获取服务器上的资源,通过在URL中传递参数来发送请求。",
                    "post": "用于向服务器提交数据,一般用于创建新的资源或进行修改操作。",
                    "put": "用于更新服务器上的资源,一般用于修改已存在的资源的全部内容。",
                    "delete": "用于删除服务器上的资源。"
                }
for method in requestMethods.keys():
    print(method)

如果想遍历字典中的所有值,可以使用下面的方式

requestMethods = {
                    "get": "用于获取服务器上的资源,通过在URL中传递参数来发送请求。",
                    "post": "用于向服务器提交数据,一般用于创建新的资源或进行修改操作。",
                    "put": "用于更新服务器上的资源,一般用于修改已存在的资源的全部内容。",
                    "delete": "用于删除服务器上的资源。"
                }
for method in requestMethods.values():
    print(method)

但是直接对字典取值遍历的使用方式大多数情况下是无意义的。

示例: 通过遍历字典的key,输出每个key对应的值。

requestMethods = {
                    "get": "用于获取服务器上的资源,通过在URL中传递参数来发送请求。",
                    "post": "用于向服务器提交数据,一般用于创建新的资源或进行修改操作。",
                    "put": "用于更新服务器上的资源,一般用于修改已存在的资源的全部内容。",
                    "delete": "用于删除服务器上的资源。"
                }
for method in requestMethods:
    print(f"请求方式【 {method} 】的作用为:【 {requestMethods[method]} 】")

此种方式虽然可以取到结果,但是for-in循环在遍历字符时,配合字典的items()方法,实现更简单的方法

requestMethods = {
                    "get": "用于获取服务器上的资源,通过在URL中传递参数来发送请求。",
                    "post": "用于向服务器提交数据,一般用于创建新的资源或进行修改操作。",
                    "put": "用于更新服务器上的资源,一般用于修改已存在的资源的全部内容。",
                    "delete": "用于删除服务器上的资源。"
                }
for item in requestMethods.items():
    print(f"请求方式【 {item[0]} 】的作用为:【 {item[1]} 】")

甚至,代码还可以配合解包操作,更简单的实现

requestMethods = {
                    "get": "用于获取服务器上的资源,通过在URL中传递参数来发送请求。",
                    "post": "用于向服务器提交数据,一般用于创建新的资源或进行修改操作。",
                    "put": "用于更新服务器上的资源,一般用于修改已存在的资源的全部内容。",
                    "delete": "用于删除服务器上的资源。"
                }
for key, value in requestMethods.items():
    print(f"请求方式【 {key} 】的作用为:【 {value} 】")

作业

回文数实现

def huiwenshu():
    """
    编写一个Python程序,输入一个5位数,
    判断输入的这个数字是否为回文数。
    回文数是指从左到右和从右到左读都一样的数。例如12321。如果输入的是回文数,输出是回文数,否则输出不是回文数。
    :return:
    """
    # 输入一个5位数
    num = str(input("请输入一个5位数:\n"))
    flag = True
    # 判断是否是5位数
    if len(num) == 5:
        # 编辑字符串的一半字符
        for i in range(len(num) // 2):
            if num[i] != num[-i-1]:
                flag = False
                break
        if flag:
            print(f"{num}是一个回文数")
        else:
            print(f"{num}不是一个回文数")
    else:
        print("请输入5位数字!")

image

五、数字序列

range函数

range() 函数是一个用于生成整数序列的内置函数,通过指定起始值、停止值和步长,它能够生成一个按照指定规则递增或递减的整数序列。

range() 通常用于配合for-in循环结构中控制迭代次数或遍历特定范围的情况使用。

range函数的基本语法

格式:range(start, stop, step)

  • start : 可选参数,表示起始值,默认为0。
  • stop : 表示结束值,不包含在范围内。
  • step : 可选参数, 表示步长,默认为1。
# 确定开始和结束范围
nums = list(range(1, 10))
print(nums)

# 使用默认开始值
nums = list(range(10))
print(nums)

# 确定范围和步长
nums = list(range(1, 10, 2))
print(nums)

# 使用负步长
nums = list(range(10, 1, -3))
print(nums)

image

for-in结合range函数实现计次循环

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

示例:计算 1~100 的整数和

result = 0
for i in range(1, 101):
    result += i

print(result)

image

随机数

在程序开发过程中,经常会使用到随机数,Python 中 ,可以使用 random 模块中的 randint() 函数获取随机数。

格式: randint(start, stop)

  • start 为随机数获取初始范围
  • stop 为随机数获取结束范围,包含该值。
  • 使用该函数前需要导入, from random import randint
from random import randint
print(randint(1, 3))

# 输出:3

示例: 骰子游戏: 从键盘输入一个数字,和程序随机生成的 1~6范围的数字比较大小

from random import randint

play = int(input("请输入一个1-6之间的数字:"))
bot = randint(1, 6)

if play == bot:
    print("点数相同,平局")
elif play > bot:
    print(f"玩家{play}点,电脑{bot}点,玩家胜")
else:
    print(f"玩家{play}点,电脑{bot}点,电脑胜")

作业

猜数字

def caishuzi():
    """
    编写一个 Python 程序,实现一个猜数字的游戏。
    程序随机生成一个1-100目标数字,在一定的范围内,玩家需要根据提示猜测目标数字,直到猜中为止。
    游戏会根据玩家的猜测给出提示,告诉玩家猜的数字是大了还是小了,最终告诉玩家猜对了,并显示猜测次数。
    :return:
    """
    bot = randint(1, 101)
    guess_count = 0
    while True:
        num = int(input("请输入猜测数字:\n"))
        guess_count += 1
        if num == bot:
            print(f"猜对了!正确数字是{num}, 猜测次数是{guess_count}")
            break
        elif num > bot:
            print(f"大了,请重新猜")
        else:
            print(f"小了,请重新猜")

image

猜拳游戏

def caiquan_game():
    """
    编写一个Python程序,实现一个简单的猜拳游戏。
    玩家和电脑各自选择石头、剪刀或布,根据规则判断胜负关系,并输出比赛结果。
    :return:
    """
    player = input("请输入玩家选择的选项(石头/剪刀/布):")
    bot = random.choice(["石头", "剪刀", "布"])
    print(f"电脑出拳:{bot}")
    if player == bot:
        print("平局")
    elif (player == "石头" and bot == "剪刀") or\
        (player == "剪刀" and bot == "布") or \
        (player == "布" and bot == "石头"):
         print("玩家胜!")

    else:
         print("电脑胜!")

词频次数

def cipin():
    """编写一个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.
    """
    # 大小写统一
    last_text = text.lower()
    # 分单词
    words = last_text.split()
    # 保存单词及次数的字典
    word_count = {}
    for word in words:
        # 去除标点符号
        word = word.strip(",.")
        # 如果单词在保存的字典里,则次数加一
        if word in word_count:
            word_count[word] += 1
        # 如果单词不在保存的字典里,则新增1次
        else:
            word_count[word] = 1
    for word, count in word_count.items():
        print(f"{word}:{count}")

水仙花数

def shuixianhuashu():
    """
    编写一个 Python 程序,找出100-999范围内的水仙花数。
    所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
    例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
    """
    for num in range(100, 1000):
        # 获取百位数
        i = num // 100

        # 获取十位数
        j = num // 10 % 10

        # 获取个位数
        k = num % 10

        if num == i ** 3 + j ** 3 + k ** 3:
            # 输出水仙花数
            print(f"水仙花数为{num}")

image

六、循环嵌套特征

  • 循环嵌套不局限于某种循环形式,可任意相互嵌套
  • 外层循环循环一次,内层循环循环一轮

示例1:使用 for-in 循环遍历二维列表

data = [
    [1,2,3,4,5,6,7,8,9],
    ["A","B","C","D","E"],
    ["Hello","World","Python","Hogwarts"]
]
for item in data:
    for el in item:
        print(el)

image
分组显示:

data = [
        [1, 2, 3, 4, 5, 6, 7, 8, 9],
        ["A", "B", "C", "D", "E"],
        ["Hello", "World", "Python", "Hogwarts"]
    ]
    for item in data:
        for el in item:
            print(el, end=" ")
        print()

image

示例2:使用 while 循环遍历二维列表

data = [
    [1,2,3,4,5,6,7,8,9],
    ["A","B","C","D","E"],
    ["Hello","World","Python","Hogwarts"]
]
l1 = len(data)
i = 0
while i < l1:
    item = data[i]
    l2 = len(item)
    j = 0
    while(j < l2):
        el = item[j]
        print(el)
        j += 1
    i += 1

image

示例3: 输出九九乘法表的结果

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

image

实战作业

  1. 使用 for-in 内嵌 while 访问示例中的二维列表
def forinwhile():
    """使用 `for-in` 内嵌 `while` 访问示例中的二维列表"""
    data = [
        [1, 2, 3, 4, 5, 6, 7, 8, 9],
        ["A", "B", "C", "D", "E"],
        ["Hello", "World", "Python", "Hogwarts"]
    ]
    for item in data:
        i = 0
        length = len(item)
        while i < length:
            el = item[i]
            print(el, end=" ")
            i += 1
        print()

image

  1. 使用 while 内嵌 for-in 访问示例中的二维列表
def whileforin():
    """使用 while 内嵌 for-in 访问示例中的二维列表"""
    data = [
        [1, 2, 3, 4, 5, 6, 7, 8, 9],
        ["A", "B", "C", "D", "E"],
        ["Hello", "World", "Python", "Hogwarts"]
    ]
    i = 0
    length = len(data)
    while i < length:
        item = data[i]
        for el in item:
            print(el, end=" ")
        i += 1
        print()

image

  1. 实现 九九乘法表标准格式输出
def chengfaguocheng():
    for i in range(1, 10):
        for j in range(1, i+1):
            print(f"{i}*{j}={i*j}", end=" ")
        print()

作业

数字组合

def shuzizuhe():
    """
    编写一个 Python 程序,
    输出所有由数字1、2、3、4 组成的互不相同且无重复数字的三位数。
    即个位,十位,百位互不相同且无重复数字。
    """
    for i in range(1, 5):
        for j in range(1, 5):
            for k in range(1, 5):
                if i != j and i != k and j != k:
                    print(f"{i}{j}{k}")

image

七、循环跳转

在使用循环进行实现逻辑时,并不是每次都会将循环执行完毕,或者循环根本没有结束的条件,此时,在循环过程中,期望达到某个条件时,结束循环继续向后执行,此时,就可以使用循环跳转来完成此功能。

Python中提供两种循环跳转语句:

  • break 结束当前循环

  • continue 结束本次循环

在讲解之前,先来了解一种特殊的循环方式。

死循环

死循环是指循环条件恒等为真,循环会一直执行下去,死循环并不是一种错误语法,反之,有效使用死循环可以解决很多问题。但实际使用中,还是要尽量避免死循环的使用。

while True:
    print("Hogwarts!")

一般,在不确定循环次数的情况下,可以使用死循环来实现。比如web服务器监听处理客户端的请求连接,服务器并不知道会有多少客户端会连接,此时就可以使用死循环实现。

示例: 从键盘持续输入数据,每输入一次,将数据添加到列表中保存

data = []
while True:
    d = input("请输入数据:")
    data.append(d)
    print(data)

此程序只为演示死循环的使用方式,并无实际意义。

break 语句

break 语句可以中止当前的while 或for-in循环,无论循环还有多少次没有循环,都会无条件结束循环后,跳转到循环后的语句继续执行。

以生活中的跑步为例,计划跑 5 圈,可是在跑到第 2 圈的时候,接到了室友的电话叫去吃大餐,于是果断停下来,中止跑步,这就相当于使用 break 语句提前中止了循环。

break 语句的语法比较简单,只需要在相应的 while 或 for 语句中加入即可。

前面的示例自用 break 可以优化为,当输入 bye 时,结束输入

data = []
while True:
    d = input("请输入数据:")
    if d == "bye":
        break
    data.append(d)
    print(data)

需要注意的是,break 语句出现在多层循环中时,所处在哪个循环的循环体内,就跳出哪个循环,更外层的循环不受影响。

for i in range(2):
    for j in range(5):
        print("Hello", j)
        if j == 2:
            break

continue 语句

continue 语句的作用用来中止本次循环而提前进入下一次循环中,循环体中未执行完的代码不在执行。

仍然以操场跑步为例,计划跑 5 圈,但是在跑完每圈的前一百米就回到起点重新跑,后面的不太跑了。

for i in range(10):
    print("*" * 10)
    print("i=",i)
    if i % 3 == 0:
        continue
    print("i*10= ", i*10)

大多数情况下,可以通过改变条件的方式,避免continue的使用。而代码更简洁。

for i in range(10):
    print("*" * 10)
    print("i=",i)
    if i % 3 != 0:
        print("i*10= ", i*10)

loop-else

在Python中,不只if 语句可以使用else, 循环语句也可以使用else。

当一个循环没有被break中断而正常循环结束,就会执行else后的代码块。

for i in range(5):
    print(i)
else:
    print("Over")

如果循环被断,则不会执行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("没找到")

八、推导式

Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。

Python 支持各种数据结构的推导式:

  • 元组(tuple)推导式
  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式

元组推导式

元组推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组。

元组推导式基本格式:

(out_exp_res for item in Sequence )

(out_exp_res for item in Sequence if conditional )

  • out_exp_res:生成元素表达式,可以是有返回值的函数。
  • for out_exp in Sequence:迭代 Sequence 将 out_exp 传入到 out_exp_res 表达式中。
  • if condition:条件语句,可以过滤Sequence中不符合条件的值。
# 简单的元组推导式
t1 = (x for x in range(1,10))
# 生成128位ASCII码元组
t2 = (chr(x) for x in range(128))
# 生成100以内能被7整除所有数字的元组
t3 = (x for x in range(100) if x%7==0)
# 生成99乘法表结果元组
t4 = (x*y for x in range(1,10) for y in range(1, x+1))
words = ["apple", "banana", "cherry"]
upper_words = (word.upper() for word in words)

列表推导式

列表推导式与元组推导式的区别:

  • 格式上外部由圆括号包裹的表达式改为中括号

列表推导式格式为:

[out_exp_res for item in Sequence ]

[out_exp_res for item in Sequence if conditional ]

  • out_exp_res:生成元素表达式,可以是有返回值的函数。
  • for out_exp in Sequence:迭代 Sequence 将 out_exp 传入到 out_exp_res 表达式中。
  • if condition:条件语句,可以过滤Sequence中不符合条件的值。
# 简单的元组推导式
l1 = [x for x in range(1,10)]
# 生成128位ASCII码元组
l2 = [chr(x) for x in range(128)]
# 生成100以内能被7整除所有数字的元组
l3 = [x for x in range(100) if x%7==0]
# 生成99乘法表结果元组
l4 = [x*y for x in range(1,10) for y in range(1, x+1)]
# 将列表中的字符串转换为大写
words = ["apple", "banana", "cherry"]
upper_words = [word.upper() for word in words]

字典推导式

字典推导式与前两种推导式的区别

  • 推导式使用花括号包裹
  • 结果表达式需要使用 key-value 形式

字典推导基本格式:

{ key_expr: value_expr for value in collection }

{ key_expr: value_expr for value in collection if condition }

names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
# 将列表中各字符串值为键,各字符串的长度为值,组成键值对
newdict = {name:len(name) for name in names}

集合推导式

集合推导式与字典推导式的区别在于结果表达式是单一结果,不是key-value形式。

集合推导式基本格式:

{ expression for item in Sequence }{ expression for item in Sequence if conditional }

data = ['Bob','123','Tom','ab123','alice','123abc','Jerry','456','Wendy','554','Smith']
# 筛选列表中的数字字符串
newset = {n for n in data if n.isdigit()}

推导式的优点

  • 简洁高效:推导式允许在一行代码中完成复杂的生成操作,避免了使用显式的循环和临时变量的繁琐过程。这样可以大大减少代码量,并提高编码效率。
  • 可读性好:推导式使用简洁的语法,将迭代、条件判断和表达式结合在一起,使得代码更加紧凑和易于理解。它提供了一种清晰、直观的方式来表达列表生成的逻辑,使得代码更加可读性强,降低了出错的可能性。
  • 灵活性强:推导式非常灵活,可以根据需要添加条件判断、多个迭代变量和嵌套结构,以满足不同的需求。这使得推导式适用于各种场景,从简单的数据转换到复杂的筛选和操作,都可以通过简单而直观的语法实现。

总的来说,推导式提供了一种简洁高效、可读性好和灵活性强的方法来处理列表数据。它是Python中强大而常用的特性之一,为开发者提供了更好的编码体验和效率。