Python循环语句详解

循环语句是Python编程中用于重复执行一段代码的核心结构。Python提供了多种循环语句,主要包括for循环和while循环。本文将详细介绍Python循环语句的特性、用法和最佳实践。

一、循环概述

1. 什么是循环?

循环是编程语言中用于重复执行一段代码块的结构。当需要多次执行相同或相似的操作时,可以使用循环语句来简化代码,提高效率。

2. Python的循环类型

Python主要提供两种循环类型:

  • for循环:用于遍历序列(如列表、元组、字符串)或可迭代对象
  • while循环:当条件为True时重复执行代码块

3. 循环的基本原理

循环的基本原理是:

  1. 检查循环条件(for循环的可迭代对象是否还有元素,while循环的条件表达式是否为True)
  2. 如果条件满足,执行循环体中的代码块
  3. 更新循环状态(for循环移动到下一个元素,while循环可能需要手动更新条件)
  4. 重复步骤1-3,直到条件不满足

二、for循环

1. 基本语法

for循环用于遍历序列或可迭代对象,基本语法如下:

# for循环的基本语法
for 变量 in 可迭代对象:
    # 循环体代码块
    代码1
    代码2
    ...

其中,可迭代对象包括列表、元组、字符串、range对象、字典、集合等。

2. 遍历序列

遍历列表

# 遍历列表示例
fruits = ["apple", "banana", "orange", "grape"]

for fruit in fruits:
    print(fruit)

# 输出:
# apple
# banana
# orange
# grape

遍历元组

# 遍历元组示例
numbers = (1, 2, 3, 4, 5)

sum = 0
for num in numbers:
    sum += num

print(f"总和为: {sum}")  # 输出:总和为: 15

遍历字符串

# 遍历字符串示例
word = "python"

for char in word:
    print(char, end=" ")  # 输出:p y t h o n

遍历range对象

range()函数用于生成一个整数序列,常用于for循环中控制循环次数:

# 遍历range对象示例

# range(5) 生成 0, 1, 2, 3, 4
for i in range(5):
    print(i)

# range(1, 6) 生成 1, 2, 3, 4, 5
for i in range(1, 6):
    print(i)

# range(1, 10, 2) 生成 1, 3, 5, 7, 9
for i in range(1, 10, 2):
    print(i)

# range(5, 0, -1) 生成 5, 4, 3, 2, 1
for i in range(5, 0, -1):
    print(i)

3. 遍历字典

遍历字典可以通过keys()values()items()方法:

# 遍历字典示例
person = {
    "name": "张三",
    "age": 30,
    "city": "北京",
    "email": "zhangsan@example.com"
}

# 遍历字典的键
print("遍历字典的键:")
for key in person:
    print(key)

# 或者使用keys()方法
for key in person.keys():
    print(key)

# 遍历字典的值
print("\n遍历字典的值:")
for value in person.values():
    print(value)

# 遍历字典的键值对
print("\n遍历字典的键值对:")
for key, value in person.items():
    print(f"{key}: {value}")

4. 遍历集合

# 遍历集合示例
colors = {"red", "green", "blue", "yellow"}

for color in colors:
    print(color)

# 注意:集合是无序的,每次遍历的顺序可能不同

5. 嵌套for循环

嵌套for循环是指在一个for循环的循环体中包含另一个for循环:

# 嵌套for循环示例

# 打印乘法表
for i in range(1, 10):
    for j in range(1, i + 1):
        print(f"{j}×{i}={i * j}", end="\t")
    print()  # 换行

# 输出:
# 1×1=1
# 1×2=2	2×2=4
# 1×3=3	2×3=6	3×3=9
# ...

# 遍历二维列表
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

for row in matrix:
    for num in row:
        print(num, end=" ")
    print()

# 输出:
# 1 2 3
# 4 5 6
# 7 8 9

三、while循环

1. 基本语法

while循环当条件为True时重复执行代码块,基本语法如下:

# while循环的基本语法
while 条件表达式:
    # 循环体代码块
    代码1
    代码2
    ...
    # 更新条件(避免无限循环)
    更新语句

2. 使用示例

# while循环示例

# 打印1到5的数字
count = 1
while count <= 5:
    print(count)
    count += 1  # 更新条件,避免无限循环

# 输出:
# 1
# 2
# 3
# 4
# 5

# 计算1到100的和
sum = 0
num = 1
while num <= 100:
    sum += num
    num += 1

print(f"1到100的和为: {sum}")  # 输出:1到100的和为: 5050

# 猜数字游戏
import random

secret_number = random.randint(1, 100)
guess = 0
attempts = 0

while guess != secret_number:
    guess = int(input("请输入你猜测的数字(1-100): "))
    attempts += 1
    if guess < secret_number:
        print("猜小了")
    elif guess > secret_number:
        print("猜大了")
    else:
        print(f"恭喜你,猜对了!你共尝试了{attempts}次")

3. 无限循环

当while循环的条件始终为True时,会导致无限循环。在某些情况下,这是有意为之的,但通常应该避免:

# 无限循环示例

# 有意的无限循环(需要用户中断)
while True:
    user_input = input("请输入内容(输入'quit'退出): ")
    if user_input == "quit":
        break
    print(f"你输入的内容是: {user_input}")

# 无意的无限循环(错误)
count = 1
while count <= 5:
    print(count)
    # 缺少count += 1,导致无限循环

4. 嵌套while循环

嵌套while循环是指在一个while循环的循环体中包含另一个while循环:

# 嵌套while循环示例

# 打印星号三角形
row = 1
while row <= 5:
    col = 1
    while col <= row:
        print("*")
        col += 1
    print()  # 换行
    row += 1

# 输出:
# *
# **
# ***
# ****
# *****

# 寻找两个数的最大公约数
a = int(input("请输入第一个数: "))
b = int(input("请输入第二个数: "))

while b != 0:
    temp = a % b
    while temp != 0:
        a = b
        b = temp
        temp = a % b
    print(f"最大公约数为: {b if b != 0 else a}")
    break

四、循环控制语句

1. break语句

break语句用于终止当前循环,跳出循环体:

# break语句示例

# 在for循环中使用break
fruits = ["apple", "banana", "orange", "grape"]

for fruit in fruits:
    if fruit == "orange":
        print("找到橙子了")
        break
    print(fruit)

# 输出:
# apple
# banana
# 找到橙子了

# 在while循环中使用break
count = 1
while True:
    print(count)
    if count == 5:
        break
    count += 1

# 输出:
# 1
# 2
# 3
# 4
# 5

# 在嵌套循环中使用break(只终止内层循环)
for i in range(1, 4):
    print(f"外层循环: {i}")
    for j in range(1, 4):
        if j == 2:
            break
        print(f"内层循环: {j}")

# 输出:
# 外层循环: 1
# 内层循环: 1
# 外层循环: 2
# 内层循环: 1
# 外层循环: 3
# 内层循环: 1

2. continue语句

continue语句用于跳过当前循环的剩余部分,直接进入下一次循环:

# continue语句示例

# 在for循环中使用continue
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for num in numbers:
    if num % 2 == 0:
        continue  # 跳过偶数
    print(num)  # 只打印奇数

# 输出:
# 1
# 3
# 5
# 7
# 9

# 在while循环中使用continue
count = 0
while count < 10:
    count += 1
    if count % 2 == 0:
        continue  # 跳过偶数
    print(count)  # 只打印奇数

# 输出:
# 1
# 3
# 5
# 7
# 9

# 处理用户输入
while True:
    user_input = input("请输入数字(输入'quit'退出): ")
    if user_input == "quit":
        break
    if not user_input.isdigit():
        print("请输入有效的数字")
        continue
    print(f"你输入的数字是: {user_input}")

3. pass语句

pass语句是一个空操作,不执行任何操作,主要用于占位:

# pass语句示例

# 在for循环中使用pass
for i in range(5):
    pass  # 暂时不实现,占位用

# 在while循环中使用pass
count = 0
while count < 5:
    pass  # 暂时不实现,占位用
    count += 1

# 在条件语句中使用pass
age = 18
if age >= 18:
    pass  # 暂时不实现成年后的逻辑
else:
    print("未成年")

# 在函数中使用pass
def my_function():
    pass  # 暂时不实现函数体

# 在类中使用pass
class MyClass:
    pass  # 暂时不实现类的内容

4. else子句

Python的循环语句可以带有else子句,当循环正常结束时(即没有被break语句终止),会执行else子句中的代码:

# else子句示例

# 在for循环中使用else
for i in range(5):
    print(i)
else:
    print("循环正常结束")

# 输出:
# 0
# 1
# 2
# 3
# 4
# 循环正常结束

# 在for循环中使用break,else子句不会执行
for i in range(5):
    if i == 3:
        break
    print(i)
else:
    print("循环正常结束")

# 输出:
# 0
# 1
# 2

# 在while循环中使用else
count = 1
while count <= 5:
    print(count)
    count += 1
else:
    print("循环正常结束")

# 输出:
# 1
# 2
# 3
# 4
# 5
# 循环正常结束

# 在while循环中使用break,else子句不会执行
count = 1
while count <= 5:
    if count == 3:
        break
    print(count)
    count += 1
else:
    print("循环正常结束")

# 输出:
# 1
# 2

# 使用else子句检查素数
def is_prime(num):
    if num <= 1:
        return False
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            return False
    else:
        # 循环正常结束,说明num是素数
        return True

print(is_prime(7))  # True
print(is_prime(12))  # False

五、循环的高级特性

1. 列表推导式

列表推导式是一种简洁创建列表的方法,可以替代简单的for循环:

# 列表推导式示例

# 基本列表推导式
# 传统方法
numbers = []
for i in range(1, 6):
    numbers.append(i)
print(numbers)  # [1, 2, 3, 4, 5]

# 列表推导式
numbers = [i for i in range(1, 6)]
print(numbers)  # [1, 2, 3, 4, 5]

# 带有条件的列表推导式
# 传统方法
evens = []
for i in range(1, 11):
    if i % 2 == 0:
        evens.append(i)
print(evens)  # [2, 4, 6, 8, 10]

# 列表推导式
evens = [i for i in range(1, 11) if i % 2 == 0]
print(evens)  # [2, 4, 6, 8, 10]

# 嵌套列表推导式
# 传统方法
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = []
for row in matrix:
    for num in row:
        flattened.append(num)
print(flattened)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 列表推导式
flattened = [num for row in matrix for num in row]
print(flattened)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 带有条件的嵌套列表推导式
# 传统方法
squares = []
for i in range(1, 11):
    if i % 2 == 0:
        squares.append(i ** 2)
print(squares)  # [4, 16, 36, 64, 100]

# 列表推导式
squares = [i ** 2 for i in range(1, 11) if i % 2 == 0]
print(squares)  # [4, 16, 36, 64, 100]

2. 字典推导式

字典推导式是一种简洁创建字典的方法:

# 字典推导式示例

# 基本字典推导式
# 传统方法
squares = {}
for i in range(1, 6):
    squares[i] = i ** 2
print(squares)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# 字典推导式
squares = {i: i ** 2 for i in range(1, 6)}
print(squares)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# 带有条件的字典推导式
# 传统方法
even_squares = {}
for i in range(1, 11):
    if i % 2 == 0:
        even_squares[i] = i ** 2
print(even_squares)  # {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}

# 字典推导式
even_squares = {i: i ** 2 for i in range(1, 11) if i % 2 == 0}
print(even_squares)  # {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}

# 从两个列表创建字典
# 传统方法
keys = ["name", "age", "city"]
values = ["张三", 30, "北京"]
person = {}
for k, v in zip(keys, values):
    person[k] = v
print(person)  # {'name': '张三', 'age': 30, 'city': '北京'}

# 字典推导式
person = {k: v for k, v in zip(keys, values)}
print(person)  # {'name': '张三', 'age': 30, 'city': '北京'}

# 转换字典的键值对
# 传统方法
original = {"a": 1, "b": 2, "c": 3}
reversed_dict = {}
for k, v in original.items():
    reversed_dict[v] = k
print(reversed_dict)  # {1: 'a', 2: 'b', 3: 'c'}

# 字典推导式
reversed_dict = {v: k for k, v in original.items()}
print(reversed_dict)  # {1: 'a', 2: 'b', 3: 'c'}

3. 集合推导式

集合推导式是一种简洁创建集合的方法:

# 集合推导式示例

# 基本集合推导式
# 传统方法
squares = set()
for i in range(1, 6):
    squares.add(i ** 2)
print(squares)  # {1, 4, 9, 16, 25}

# 集合推导式
squares = {i ** 2 for i in range(1, 6)}
print(squares)  # {1, 4, 9, 16, 25}

# 带有条件的集合推导式
# 传统方法
even_squares = set()
for i in range(1, 11):
    if i % 2 == 0:
        even_squares.add(i ** 2)
print(even_squares)  # {4, 16, 36, 64, 100}

# 集合推导式
even_squares = {i ** 2 for i in range(1, 11) if i % 2 == 0}
print(even_squares)  # {4, 16, 36, 64, 100}

# 从字符串创建集合(去重)
# 传统方法
word = "hello"
unique_chars = set()
for char in word:
    unique_chars.add(char)
print(unique_chars)  # {'h', 'e', 'l', 'o'}

# 集合推导式
unique_chars = {char for char in word}
print(unique_chars)  # {'h', 'e', 'l', 'o'}

# 嵌套集合推导式
# 传统方法
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
unique_nums = set()
for row in matrix:
    for num in row:
        unique_nums.add(num)
print(unique_nums)  # {1, 2, 3, 4, 5, 6, 7, 8, 9}

# 集合推导式
unique_nums = {num for row in matrix for num in row}
print(unique_nums)  # {1, 2, 3, 4, 5, 6, 7, 8, 9}

4. 生成器表达式

生成器表达式是一种简洁创建生成器的方法,与列表推导式类似,但使用圆括号:

# 生成器表达式示例

# 基本生成器表达式
# 列表推导式(创建完整列表)
squares_list = [i ** 2 for i in range(1, 6)]
print(squares_list)  # [1, 4, 9, 16, 25]
print(type(squares_list))  # <class 'list'>

# 生成器表达式(创建生成器)
squares_gen = (i ** 2 for i in range(1, 6))
print(squares_gen)  # <generator object <genexpr> at 0x...>
print(type(squares_gen))  # <class 'generator'>

# 遍历生成器
for square in squares_gen:
    print(square)
# 输出:
# 1
# 4
# 9
# 16
# 25

# 带有条件的生成器表达式
# 传统方法
even_gen = (i for i in range(1, 11) if i % 2 == 0)
for num in even_gen:
    print(num)
# 输出:
# 2
# 4
# 6
# 8
# 10

# 生成器表达式的优势(节省内存)
import sys

# 列表推导式占用的内存
list_comp = [i for i in range(1000000)]
print(f"列表推导式占用内存: {sys.getsizeof(list_comp)} 字节")

# 生成器表达式占用的内存
gen_expr = (i for i in range(1000000))
print(f"生成器表达式占用内存: {sys.getsizeof(gen_expr)} 字节")

# 处理大文件
def read_large_file(file_path):
    with open(file_path, 'r') as file:
        lines = (line.strip() for line in file)  # 生成器表达式
        for line in lines:
            yield line

# 遍历生成器
# for line in read_large_file('large_file.txt'):
#     process_line(line)

六、循环的性能分析

1. 时间复杂度

循环的时间复杂度主要取决于循环体的执行次数:

循环类型 时间复杂度 描述
简单for循环 O(n) 遍历n个元素
嵌套for循环 O(n*m) 外层循环n次,内层循环m次
while循环(固定次数) O(n) 执行n次循环体
while循环(条件满足概率递减) O(log n) 如二分查找
无限循环 O(∞) 永远执行

2. 性能优化建议

  • 优先使用内置函数和方法,它们通常是用C实现的,比Python代码快
  • 避免在循环体中执行耗时操作
  • 减少循环体内的函数调用次数
  • 使用局部变量代替全局变量,局部变量的访问速度更快
  • 对于大型数据集,使用生成器表达式代替列表推导式,节省内存
  • 避免在循环中重复计算不变的值

3. 性能比较示例

# 性能比较示例

import time

# 使用for循环和append()方法
start_time = time.time()
result = []
for i in range(1000000):
    result.append(i)
end_time = time.time()
print(f"for循环和append(): {end_time - start_time:.6f}秒")

# 使用列表推导式
start_time = time.time()
result = [i for i in range(1000000)]
end_time = time.time()
print(f"列表推导式: {end_time - start_time:.6f}秒")

# 使用range()直接转换为列表
start_time = time.time()
result = list(range(1000000))
end_time = time.time()
print(f"list(range()): {end_time - start_time:.6f}秒")

# 内置函数vs自定义函数
def square(n):
    return n ** 2

start_time = time.time()
result = [square(i) for i in range(1000000)]
end_time = time.time()
print(f"自定义函数: {end_time - start_time:.6f}秒")

start_time = time.time()
result = [i ** 2 for i in range(1000000)]
end_time = time.time()
print(f"内置运算符: {end_time - start_time:.6f}秒")

七、循环的最佳实践

1. 代码可读性

  • 使用有意义的变量名
  • 保持循环体简洁,一个循环只做一件事
  • 避免过多的嵌套(通常不超过3层)
  • 使用空行分隔不同的代码块
  • 添加注释说明循环的目的

2. 避免常见的错误

  • 避免无限循环,确保循环条件会最终变为False
  • 避免在循环中修改正在遍历的序列
  • 确保循环变量在循环结束后不会被意外使用
  • 避免在循环中重复计算不变的值

3. 示例对比

# 不好的写法
def calculate_sum(numbers):
    total = 0
    for i in range(len(numbers)):
        total += numbers[i]
    return total

# 好的写法
def calculate_sum(numbers):
    total = 0
    for num in numbers:
        total += num
    return total

# 更好的写法
def calculate_sum(numbers):
    return sum(numbers)

# 不好的写法
result = []
for i in range(10):
    if i % 2 == 0:
        result.append(i * 2)

# 好的写法
result = [i * 2 for i in range(10) if i % 2 == 0]

# 不好的写法
for i in range(len(fruits)):
    if fruits[i] == "apple":
        print("找到苹果了")
        break

# 好的写法
for fruit in fruits:
    if fruit == "apple":
        print("找到苹果了")
        break

八、常见错误

1. 无限循环

# 无限循环示例

# 错误:缺少循环变量的更新
count = 1
while count <= 5:
    print(count)
    # 缺少count += 1,导致无限循环

# 错误:条件永远为True
while True:
    print("无限循环")
    # 缺少break语句,导致无限循环

# 正确的写法
count = 1
while count <= 5:
    print(count)
    count += 1  # 更新循环变量

while True:
    user_input = input("请输入内容(输入'quit'退出): ")
    if user_input == "quit":
        break  # 提供退出条件
    print(f"你输入的内容是: {user_input}")

2. 循环条件错误

# 循环条件错误示例

# 错误:使用赋值运算符代替比较运算符
count = 1
while count = 5:  # 错误,应该使用==
    print(count)
    count += 1

# 错误:条件表达式错误
numbers = [1, 2, 3, 4, 5]
for i in numbers:
    if i > 10  # 缺少冒号
        break
    print(i)

# 正确的写法
count = 1
while count == 5:  # 使用==
    print(count)
    count += 1

for i in numbers:
    if i > 10:  # 添加冒号
        break
    print(i)

3. 索引错误

# 索引错误示例

# 错误:索引超出范围
numbers = [1, 2, 3, 4, 5]
for i in range(6):  # 错误,列表只有5个元素,索引0-4
    print(numbers[i])

# 错误:修改正在遍历的列表
numbers = [1, 2, 3, 4, 5]
for i in numbers:
    if i == 3:
        numbers.remove(i)  # 修改正在遍历的列表,可能导致不可预期的结果
    print(i)

# 正确的写法
numbers = [1, 2, 3, 4, 5]
for i in range(len(numbers)):
    if i < 5:  # 确保索引不超出范围
        print(numbers[i])

# 或者直接遍历列表
for num in numbers:
    print(num)

# 修改列表的正确方法
numbers = [1, 2, 3, 4, 5]
# 创建一个新列表
new_numbers = [i for i in numbers if i != 3]
print(new_numbers)  # [1, 2, 4, 5]

4. 变量作用域问题

# 变量作用域问题示例

# 错误:在循环体外使用循环变量
for i in range(5):
    print(i)
print(f"循环结束后的i值: {i}")  # 在Python中这是允许的,但不推荐

# 错误:在嵌套循环中使用相同的变量名
for i in range(3):
    print(f"外层循环i: {i}")
    for i in range(2):
        print(f"内层循环i: {i}")
    print(f"外层循环i: {i}")  # 内层循环修改了外层循环的变量i

# 正确的写法
# 使用不同的变量名
i = None  # 在循环外初始化变量
for i in range(5):
    print(i)
print(f"循环结束后的i值: {i}")

# 在嵌套循环中使用不同的变量名
for i in range(3):
    print(f"外层循环i: {i}")
    for j in range(2):
        print(f"内层循环j: {j}")
    print(f"外层循环i: {i}")  # i的值保持不变

九、总结

Python的循环语句是编程中实现重复操作的核心结构,主要包括:

  1. for循环:用于遍历序列或可迭代对象

    • 遍历列表、元组、字符串、range对象
    • 遍历字典、集合
    • 嵌套for循环
  2. while循环:当条件为True时重复执行代码块

    • 基本语法
    • 无限循环
    • 嵌套while循环
  3. 循环控制语句

    • break语句:终止循环
    • continue语句:跳过当前循环的剩余部分
    • pass语句:占位用,不执行任何操作
    • else子句:循环正常结束时执行
  4. 循环的高级特性

    • 列表推导式:简洁创建列表
    • 字典推导式:简洁创建字典
    • 集合推导式:简洁创建集合
    • 生成器表达式:节省内存的生成器创建方法
  5. 循环的性能分析

    • 时间复杂度
    • 性能优化建议
  6. 循环的最佳实践

    • 代码可读性的提升
    • 避免常见的错误

在使用循环语句时,应注意:

  • 保持代码的可读性
  • 避免无限循环
  • 确保循环条件正确
  • 避免索引错误
  • 合理使用循环控制语句
  • 利用高级特性简化代码

通过掌握Python的循环语句,可以编写出更高效、更灵活的程序。


发布网站:荣殿教程(zhangrongdian.com)

作者:张荣殿