作为一名从零开始学习Python的开发者,掌握基础语法只是第一步。真正让代码"活"起来的,是程序控制语句——它们就像是代码的神经系统,赋予程序判断和重复执行的能力。我在实际开发中发现,90%的业务逻辑都是通过条件判断和循环来实现的。
程序控制语句主要分为三大类:
新手常见误区:很多初学者会忽视缩进的规范性,导致代码无法正常运行。Python对缩进的要求极其严格,这是与其他语言最大的区别之一。
if语句是条件判断的基础,其核心语法结构如下:
python复制if 条件表达式:
# 条件为True时执行的代码
这里有几个关键细节需要注意:
实际开发中,我经常看到这样的错误案例:
python复制# 错误示例:缺少冒号
if x > 0
print("正数")
# 错误示例:缩进不一致
if x > 0:
print("正数")
print("这个缩进不对") # 会引发IndentationError
Python中的布尔值只有两个:True和False(注意首字母大写)。在条件判断中,我们可以使用比较运算符构建复杂的逻辑:
python复制# 基本比较运算
a == b # 等于
a != b # 不等于
a > b # 大于
a < b # 小于
a >= b # 大于等于
a <= b # 小于等于
# 组合条件
if a > 0 and b < 10: # 同时满足
if a > 0 or b < 10: # 满足其一
if not a > 0: # 取反
我在实际项目中发现,合理使用括号可以显著提高复杂条件的可读性:
python复制# 推荐写法
if (a > 0 and b < 10) or (c == "特殊状态"):
# 执行逻辑
# 不推荐写法(容易混淆优先级)
if a > 0 and b < 10 or c == "特殊状态":
# 执行逻辑
当需要处理多种情况时,可以使用if-elif-else结构:
python复制score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "D"
专业建议:elif条件的顺序很重要,Python会从上到下依次检查条件,一旦某个条件满足,就会执行对应的代码块并跳过其余条件。因此,应该把最可能满足的条件放在前面,提高执行效率。
对于简单的条件赋值,可以使用更简洁的三元运算符:
python复制# 传统写法
if x > 0:
result = "正数"
else:
result = "非正数"
# 三元运算符写法
result = "正数" if x > 0 else "非正数"
我在代码审查中发现,过度使用三元运算符会降低可读性,建议仅在逻辑简单时使用。
for循环是Python中最常用的循环结构,特别适合遍历序列(如列表、字符串等):
python复制# 遍历字符串
for char in "Python":
print(char)
# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
range()是for循环的黄金搭档,可以生成数字序列:
python复制# 生成0-4
for i in range(5):
print(i) # 输出0,1,2,3,4
# 生成5-9
for i in range(5, 10):
print(i) # 输出5,6,7,8,9
# 生成0,3,6,9
for i in range(0, 10, 3):
print(i) # 输出0,3,6,9
性能提示:在Python 3中,range()返回的是一个可迭代对象,而不是实际的列表。这意味着range(1000000)不会立即占用大量内存,只有在需要时才会生成数字。
while循环在条件为True时持续执行:
python复制count = 0
while count < 5:
print(count)
count += 1 # 不要忘记更新条件变量!
新手常犯的错误是忘记更新条件变量,导致无限循环:
python复制# 危险!无限循环
count = 0
while count < 5:
print(count)
# 忘记 count += 1
python复制# break示例
for i in range(10):
if i == 5:
break
print(i) # 输出0,1,2,3,4
# continue示例
for i in range(10):
if i % 2 == 0:
continue
print(i) # 输出1,3,5,7,9
我在实际项目中经常使用这些技巧来处理特殊情况,比如遇到无效数据时跳过当前迭代。
Python循环有一个独特的else子句,在循环正常完成(没有被break中断)时执行:
python复制for i in range(5):
print(i)
else:
print("循环正常结束")
# 如果被break中断,else不会执行
for i in range(5):
if i == 3:
break
print(i)
else:
print("这行不会执行")
这个特性在搜索场景中特别有用,比如检查一个列表是否包含特定元素:
python复制items = [1, 3, 5, 7, 9]
search = 4
for item in items:
if item == search:
print("找到元素")
break
else:
print("未找到元素") # 搜索失败时的处理
异常处理让程序能够优雅地应对错误情况:
python复制try:
age = int(input("请输入年龄: "))
print(f"你的年龄是: {age}")
except ValueError:
print("请输入有效的数字!")
可以针对不同类型的异常提供不同的处理:
python复制try:
num = int(input("输入一个数字: "))
result = 100 / num
except ValueError:
print("请输入有效的数字!")
except ZeroDivisionError:
print("不能除以零!")
except Exception as e: # 捕获所有其他异常
print(f"发生未知错误: {e}")
无论是否发生异常,finally中的代码都会执行:
python复制try:
file = open("data.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("文件不存在")
finally:
file.close() # 确保文件总是被关闭
在实际开发中,我推荐使用with语句来处理资源管理,它会在代码块结束后自动关闭资源:
python复制# 更优雅的文件处理方式
try:
with open("data.txt", "r") as file:
content = file.read()
print(content)
except FileNotFoundError:
print("文件不存在")
让我们把学到的知识应用到一个实际场景中——超市收银系统:
python复制while True:
try:
# 获取商品重量
weight = float(input("请输入白菜的重量(kg): "))
# 计算价格
unit_price = 2.5 # 单价
if weight < 2:
discount = 0.9 # 9折
elif weight < 4:
discount = 0.8 # 8折
elif weight < 10:
discount = 0.6 # 6折
else:
discount = 0.4 # 4折
total = weight * unit_price * discount
print(f"请付款: {total:.2f}元") # 保留两位小数
# 继续服务下一位顾客
print("下一位顾客...")
except ValueError:
print("输入无效,请输入数字")
except KeyboardInterrupt:
print("\n收银系统已关闭")
break
这个案例融合了我们学到的所有控制语句:
列表推导式是Python的一大特色,可以简洁地生成列表:
python复制# 传统写法
squares = []
for x in range(10):
squares.append(x**2)
# 列表推导式写法
squares = [x**2 for x in range(10)]
还可以加入条件判断:
python复制even_squares = [x**2 for x in range(10) if x % 2 == 0]
过多的嵌套会降低代码可读性。当发现代码嵌套超过3层时,考虑重构:
python复制# 不推荐:嵌套过深
if condition1:
if condition2:
if condition3:
# 业务逻辑
# 推荐:使用早期返回或拆分函数
if not condition1:
return
if not condition2:
return
# 主逻辑
在遍历序列时如果需要索引,可以使用enumerate:
python复制fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
当需要同时遍历多个序列时,zip函数非常有用:
python复制names = ['Alice', 'Bob', 'Charlie']
scores = [85, 92, 78]
for name, score in zip(names, scores):
print(f"{name}: {score}")
Python对缩进极其敏感。常见错误包括:
建议:
处理大数据集时,循环可能成为性能瓶颈。优化建议:
我在实际开发中最常用的调试方法是"二分法":通过注释掉部分代码,逐步缩小问题范围。