如何消除Python星号金字塔函数调用时输出的None?
问题解答
核心结论
return 是正确的解决思路,但你之前的写法只返回了最后一行,没有收集所有行的内容。
问题分析
第一个代码的问题:
你的tree函数内部已经通过print输出了金字塔,但函数没有显式返回值,Python 会默认返回None。当你用print(tree(5))调用时,会先执行tree(5)输出金字塔,再打印函数的返回值None,所以多了一行多余的输出。第二个代码的问题:
循环里每次给变量a赋值新的一行,覆盖了之前的内容,最后只返回了循环最后一次的结果(也就是最后一行星号),自然无法得到完整的金字塔。
正确实现方式
让函数返回完整的金字塔字符串(每一行用换行符连接),再通过 print 打印这个返回值,这样既满足“必须用print语句调用函数”的要求,也不会输出 None:
def tree(n): pyramid_lines = [] for i in range(n): # 生成每一行的内容:空格 + 星号 line = (n - i - 1) * " " + (2 * i + 1) * "*" pyramid_lines.append(line) # 将所有行用换行符拼接成一个字符串返回 return "\n".join(pyramid_lines) # 通过print调用函数,打印完整金字塔 print(tree(5))
执行后输出:
* *** ***** ******* *********
另一种妥协方案(不推荐)
如果你坚持让函数内部用 print 输出每一行,又必须用 print 调用函数,可以让函数返回空字符串,这样 print(tree(5)) 不会额外输出 None:
def tree(n): for i in range(n): for j in range(n-i-1): print(" ", end="") for j in range(2*i+1): print('*', end="") print() return "" print(tree(5))
但这种写法不如第一种优雅,因为函数的职责应该更单一:要么负责生成内容,要么负责输出内容,第一种方案让函数生成字符串、print 负责输出,更符合代码设计原则。
内容的提问来源于stack exchange,提问作者Ormondo
相关产品推荐
相关产品推荐

