Python for 循环进阶
中等5解锁 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 到 5,写成
range(1, 5)只会得到 1,2,3,4。正确是range(1, 6)。 - 步长方向错误:如果步长是正数但开始值大于结束值,循环不会执行。比如
range(10, 0, 1)不会输出任何东西,因为从 10 开始要增加,但终点是 0,永远到不了。正确做法是用负步长:range(10, 0, -1)。 - 步长为 0:
range(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)]。
继续加油吧,你会越来越厉害的!
例题精讲
执行以下代码后,输出结果是什么? for i in range(10, 0, -2): print(i, end=' ')
执行代码 `for c in 'hello': print(c)` 会逐个输出字符串中的字符,包括空格。
以下代码使用for循环遍历列表 `names = ['Alice', 'Bob', 'Cathy']`,并输出每个名字的长度。请补全代码。
names = ['Alice', 'Bob', 'Cathy']
for name in names:
print(___ (name))以下哪个代码片段可以逆序输出列表 `[1, 2, 3, 4, 5]` 的所有元素?
以下代码希望用for循环计算1到100之间所有奇数的和,请补全range参数。
total = 0
for i in range(1, ___, ___):
total += i
print(total)