Python控制流完全指南
Python控制流完全指南:从if判断到循环,一篇就够了
今天我们来聊聊Python编程中最重要的基石之一——控制流。简单来说,控制流决定了你的程序在什么条件下执行什么代码,以及如何重复执行某段代码。掌握它,你就能写出逻辑清晰、功能强大的程序。
一、缩进:Python的“灵魂”与“骨架”
在正式开始之前,我们必须先聊聊Python最独特、也最重要的语法规则:缩进。
在其他编程语言(如C、Java)中,代码块通常用花括号{}来界定。但在Python中,代码块是通过缩进来表示的。同一层级的代码必须拥有相同的缩进量(通常是4个空格或1个Tab)。
为什么缩进如此重要?
- 语法强制:缩进错误会导致程序直接报错
IndentationError,无法运行。 - 代码可读性:强制缩进让代码结构一目了然,强迫开发者写出整洁、规范的代码。
示例:
# 正确的缩进age=18ifage>=18:print("你已经成年了。")# 这行缩进了4个空格,属于if代码块print("欢迎来到成人世界。")# 同样缩进,属于if代码块print("这句话无论age是多少都会执行。")# 没有缩进,与if同级# 错误的缩进# if age >= 18:# print("缩进错误!") # 这行没有缩进,会报错核心规则:
- 使用4个空格作为标准缩进(PEP 8推荐)。
- 不要混用Tab和空格,这会导致难以排查的错误。大多数现代IDE(如PyCharm、VS Code)会自动将Tab转换为空格。
二、if 判断语句:让程序拥有“大脑”
if语句是程序做决策的基础。它根据一个条件(布尔表达式)的真假,来决定是否执行特定的代码块。
1. 基本语法
if条件:条件为真时执行的代码块示例:
score=85ifscore>=60:print("恭喜,考试及格了!")2. if-else 结构
当条件为假时,执行另一段代码。
if条件:条件为真时执行的代码块else:条件为假时执行的代码块示例:
temperature=30iftemperature>25:print("今天很热,开空调吧。")else:print("今天很凉爽,出去走走。")3. if-elif-else 结构
当有多个条件需要依次判断时,使用elif(是else if的缩写)。
if条件1:条件1为真时执行elif条件2:条件1为假且条件2为真时执行elif条件3:条件1和2为假且条件3为真时执行...else:所有条件都为假时执行示例:
score=88ifscore>=90:grade='A'elifscore>=80:grade='B'elifscore>=70:grade='C'elifscore>=60:grade='D'else:grade='F'print(f"你的成绩等级是:{grade}")# 输出:你的成绩等级是:B注意:if-elif-else是从上到下依次判断的,一旦某个条件为真,执行完对应的代码块后,就会跳过整个if-elif-else结构。
三、三元表达式:简洁的条件赋值
三元表达式是if-else的一种简洁写法,常用于根据条件给变量赋值。
语法:
变量=值1if条件else值2如果条件为真,变量被赋值为值1,否则为值2。
示例:
# 传统写法age=20ifage>=18:status="成年人"else:status="未成年人"# 三元表达式写法status="成年人"ifage>=18else"未成年人"print(status)# 输出:成年人适用场景:当if-else结构非常简单,且目的是为了赋值时,使用三元表达式可以让代码更简洁。但不要滥用,过于复杂的嵌套会降低可读性。
四、for 循环:遍历一切可迭代对象
for循环用于遍历一个可迭代对象(如列表、字符串、元组、字典、集合、range等)中的每一个元素。
1. 遍历列表
fruits=["苹果","香蕉","橘子"]forfruitinfruits:print(f"我喜欢吃{fruit}")# 输出:# 我喜欢吃苹果# 我喜欢吃香蕉# 我喜欢吃橘子2. 遍历字符串
forcharin"Python":print(char)# 输出:P y t h o n (每个字母占一行)3. 使用 range() 函数
range()可以生成一个整数序列,常用于指定循环次数。
# range(5) 生成 0, 1, 2, 3, 4foriinrange(5):print(f"这是第{i+1}次循环")# range(2, 6) 生成 2, 3, 4, 5foriinrange(2,6):print(i)# range(1, 10, 2) 生成 1, 3, 5, 7, 9 (步长为2)foriinrange(1,10,2):print(i)4. 遍历字典
student={"name":"小明","age":18,"score":95}# 遍历键forkeyinstudent:print(key)# 输出:name age score# 遍历值forvalueinstudent.values():print(value)# 输出:小明 18 95# 同时遍历键和值forkey,valueinstudent.items():print(f"{key}:{value}")五、while 循环:条件为真,循环不止
while循环会在条件为真时,重复执行代码块,直到条件变为假。
语法:
while条件:循环体代码块示例:
count=0whilecount<5:print(f"当前计数:{count}")count+=1# 重要!必须更新条件,否则会变成无限循环print("循环结束")注意:while循环必须确保条件最终会变为False,否则程序会陷入无限循环。如果程序卡住了,可以按Ctrl+C强制终止。
六、循环控制:break 和 continue
在循环执行过程中,我们有时需要提前退出或跳过某次迭代,这时就需要break和continue。
1. break:立即终止整个循环
break用于完全退出当前所在的循环体,不再执行循环中剩余的迭代。
示例:
# 查找列表中第一个大于10的数字numbers=[3,7,12,5,20]fornuminnumbers:ifnum>10:print(f"找到第一个大于10的数字:{num}")break# 找到后立即退出循环print(f"检查数字:{num},不符合条件")# 输出:# 检查数字:3,不符合条件# 检查数字:7,不符合条件# 找到第一个大于10的数字:122. continue:跳过本次循环,进入下一次
continue用于跳过当前这次迭代中continue之后的所有代码,直接进入下一次循环的判断。
示例:
# 打印1到10之间的所有奇数foriinrange(1,11):ifi%2==0:# 如果是偶数continue# 跳过本次循环,不执行下面的printprint(i)# 输出:1 3 5 7 9 (每个数字占一行)总结区别:
break:终止整个循环。continue:跳过当前这一次,继续下一次。
七、综合示例:猜数字游戏
写一个简单的猜数字游戏。
importrandom# 1. 生成一个1到100之间的随机数target_number=random.randint(1,100)guess_count=0max_attempts=7print("欢迎来到猜数字游戏!")print(f"我已经想好了一个1到100之间的数字,你有{max_attempts}次机会。")# 2. 使用while循环,让玩家可以多次猜测whileguess_count<max_attempts:# 3. 获取玩家输入try:guess=int(input("请输入你的猜测:"))exceptValueError:print("请输入一个有效的整数!")continue# 输入无效,跳过本次循环,不消耗次数guess_count+=1# 4. 使用if-elif-else进行判断ifguess==target_number:print(f"恭喜你!猜对了!就是{target_number}。你用了{guess_count}次。")break# 猜对了,使用break退出循环elifguess<target_number:print("猜小了,再大一点。")else:print("猜大了,再小一点。")# 5. 使用if判断是否还有机会remaining=max_attempts-guess_countifremaining>0:print(f"你还有{remaining}次机会。")else:print(f"很遗憾,机会用完了。正确的数字是:{target_number}")print("游戏结束。")总结
| 概念 | 作用 | 关键点 |
|---|---|---|
| 缩进 | 定义代码块 | 4个空格,同一层级必须对齐 |
| if-elif-else | 条件判断,分支执行 | 从上到下判断,执行一个分支后跳出 |
| 三元表达式 | 简洁的条件赋值 | 值1 if 条件 else 值2 |
| for循环 | 遍历可迭代对象 | 常用于固定次数的循环或遍历集合 |
| while循环 | 条件循环 | 注意更新条件,防止无限循环 |
| break | 立即终止整个循环 | 跳出循环体 |
| continue | 跳过本次循环的剩余部分 | 进入下一次迭代 |