掌握Python“逻辑中枢”:条件与循环这样用,代码效率翻翻倍
如果把写Python代码比作盖房子,数据类型(列表、字典、字符串等)是砖块水泥,那条件与循环就是房子的承重结构——它控制着代码的执行逻辑,决定了程序“该做什么”“重复做什么”。哪怕你能熟练定义各种数据,若不懂条件与循环的精髓,写出来的代码也会像散架的积木,混乱又低效。今天,我们就从基础用法到进阶技巧,把这门“编程基本功”彻底学透。
一、条件语句:让程序学会“做选择”
生活中我们常做判断:“如果下雨就带伞,否则带墨镜”;程序里的条件语句,就是帮计算机实现这种“选择逻辑”。Python的条件语句语法简洁,但有几个细节必须注意,否则很容易踩坑。
1. 基础结构:if-else,二选一的判断
最经典的条件场景是“二选一”,比如计算绝对值(y=|x|):当x小于0时,y是-x;否则y等于x。用Python代码实现如下:
# 计算绝对值 y = |x|
x = -5 # 可以尝试修改x的值,比如3、0
if x < 0:y = -x # 条件满足时执行这行
else:y = x # 条件不满足时执行这行
print(f"x={x}的绝对值是:{y}")
运行后输出:x=-5的绝对值是:5。这里有两个关键语法规则,新手一定要记牢:
- 不能加括号:和Java、C++不同,Python的if条件后不需要写
(x < 0),直接写x < 0即可; - 必须加冒号:if和else的末尾一定要加
:,这是Python的语法规范,少了会直接报错。
2. 多条件判断:elif,不止二选一
如果需要判断多个条件(比如根据分数评级:90+为A,80-89为B,70-79为C,否则为D),就需要用elif(else if的缩写)来扩展:
# 根据分数评级
score = 85 # 可修改为72、95、60等
if score >= 90:grade = "A(优秀)"
elif score >= 80: # 隐含条件:score < 90grade = "B(良好)"
elif score >= 70: # 隐含条件:score < 80grade = "C(中等)"
else: # 所有条件都不满足时执行(score < 70)grade = "D(待改进)"
print(f"分数{score}对应的评级是:{grade}")
运行后输出:分数85对应的评级是:B(良好)。这里要注意条件的顺序:Python会从上到下依次判断,一旦某个条件满足,就会执行对应的代码并跳出整个条件语句。比如如果把score >=70写在最前面,那85分也会被判定为C,这就完全错了。
3. 避坑指南:这些错误别再犯
新手用条件语句时,常犯3个低级错误,看看你有没有中招:
- 错误1:加多余的括号。比如写
if (score >= 90):,虽然Python不会报错,但这不符合Python的简洁风格,属于“画蛇添足”; - 错误2:漏写冒号。
if score >= 90后面没加:,会直接触发SyntaxError(语法错误); - 错误3:elif/else单独使用。
elif必须跟在if后面,else也不能单独出现,否则会报错。比如直接写elif score >=80:,Python会不知道它对应哪个if。
二、循环语句:让程序学会“重复做”
如果需要重复执行某段代码(比如打印1到10的数字、统计文件里每一行的字数),手动写10次、100次代码显然不现实——这时候就需要循环语句。Python里有两种循环:for循环适合“遍历已知范围”,while循环适合“重复到条件不满足”,用法完全不同。
1. for循环:遍历可迭代对象的“利器”
for循环的核心是“遍历”——比如遍历列表里的每个元素、字符串里的每个字符、range生成的数字序列。它的语法是:for 变量 in 可迭代对象: 执行代码。
示例1:遍历列表,统计偶数个数
假设有一个数字列表,我们要统计其中偶数的数量:
# 遍历列表,统计偶数个数
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
even_count = 0 # 用于记录偶数个数
for num in numbers:if num % 2 == 0: # 判断是否为偶数even_count += 1 # 偶数则计数+1
print(f"列表中共有{even_count}个偶数")
运行后输出:列表中共有4个偶数。这里numbers是“可迭代对象”,num会依次取列表里的每个值,直到遍历完所有元素。
示例2:用range()生成数字序列
如果需要遍历“从1到10”“从0到9步长2”这样的有序数字,用range()函数更方便。range(a, b, step)表示生成“从a到b-1,步长为step”的序列:
# 用range()遍历1到10的奇数
for i in range(1, 11, 2): # 1,3,5,7,9(到11为止,但不包含11)print(i, end=" ") # end=" "让输出不换行,用空格分隔
运行后输出:1 3 5 7 9。
进阶:用enumerate()获取“索引+元素”
有时候我们不仅需要元素的值,还需要它在列表中的位置(索引)。比如要打印“第1个元素是1,第2个元素是2...”,这时候用enumerate()函数可以同时获取索引和元素:
# 用enumerate()获取索引和元素
fruits = ["苹果", "香蕉", "橙子"]
for index, fruit in enumerate(fruits, start=1): # start=1让索引从1开始(默认是0)print(f"第{index}个水果是:{fruit}")
运行后输出:
第1个水果是:苹果
第2个水果是:香蕉
第3个水果是:橙子
如果不用enumerate(),你可能需要手动定义一个索引变量(比如index=0,每次循环index+=1),代码会繁琐很多。
2. while循环:条件满足就一直做
while循环的逻辑是“只要条件满足,就重复执行代码”,适合“不确定循环次数”的场景。比如“让用户输入密码,直到输入正确为止”:
# 密码验证:直到输入正确才退出循环
correct_password = "python123"
while True: # 无限循环,直到遇到breakuser_input = input("请输入密码:")if user_input == correct_password:print("密码正确,欢迎登录!")break # 密码正确,跳出循环else:print("密码错误,请重新输入!")
运行后,只有当你输入“python123”时,循环才会结束。这里的break是循环中的重要关键字,作用是“立即跳出当前循环”。
除了break,还有一个常用关键字continue——它的作用是“跳过当前循环的剩余代码,直接开始下一次循环”。比如“打印1到10,但跳过偶数”:
# 打印1到10,跳过偶数
for num in range(1, 11):if num % 2 == 0:continue # 是偶数就跳过,不执行后面的printprint(num, end=" ")
运行后输出:1 3 5 7 9。注意break和continue的区别:break是“彻底退出循环”,continue是“跳过一次,继续下一次”。
3. 效率对比:for循环比while循环更快
同样的任务,用for循环和while循环实现,效率会有差异。比如“计算1到100000的和”:
import time # 用于计算程序运行时间# 方法1:for循环(用range())
start_time = time.time()
sum_for = 0
for i in range(1, 100001):sum_for += i
end_time = time.time()
print(f"for循环计算结果:{sum_for},耗时:{end_time - start_time:.6f}秒")# 方法2:while循环
start_time = time.time()
sum_while = 0
i = 1
while i <= 100000:sum_while += ii += 1
end_time = time.time()
print(f"while循环计算结果:{sum_while},耗时:{end_time - start_time:.6f}秒")
运行后你会发现:for循环的耗时通常比while循环短。这是因为range()是Python内置的高效序列生成器,而while循环需要手动维护索引变量(i += 1),多了一步操作。所以在能确定循环范围的场景下,优先用for循环。
三、进阶技巧:一行代码搞定条件与循环
Python的一大优势是“简洁”——很多时候,我们可以把条件语句和循环合并成一行代码,既节省篇幅,又能提高可读性(前提是你理解其中的逻辑)。这种写法被称为“列表推导式”(或条件表达式),在实际项目中非常常用。
1. 一行条件表达式:if-else的简写
普通的if-else语句需要写4行(如计算绝对值),而一行条件表达式可以浓缩成:变量 = 表达式1 if 条件 else 表达式2。比如:
x = -3
y = -x if x < 0 else x # 一行实现绝对值计算
print(f"x={x}的绝对值是:{y}") # 输出:x=-3的绝对值是:3
这种写法适合简单的二选一逻辑,复杂的多条件判断(elif)不建议用,否则会让代码难以理解。
2. 一行列表推导式:for+if的结合
如果要生成一个新列表(比如“从1到10的偶数列表”),普通写法需要3行:
# 普通写法:生成1到10的偶数列表
even_numbers = []
for num in range(1, 11):if num % 2 == 0:even_numbers.append(num)
print(even_numbers) # 输出:[2, 4, 6, 8, 10]
而用列表推导式,一行就能搞定:
# 列表推导式:一行生成偶数列表
even_numbers = [num for num in range(1, 11) if num % 2 == 0]
print(even_numbers) # 输出:[2, 4, 6, 8, 10]
它的逻辑是:[要添加的元素 for 变量 in 可迭代对象 if 条件]。再比如“把列表里的字符串全部转成大写”:
fruits = ["apple", "banana", "orange"]
upper_fruits = [fruit.upper() for fruit in fruits]
print(upper_fruits) # 输出:['APPLE', 'BANANA', 'ORANGE']
列表推导式不仅简洁,效率也比普通for循环高——因为它是Python底层优化过的语法,比手动调用append()更快。
3. 注意:别过度追求“一行代码”
虽然一行写法很酷炫,但如果逻辑复杂(比如嵌套多个条件、多层循环),强行压缩成一行会让代码变得“晦涩难懂”。比如下面这个例子:
# 不推荐:逻辑复杂的一行代码
result = [x*y for x in range(1, 4) for y in range(1, 4) if x*y % 2 == 0]
你能一眼看出它在做什么吗?其实它是“计算1-3中两个数的乘积,筛选出偶数并组成列表”。这种情况下,不如拆成普通循环,让代码更易读——毕竟“可读性”比“简洁性”更重要。
四、思考题:检验你的掌握程度
学完上面的内容,来试试这道实战题,巩固一下条件与循环的用法:
题目:给定两个列表,attributes = ["name", "age", "score"](键)和values = [["Alice", 20, 95], ["Bob", 19, 88], ["Charlie", 21, 76]](每组子列表是对应的值),请生成一个“字典列表”,每个字典的结构是{"name": "Alice", "age": 20, "score": 95},最后输出这个列表。
要求:可以用普通循环实现,也可以尝试用列表推导式(挑战一行代码)。
提示:可以用zip(attributes, value)将键和值配对,再转成字典;遍历values中的每一组子列表value。
总结
条件与循环是Python的“逻辑骨架”,掌握它们的核心在于:
- 条件语句:用
if-else做二选一,elif处理多条件,记住“无括号、有冒号”的语法; - 循环语句:
for循环适合遍历(优先用,效率高),while循环适合不确定次数的场景,break/continue灵活控制循环; - 进阶技巧:简单逻辑用“一行条件表达式/列表推导式”,复杂逻辑别强行压缩,可读性优先。
下次写代码时,先想清楚“程序需要做什么选择”“需要重复做什么”,再用条件与循环把逻辑串起来——你会发现,原本混乱的代码会变得条理清晰,效率也会大大提升。
本文由mdnice多平台发布