程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

Python 循环中 10 个常见错误及解决方案

hfteth 2025-05-21 13:55:55 技术文章 17 ℃

干货来了


1. 无限循环(未更新循环变量)

# 错误示例
count = 0
while count < 5:
    print(count)  # 忘记 count += 1

修复

while count < 5:
    print(count)
    count += 1  # 确保条件能变为False

2. 修改正在迭代的序列

# 错误示例
words = ["hello", "world", "python"]
for word in words:
    if len(word) < 5:
        words.remove(word)  # 导致跳过元素

修复

# 方法1:迭代副本
for word in words.copy():
    if len(word) < 5:
        words.remove(word)

# 方法2:列表推导式
words = [word for word in words if len(word) >= 5]

3. 误用==代替=

# 错误示例(误将赋值写成比较)
while (status = get_status()) == "running":  # SyntaxError
    pass
# Python 3.8+ 用海象运算符
while (status := get_status()) == "running":
    pass

# 旧版Python
while True:
    status = get_status()
    if status != "running":
        break

4. 循环依赖全局变量

# 错误示例
results = []
def process_data():
    for item in data:  # 依赖未传入的全局变量data
        results.append(item * 2)

修复

def process_data(input_data):  # 显式传入参数
    return [item * 2 for item in input_data]  # 避免修改全局变量

5. 忽略break和continue的作用域

# 错误示例
for i in range(3):
    for j in range(3):
        if i * j == 4:
            break  # 只跳出内层循环
    print(i)       # 外层循环继续执行

修复

# 方法1:设置标志位
stop_flag = False
for i in range(3):
    if stop_flag:
        break
    for j in range(3):
        if i * j == 4:
            stop_flag = True
            break

# 方法2:将循环封装为函数
def find_target():
    for i in range(3):
        for j in range(3):
            if i * j == 4:
                return (i, j)

6. 不必要的嵌套循环

# 错误示例(O(n^2) 时间复杂度)
for x in range(1000):
    for y in range(1000):
        if x + y == 100:
            print(x, y)

优化

# 单层循环实现(O(n))
for x in range(1001):
    y = 100 - x
    if 0 <= y <= 1000:
        print(x, y)

7. 忽略迭代器耗尽

# 错误示例
numbers = iter([1, 2, 3])
for n in numbers:
    print(n)
# 再次迭代无输出
for n in numbers:  # 迭代器已耗尽
    print(n)

修复

numbers = [1, 2, 3]  # 使用列表可重复迭代
# 或重新创建迭代器
numbers = iter([1, 2, 3])

8. 错误处理循环中的异常

# 错误示例(异常导致循环中断)
urls = ["a.com", "b.com", "invalid"]
for url in urls:
    response = requests.get(url)  # 遇到无效URL整个循环终止

修复

for url in urls:
    try:
        response = requests.get(url)
    except requests.RequestException:
        print(f"跳过无效URL: {url}")
        continue  # 继续下一次循环

9. 误用range参数

# 错误示例(反向迭代漏掉首项)
for i in range(5, 0):  # 实际不会执行
    print(i)
for i in range(5, 0, -1):  # 添加步长-1
    print(i)  # 输出5,4,3,2,1

10. 忽略生成器的惰性特性

# 错误示例(生成器只能迭代一次)
squares = (x**2 for x in range(5))
print(sum(squares))  # 30
print(sum(squares))  # 0(生成器已耗尽)

修复

# 方法1:转换为列表
squares = list((x**2 for x in range(5)))

# 方法2:重新创建生成器
def get_squares():
    return (x**2 for x in range(5))
print(sum(get_squares()))

循环调试技巧

  1. 打印关键变量
for i in range(3):
    print(f"[DEBUG] i={i}")  # 跟踪循环状态
  1. 使用 enumerate 定位问题项
for idx, item in enumerate(data):
    if item is None:
        print(f"第{idx}项为空")
  1. 设置安全计数器
max_iterations = 1000
while condition and max_iterations > 0:
    max_iterations -= 1

总结:循环最佳实践

  1. 优先用 for 循环:当迭代次数明确时
  2. 确保循环能终止:检查条件变量是否更新
  3. 避免修改迭代中的集合:操作副本或新建集合
  4. 复杂逻辑封装函数:减少嵌套层次

这些错误覆盖了 90% 的实际开发场景,掌握后能显著提升代码健壮性!

最近发表
标签列表