CC++ & Algorithm

Python for 循环进阶

中等5
语言版本:C++Python
概述:学会用for循环搭配range函数实现不同的计数方式,以及遍历字符串和列表的更多技巧。

解锁 for 循环的更多玩法——步长、字符串遍历和位置编号

你已经学会了用 for 循环让电脑重复做事情,就像按顺序翻书一样。但有时候翻书的方法可以更灵活:比如一次翻两页、从后往前翻、甚至一边翻一边记住页码。今天我们就来把这些技巧都学会,让 for 循环成为你的百变工具。

数数还能怎么数?——range 的步长

还记得 range 函数吗? range(10) 会让循环变量从 0 跑到 9,一共 10 次。那如果想跳着数呢?比如从 0 数到 10,每次跳 2 步(0, 2, 4, 6, 8, 10)。这时我们给 range 加第三个参数——步长

正步长:一次跨两级台阶

# 从0到10,每次增加2
for i in range(0, 11, 2):
    print(i)

运行结果:0 2 4 6 8 10。步长就是每次增加多少,就像爬楼梯时一次跨两级。

生活例子:小明每天存零花钱,第一天存 0 元,之后每两天存一次,每次存 2 元。上面的循环就帮他列出了每次存钱时的金额。

负步长:倒着数

如果想让循环从大到小,比如从 10 数到 0,步长可以写 负数

# 倒着数:从10到0
for i in range(10, -1, -1):
    print(i)

注意结束值是 -1,因为 range 会停在前一个数(即 0 之后就不继续了)。这就像下楼时一次跨一级台阶。

生活例子:倒计时发射火箭,从 10 喊到 0,最后喊“点火!”

常见错误

  1. 忘记结束值不包含:想打印 1 到 5,写成 range(1, 5) 只会得到 1,2,3,4。正确是 range(1, 6)
  2. 步长方向错误:如果步长是正数但开始值大于结束值,循环不会执行。比如 range(10, 0, 1) 不会输出任何东西,因为从 10 开始要增加,但终点是 0,永远到不了。正确做法是用负步长:range(10, 0, -1)
  3. 步长为 0range(0, 10, 0) 会报错,因为没法静止不动。步长至少是 1 或 -1。

遍历字符串里的每个字

把字符串当作一串珠子,可以用 for 循环一颗颗拿起来看。之前你可能已经会了:

word = "PYTHON"  # 字符串变量
for letter in word:  # 遍历每个字符
    print(letter)

这会输出:

P
Y
T
H
O
N

每个字母占一行。但更厉害的是,你可以在循环里做判断,比如找出字符串里有没有某个字母。

生活例子:检查妈妈输入的口令中是否包含大写字母。比如编写一个密码强度检查小程序:

password = "P@ssw0rd"  # 用户输入的密码
has_upper = False      # 是否有大写字母,初始为假
for char in password:  # 遍历每一个字符
    if char.isupper(): # 如果是大写字母
        has_upper = True  # 标记为真
        break             # 找到了就退出循环

if has_upper:
    print("密码中包含大写字母,不错!")
else:
    print("密码中建议加入大写字母。")

常见错误

  • 忘记字符串是不可变的:在循环里试图修改 letter 不会改变原字符串。比如 letter = 'X' 只是改了临时变量,不影响 word。要修改字符串需要新建。
  • 忘记区分字符和索引:有时你需要知道每个字符的位置(下标),这时可以用 enumerate,下面会讲。

同时拿到位置(索引)和内容——enumerate

有时我们需要知道元素在列表中的位置,比如排队时要知道自己是第几个。enumerate 函数就像给每位同学发座位号,它会帮你把索引和元素一起拿出来。

animals = ["小狗", "小猫", "小兔"]  # 动物列表
for index, animal in enumerate(animals):  # index是位置,animal是内容
    print(f"第{index}个动物是{animal}")

输出:

第0个动物是小狗
第1个动物是小猫
第2个动物是小兔

注意索引从 0 开始!如果你想要从 1 开始编号(更像日常的排序),可以给 enumerate 加上第二个参数 start=1

for index, animal in enumerate(animals, start=1):
    print(f"第{index}个动物是{animal}")

输出:

第1个动物是小狗
第2个动物是小猫
第3个动物是小兔

生活例子:老师让全班同学轮流朗读课文。用 enumerate 可以记录每个同学的序号和名字,方便轮到时叫号。

常见错误

  • 忘记解包:for item in enumerate(animals) 得到的是一个元组((0, "小狗")),你需要用两个变量或索引才能分别拿到位置和内容。最好直接写成 for index, item in enumerate(...)
  • 混淆索引和值:index 是整数,item 才是列表里的元素。不要写错。

for 循环 + if 条件:筛选出符合要求的数

结合前面学过的 %(取余)操作,你可以在循环里判断哪些数满足条件。比如打印 1 到 100 之间所有能被 3 整除的数:

# 打印1到100之间所有能被3整除的数
for num in range(1, 101):   # 从1到100
    if num % 3 == 0:        # 如果num除以3的余数为0
        print(num)

程序会输出:3, 6, 9, 12, ... , 99。你可以用 end=' ' 让它们打印在一行。

生活例子:班级里有 40 人,每 5 个人一组做游戏。要找出所有能被 5 整除的编号,就是每组的第一个人。

完整示例:给句子中的每个单词编号

让我们把所学技巧综合起来。编写一个程序,让用户输入一个句子,然后把句子拆成单词,并给每个单词从 1 开始编号,最后打印出来。

# 用户输入一个句子
sentence = input("请输入一个句子:")

# 用空格把句子拆分成单词列表
words = sentence.split()  # split()默认按空格分割

# 用enumerate遍历,从1开始编号
for number, word in enumerate(words, start=1):
    print(f"第{number}个单词是:{word}")

运行示例:

请输入一个句子:我爱学习 Python
第1个单词是:我爱学习
第2个单词是:Python

注意:如果句子中有标点,“我爱学习”会被当作一个整体。如果想更精确地分割,可以用更复杂的方法,但那是后话了。

相关指引

现在你已经掌握了:

  • range 的步长(正步长和负步长)
  • 遍历字符串的每一个字符
  • enumerate 同时获取索引和值
  • 在循环中加入 if 条件做筛选

接下来可以学习:

  • while 循环:当条件满足时一直执行,适合不确定次数的循环。
  • 嵌套循环:循环里面再套一个循环,比如打印九九乘法表。
  • 列表推导式:用一种简洁的方式快速生成列表,例如 [x*2 for x in range(10)]

继续加油吧,你会越来越厉害的!

例题精讲

1单选题

执行以下代码后,输出结果是什么? for i in range(10, 0, -2): print(i, end=' ')

A10 8 6 4 2 0
B10 8 6 4 2
C9 7 5 3 1
D10 8 6 4 2 0 -2
2判断题

执行代码 `for c in 'hello': print(c)` 会逐个输出字符串中的字符,包括空格。

3填空题
以下代码使用for循环遍历列表 `names = ['Alice', 'Bob', 'Cathy']`,并输出每个名字的长度。请补全代码。
names = ['Alice', 'Bob', 'Cathy']
for name in names:
    print(___ (name))
4单选题

以下哪个代码片段可以逆序输出列表 `[1, 2, 3, 4, 5]` 的所有元素?

Afor i in range(5,0,-1): print([i])
Bfor i in range(5,0,-1): print(i)
Cfor i in reversed([1,2,3,4,5]): print(i)
Dfor i in [5,4,3,2,1]: print(i)
5填空题
以下代码希望用for循环计算1到100之间所有奇数的和,请补全range参数。
total = 0
for i in range(1, ___, ___):
    total += i
print(total)