打印空心菱形:为何Python函数生成的菱形缺失中间部分?
为何Python空心菱形函数缺失中间部分?
原函数代码
def hollow_diamond(n): # Upper half of the diamond for i in range(n): if i == 0 or i == n - 1: print(" " * ((n-i)+1) + "*" ) elif i == 1: print(" " * ((n-i)+1) + "***" + " " ) elif i == (n+1): print("**" + " " * ((2*i+1) - 2) + "**" ) else: print(" " * (n-i) + "**" + " " * ((2*i+1) - 2) + "**" ) # Lower half of the diamond for i in range(n - 2, -1, -1): if i == 0 or i == n - 1: print(" " * ((n-i)+1) + "*" * (2*i+1)) elif i == 1: print(" " * ((n-i)+1) + "***" + " " ) else: print(" " * (n-i) + "**" + " " * ((2*i+1) - 2) + "**" + " ")
实际运行结果
hollow_diamond(7) print() # Print a newline for better readability hollow_diamond(3) * *** ** ** ** ** ** ** ** ** * ** ** ** ** ** ** ** ** *** * * *** * *** *
预期输出
>>> hollow_diamond(7) * *** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *** * >>> hollow_diamond(3) * *** ** ** *** *
问题分析
导致菱形中间部分缺失、格式混乱的核心原因如下:
上半部分中间行逻辑错误
上半部分循环for i in range(n)覆盖了从0到n-1的所有值,但代码错误地将i == n-1(也就是菱形最宽的中间行)和i==0归为同一分支,直接输出单星号,完全跳过了中间空心行的生成逻辑。比如n=7时,i=6本应生成** **,却被错误输出成了*,这是中间部分缺失的直接原因。无效条件分支
代码中elif i == (n+1)的分支永远不会触发,因为i的取值范围是0到n-1,n+1远大于i的最大值,这个分支属于冗余代码,没有任何作用。不必要的特殊分支(i=1)
单独为i=1写分支完全多余,不仅破坏了逻辑一致性,还多输出了一个空格,导致该行格式错位(比如n=7时i=1的输出多了末尾空格)。空格数计算逻辑混乱
不同分支的空格数计算规则不一致:有的用(n-i)+1,有的用n-i,导致各行的缩进不对齐,进一步加剧了格式混乱。下半部分循环的无效条件
下半部分循环是range(n-2, -1, -1),i的最大值是n-2,所以i == n-1的条件永远无法满足,属于无效判断;同时i=0分支的空格数计算错误,导致底部单星号的缩进不对。
内容的提问来源于stack exchange,提问作者user22705142
相关产品推荐
相关产品推荐

