(Python基础篇)循环结构

一、什么是 Python 循环结构?

循环结构是编程中重复执行代码块的机制。在 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 循环?

Python 提供了两种主要的循环类型:for 循环和 while 循环。

1. 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 异常,表示迭代结束。

2. 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("输入无效,请输入石头、剪刀或布")

四、循环控制语句

1. 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}")
2. 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}")
3. 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("没有找到三位数的水仙花数。")    

六、最佳实践

  1. 避免无限循环:确保 while 循环有终止条件。

    代码示例

    # 错误示例(无限循环)
    while True:
        print("Hello")  # 缺少退出条件
    
    # 正确示例
    count = 0
    while count < 3:
        print("Hello")
        count += 1
    
  2. 使用 enumerate() 获取索引

    代码示例

    fruits = ["apple", "banana"]
    for index, fruit in enumerate(fruits):
        print(index, fruit)  # 输出:0 apple, 1 banana
    
  3. 列表推导式替代简单循环

    代码示例

    # 传统循环
    squares = []
    for x in range(5):
        squares.append(x**2)
    
    # 列表推导式
    squares = [x**2 for x in range(5)]
    

七、常见问题

  1. 循环变量未更新:导致无限循环。

    代码示例

    # 错误示例
    num = 1
    while num < 10:
        print(num)  # 缺少 num += 1,导致无限循环
    
  2. 循环嵌套过深:降低代码可读性。

    解决方案:将复杂逻辑封装为函数。
  3. 意外修改迭代对象

    代码示例

    # 错误示例(遍历列表时修改列表)
    numbers = [1, 2, 3, 4]
    for num in numbers:
        if num % 2 == 0:
            numbers.remove(num)  # 导致跳过元素
    

八、总结

循环是 Python 中最基础且强大的工具之一:

for 循环:适用于已知迭代次数的场景。

while 循环:适用于未知迭代次数,依赖条件判断的场景。

控制语句breakcontinue 和 else 增强循环灵活性。

合理使用循环能让代码更简洁、高效。如果遇到具体问题,可以告诉我,我会提供针对性的解决方案!

你可能感兴趣的:(基础篇,python)