别再用笨办法数数了!Python循环进阶这3招让代码活起来
你有没有遇到过这种情况?写循环时只会用 range(10),次数固定,步长固定。直到有一天你想打印一个倒三角形或者字母Y,才发现循环需要更灵活的控制——比如跳着数、倒着数,甚至同时拿到元素的索引和值。别担心,今天我们就来解锁 for 循环的进阶玩法,让代码告别死板。
1. 步长:让数数更自由
range(10) 从0跑到9,一共10次。但如果你想要“跳过”某些数呢?比如打印1到100之间所有能被3整除的数——典型做法是用 % 判断余数,但先不说那个,我们看看 range 本身的步长参数。
for i in range(0, 11, 2):
print(i, end=' ')
输出 0 2 4 6 8 10。第三个参数就是步长,相当于爬楼梯时一次跨两级。步长还能是负数,实现倒着数:
for i in range(10, -1, -1):
print(i, end=' ')
输出 10 9 8 ... 0。注意结束值是 -1,因为 range 会停在“到达结束值之前”的那个数。这道题恰好在考察这个细节:
for i in range(10, 0, -2): print(i, end=' ')输出什么? 答案应该是10 8 6 4 2—— 到0之前,步长-2,结束值是0(不包含),所以输出偶数递减。
如果你要打印能被3整除的数,其实用步长也可以:range(3, 101, 3) 直接搞定,比判断余数更高效。但这里想强调,步长给了你控制“间隔”的能力,是循环灵活性的第一把钥匙。
2. 字符串:逐字“拆包”
字符串本质上是一个字符序列,for c in 'hello' 会自动遍历每个字符,包括空格。这就像把一串珠子一颗颗拿起来看。一个小陷阱是:如果字符串里有空格,它也是字符,遍历时同样会被输出。
word = "PYTHON"
for letter in word:
print(letter)
输出 P Y T H O N,每行一个。这个套路常用于统计字符出现次数、过滤特定字符等。但更高级的用法是结合索引——这时就需要 enumerate。
3. enumerate:索引和内容两手抓
有时光知道值不够,你还得知道它在列表里的位置。比如打印“第0个动物是小狗”,手动维护索引变量很麻烦,enumerate 直接帮你打包:
animals = ["小狗", "小猫", "小兔"]
for index, animal in enumerate(animals):
print(f"第{index}个动物是{animal}")
enumerate 返回一个元组 (索引, 值),解包后直接使用。索引默认从0开始,但你可以改起始值:enumerate(animals, start=1)。这个函数在需要同时操作位置和内容时极其方便,比如处理矩阵坐标、构建字典键值对。
4. 实战:画一个大写字母Y
光说不练假把式,来看一道经典的图形打印题:输入整数 n,输出高度为 2n-1 行的大写字母Y。效果图是一个左右对称的Y型,由星号组成,中间有空格分隔。
这道题考察什么?不是单个循环,而是循环嵌套 + 步长控制。Y的形状可以拆成两部分:
- 上半部分(n行):每行两个星号,左边距逐渐增大,右边距逐渐减小,总体宽度有限。
- 下半部分(n-1行):只有一个星号,垂直居中,左侧空格数固定为
n-1。
关键在于上半部分的行数 i(从0到n-1)和左右星号的位置。左星号的位置等于 i,右星号的位置等于 2*(n-1) - i。步长在这里用于控制空格数量——你可以用 range 加步长生成空格,但更直观的是用字符串乘法 ' ' * 数量。
核心代码片段(只展示部分思路):
for i in range(n):
# 左星号前的空格
print(' ' * i, end='')
print('*', end='')
# 左右星号之间的空格
print(' ' * (2 * (n - i - 1) - 1), end='')
if i != n - 1: # 最后一行只有左星号
print('*')
else:
print()
这里 2 * (n - i - 1) - 1 就是步长变化的结果——随着 i 增大,间距每次减少2。如果不用公式而用步长循环,也可以写成:
for j in range(2 * (n - i - 1) - 1):
print(' ', end='')
但显然乘法更简洁。这道题很好地展示了步长与循环嵌套的组合应用。
5. 菱形:对称性的美感
另一道题:给定一个字符,构造对角线长5个字符的菱形。这是一个经典的对称图形,可以转化为两个循环——上半部分包括中间行,下半部分倒序。
关键思路:
- 菱形每行星号数递增(步长+2),空格递减(步长-1)。
- 上半部分从1到5,下半部分从3到1。
但题目只给了单个字符,意味着你只需改变打印的字符,逻辑不变。如果你理解了Y题的对称构造,菱形不过是它的变体——用步长控制行和列的偏移。
总结
从 range 步长到 enumerate,再到图形打印,你会发现 for 循环的灵活性远不止“重复n次”。步长让你控制间隔,enumerate 让你同时驾驭索引和内容,而图形题则把这些技巧揉在一起,逼你思考坐标和规律。
建议你接下来尝试挑战更复杂的图形:空心菱形、数字三角形、杨辉三角。每道题都能加深你对循环和步长的理解。记住,编程不是背代码,而是用循环的画笔,在数字的画布上画出你的逻辑。
关于作者
我是赵老师,持有 NOI 信息学奥赛教练证书,拥有 15 年以上的软件开发经验,从事信息学少儿编程教学已有 8 年时间。
这些年累计帮助 多名 学生通过编程特长升入自己心仪的目标学校。
如果你在编程学习上有任何疑问,欢迎联系我:18620372957(微信同号)