循环结构是编程中重复执行代码块的机制。在 Python 中,循环允许你:
1.迭代处理数据:遍历列表、字典、文件内容等。
2.自动化重复任务:如批量处理数据、生成序列等。
3.控制执行流程:根据条件决定是否继续或终止循环。
假设你需要打印 1 到 100 的所有偶数:
没有循环:需手动编写 100 行 print()
语句。
print(0)
print(2)
print(4)
print(6)
print(8)
print(10)
print(12)
print(14)
......
使用循环:只需 2-3 行代码即可完成。
for i in range(1, 101):
if i % 2 == 0:
print(i)
循环避免了代码冗余,提高了开发效率和代码可维护性。
Python 提供了两种主要的循环类型:for
循环和 while
循环。
for
循环(遍历可迭代对象)代码示例
# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
# 遍历字符串
for char in "Hello":
print(char)
# 遍历字典(默认遍历键)
person = {"name": "Alice", "age": 30}
for key in person:
print(key, person[key])
从功能角度来说,可迭代对象是一种抽象概念,它代表了一组数据的集合形式,允许程序按照一定顺序逐个访问其中的元素 。在 Python 里,常见的可迭代对象包括列表(list)、元组(tuple)、字符串(str)、字典(dict)、集合(set),以及文件对象等
从实现层面看,Python 中的可迭代对象需要实现 __iter__() 方法。__iter__() 方法会返回一个迭代器对象,该迭代器对象实现了 __next__() 方法,用于逐个返回可迭代对象中的元素。当元素全部返回后,__next__() 方法会抛出 StopIteration 异常,表示迭代结束。
while
循环(基于条件执行)代码示例
# 导入random模块
import random
while True:
robot_guess = random.choice(["石头", "剪刀", "布"])
you_guess = input("请输入你要猜拳的内容(输入q退出):")
if you_guess == 'q':
print("游戏结束")
break
if robot_guess == "石头" and you_guess == "布":
print("布赢石头,你赢了!!!")
elif robot_guess == "石头" and you_guess == "石头":
print("平局")
elif robot_guess == "石头" and you_guess == "剪刀":
print("石头赢剪刀,你输了")
elif robot_guess == "剪刀" and you_guess == "石头":
print("石头赢剪刀,你赢了!!!")
elif robot_guess == "剪刀" and you_guess == "剪刀":
print("平局")
elif robot_guess == "剪刀" and you_guess == "布":
print("剪刀赢布,你输了")
elif robot_guess == "布" and you_guess == "剪刀":
print("剪刀赢布,你赢了!!!")
elif robot_guess == "布" and you_guess == "布":
print("平局")
elif robot_guess == "布" and you_guess == "石头":
print("布赢石头,你输了")
else:
print("输入无效,请输入石头、剪刀或布")
break
:提前终止循环代码示例
# 求四位数中数值最大的闰年与数值最小闰年的差值
for i1 in range(1000, 10000):
if i1 % 4 == 0 and i1 % 100 != 0 or i1 % 400 == 0:
# print(i1)
s1 = i1
break
for i2 in range(9999, 1000, -1):
if i2 % 4 == 0 and i2 % 100 != 0 or i2 % 400 == 0:
# print(i2)
s2 = i2
break
print(f"四位数中数值最大的闰年与数值最小闰年的差值是{s2 - s1}")
continue
:跳过当前循环代码示例
# 最多输入10个位于10-50之间的整数,如果输入了30,则停止输入,计算输入的数字的平均数
sum1 = 0
count = 0
for i in range(1, 11):
num1 = int(input("输入于10-50之间的整数:"))
if 10 <= num1 <= 50:
if num1 == 30:
break
else:
sum1 += num1
count += 1
else:
print(f"输入错误, 你还剩{10 - i}次机会")
continue
if count == 0:
print("没有输入有效的数字,无法计算平均值。")
else:
print(f"平均值为: {sum1 / count}")
else
子句(循环正常结束时执行)代码示例
for i in range(3):
print(i)
else:
print("循环结束") # 正常结束时执行
for i in range(3):
if i == 1:
break
else:
print("循环结束") # 不会执行(因 break 提前退出)
在循环内部使用循环,常用于处理多维数据。
代码示例
for i in range(1, 10):
for j in range(1, i +1):
print(f"{i} X {j} = {i * j}", end="\t")
print()
# 找出所有水仙花的平均数
代码示例
def is_narcissistic(num):
"""判断一个数是否为水仙花数"""
# 将数字转换为字符串,以便逐位处理
digits = str(num)
n = len(digits)
# 计算各位数字的 n 次方之和
sum_power = sum(int(digit) ** n for digit in digits)
# 判断是否等于原数
return sum_power == num
def calculate_average():
"""计算所有三位数水仙花数的平均数"""
# 找出所有三位数中的水仙花数
narcissistic_numbers = [num for num in range(100, 1000) if is_narcissistic(num)]
# 计算平均数
if narcissistic_numbers:
average = sum(narcissistic_numbers) / len(narcissistic_numbers)
return average, narcissistic_numbers
else:
return 0, []
# 执行计算
average, numbers = calculate_average()
# 输出结果
if numbers:
print(f"所有三位数水仙花数为: {numbers}")
print(f"它们的平均数是: {average}")
else:
print("没有找到三位数的水仙花数。")
避免无限循环:确保 while
循环有终止条件。
代码示例
# 错误示例(无限循环)
while True:
print("Hello") # 缺少退出条件
# 正确示例
count = 0
while count < 3:
print("Hello")
count += 1
使用 enumerate()
获取索引:
代码示例
fruits = ["apple", "banana"]
for index, fruit in enumerate(fruits):
print(index, fruit) # 输出:0 apple, 1 banana
列表推导式替代简单循环:
代码示例
# 传统循环
squares = []
for x in range(5):
squares.append(x**2)
# 列表推导式
squares = [x**2 for x in range(5)]
循环变量未更新:导致无限循环。
代码示例
# 错误示例
num = 1
while num < 10:
print(num) # 缺少 num += 1,导致无限循环
循环嵌套过深:降低代码可读性。
解决方案:将复杂逻辑封装为函数。意外修改迭代对象:
代码示例
# 错误示例(遍历列表时修改列表)
numbers = [1, 2, 3, 4]
for num in numbers:
if num % 2 == 0:
numbers.remove(num) # 导致跳过元素
循环是 Python 中最基础且强大的工具之一:
for
循环:适用于已知迭代次数的场景。
while
循环:适用于未知迭代次数,依赖条件判断的场景。
控制语句:break
、continue
和 else
增强循环灵活性。
合理使用循环能让代码更简洁、高效。如果遇到具体问题,可以告诉我,我会提供针对性的解决方案!