今天来学习条件语句和循环
条件语句
学完数据结构之后,我们来学习条件语句。基本语法结构:
1.if语句
当条件为True时执行特定的代码块(缩进部分)如果条件为False则跳过特定的代码块(缩进部分)
比如:
password=int(input())
if password == 8888: # 条件为 True 时执行的代码(注意缩进)
print('登陆成功')
2.if-else语句
如果if判断为False,不执行if的缩进,执行elsepassword=int(input())
if password == 8888: # 条件为 True 时执行的代码(注意缩进)
print('登陆成功')
else:
print('登录失败')
缩进通常为四格(Tab键),不要忘记:
3.if-elif-else语句
如果只有两种判断还是太简单了,所以可以用elif来做更细致的判断。下面来写一个完整的判断:
# 获取用户输入并去除前后空格
password = input("请输入密码:").strip()
# 先判断是否为空输入
if not password:
print("请输入密码")
# 尝试判断密码是否正确(假设正确密码是8888)
elif password == "8888":
print("登录成功")
# 其他情况均视为密码错误
else:
print("登录失败")
分析一下:
1.改用字符串更严谨,因为如果用户忘记输入密码直接回车的时候,如果是空字符串可以执行,但是空格是不能被转换为整数的,会报错ValueError。
2.首先判断用户是否直接回车(空输入),如果为空输入也就是空字符串,password判断为False,再加上not,所以当输入为空的时候,if条件为True,执行if条件的特定代码块。
3.密码正确执行elif,错误执行else。
elif是else if的缩写,可以写多个elif,但if和else只能有一个。
关于条件语句,从上往下依次判断,如果某个判断为True,就执行它的缩进,然后忽略掉后面的elif和else
再举个例子:
score = 85
# 判断成绩等级
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 60:
print("及格")
else:
print("不及格")
# 输出:良好
布尔表达式:
只要返回的值是布尔值(True/False),则为布尔表达式。比如比较运算(<、>、==、!=)、逻辑运算(and、or、not),不包括四则运算。在进行比较运算的时候,要注意数据类型是否统一。
嵌套条件:
条件语句可以嵌套,实现更复杂的判断逻辑,比如:age = 17
id = True
if age >= 18:
print("已成年")
if id:
print("可以进入")
else:
print("请出示身份证")
else:
print("未成年,不能进入")
# 输出:未成年,不能进入
格外情况:
a = 1
if a:
… print(‘True’)
当if后面这个数是一个非零非空(非零值、非空字符串、非空列表…相当于不是None、不为0)的值时,就判断为True,否则为False。
match语句:
当我们针对某个变量匹配若干情况时,可以用match语句:match 变量:
case 模式1:
# 变量匹配模式1时执行
case 模式2:
# 变量匹配模式2时执行
case _: # 通配符,匹配所有未被前面模式匹配的情况
# 默认执行
case _表示任意值
匹配值:
匹配具体值
status = 200
match status:
… case 200:
print(“请求成功”)
…case 404:
print(“资源未找到”)
… case 500:
print(“服务器错误”)
… case _:
print(“未知状态码”)
匹配数据结构:
匹配数据结构(解构)
point = (3, 4)
match point:
… case (0, 0):
print(“原点”)
…case (x, 0):
print(f"在x轴上,x={x}“)
…case (0, y):
print(f"在y轴上,y={y}”)
…case (x, y):
print(f"在平面上,坐标({x},{y})")
在match语句中的case模式中,x、y这样的名称相当于模式变量,不需要提前定义
当执行case(x,0)的时候,会自动执行:
1.检查point是否包含两个元素的元组
2.检查第二个元素是否为0
3.如果匹配成功,会自动将第一个元素的值赋值给变量x(即使x未被定义)
这种机制叫解构赋值,允许在匹配模式的同时提取数据。模式变量会在匹配成功时被临时创建,仅在case块有效。
这种语法让代码更简洁,无需提前定义变量,也无需手动提取元组中的元素
匹配列表:
`match` 匹配列表的关键规则:1.列表模式需要和 args
的「元素顺序」完全对应
2.用 *变量名
表示「捕获剩余所有元素」
3.模式中的固定值(如 'gcc'
、'clean'
)必须完全相等才会匹配
args = ['gcc', 'hello.c', 'world.c']
# args = ['clean']
# args = ['gcc']
match args:
# 如果仅出现gcc,报错:
case ['gcc']:
print('gcc: missing source file(s).')
# 出现gcc,且至少指定了一个文件:
case ['gcc', file1, *files]:
print('gcc compile: ' + file1 + ', ' + ', '.join(files))
# 仅出现clean:
case ['clean']:
print('clean')
case _:
print('invalid command.')
第一个case:表示列表里面只有一个’gcc’字符串,没有指定文件名
第二个case:表示了列表第一个字符串,第二个字符串绑定到file1,后面任意个字符串绑定到*files(*是函数的参数),表示至少指定一个文件
第三个case:表示列表仅有’clean’一个字符串
第四个case:表示其它所有的情况
由此可见match语句更加简洁方便,如果用if语句,会很麻烦:
args = ['gcc', 'hello.c', 'world.c']
if args == ['gcc']:
print('gcc: missing source file(s).')
elif len(args) >=2 and args[0] == 'gcc':
file1 = args[1]
files = args[2:] # 手动截取剩余元素
print(f'gcc compile: {file1}, {", ".join(files)}')
elif args == ['clean']:
print('clean')
else:
print('invalid command.')
复杂匹配:
match语句可以匹配单个值、多个值、或者一定范围,并且把匹配的值给变量:age = 15
match age:
case x if x < 10:
print(f'< 10 years old: {x}')
case 10:
print('10 years old.')
case 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18:
print('11~18 years old.')
case 19:
print('19 years old.')
case _:
print('not sure.')
1.第一个case:表示当age<10的时候成立,且赋值给变量x
2.第二个case:匹配单个值
3.第三个case:匹配多个值,用|分隔。
4.最后一个case_:表示匹配任意值。
if条件语句和match语句对比:
if条件语句判断依据:布尔表达式的真假
灵活性:极高,可处理任意条件
代码简洁性:复杂条件可能冗长
适用场景:任意条件判断(范围、逻辑组合)
match语句
判断依据:变量与模式的匹配关系
灵活性:适合固定模式的匹配,结构更严谨
代码简洁性: 模式清晰时更简洁,尤其适合解构
适用场景: 固定值匹配、数据结构解析、匹配列表、枚举等
关于match语句的枚举,这个后面学到枚举的时候会说。