Python中reversed(range)打印星号为何与普通range输出一致?
为什么reversed(range)没实现右对齐星号输出
现象复现
目标左对齐星号图案:
* ** *** ****
两段运行结果完全一致的测试代码:
- 内层循环用
reversed(range(5))的版本:
for i in range(5): for j in reversed(range(5)): if j < i: print('*', end='') print()
- 内层循环直接用
range(5)的版本:
for i in range(5): for j in range(5): if j < i: print('*', end='') print()
预期中reversed版本应该输出的右对齐图案:
* ** *** ****
根本原因
两个代码输出一致、reversed没达到预期,核心是两个逻辑误区:
- 没有给非星号位置输出占位空格
右对齐的本质是每行字符总长度固定,星号前的位置要打印空格占住位置,才能把星号“挤”到右边。现有代码逻辑里,只有满足j < i的时候才打印星号,不满足条件的时候什么字符都不输出——这些不触发打印的遍历步骤不会在终端留下任何痕迹,自然不会产生右对齐需要的左侧缩进。 - 判断条件只和数值大小有关,和遍历顺序无关,最终打印的星号总数完全一致
不管j是按0、1、2、3、4的正序遍历,还是按4、3、2、1、0的倒序遍历,对于固定的i值,满足j < i的整数j的总数永远是i个:- i=0时,没有j满足
j<0,打印0个星号 - i=1时,只有j=0满足条件,打印1个星号
- i=2时,j=0、j=1满足条件,打印2个星号
- 以此类推,每行打印的星号数量和遍历顺序完全无关,最终输出自然一模一样。
- i=0时,没有j满足
修正方案
在内层循环里,给不满足星号打印条件的位置输出空格占位即可:
for i in range(5): for j in reversed(range(5)): if j < i: print('*', end='') else: print(' ', end='') print()
运行后就能得到预期的右对齐星号图案。
内容的提问来源于stack exchange,提问作者dwightcode
相关产品推荐
相关产品推荐

