Python中print与return的区别及递归求和函数报错排查
Python问题解答
1. print和return的核心区别
咱先把这俩的本质掰扯清楚,完全不是一回事:
print是“输出工具”:它的唯一作用就是把内容打印到控制台给人看,不会影响函数的返回值。比如你在函数里写print("搞定"),函数跑完后只会在屏幕上显示这句话,但函数本身返回的还是默认的None(除非你写了return)。return是“函数的出口凭证”:当函数执行到return时,会立刻停止运行,把return后面的值传递给调用这个函数的地方。这个值可以用来赋值、做计算,或者当成参数传给其他函数。- 举个直观的对比例子:
def show_num(): print(20) # 只是打印,不返回 def get_num(): return 20 # 返回数值,不打印 # 调用show_num,屏幕显示20,但变量a是None a = show_num() print(a) # 输出: None # 调用get_num,变量b拿到20,屏幕不会自动显示 b = get_num() print(b) # 输出: 20
2. 递归求和的TypeError踩坑修复
你遇到的TypeError: unsupported operand type(s) for +: 'int' and 'NoneType',本质是试图把整数和None相加——这就像你想把苹果和空气放一起称重,肯定报错。
先看你的sum2代码:
def sum2(list): if list == []: return 0 else: print(list[0] + sum(list[1:]))
问题有俩:
- 没做递归返回:除了空列表的情况返回0,其他分支你只打印了结果,但
sum2函数本身会返回默认的None。如果你的实际代码是调用sum2自身(而不是之前的sum函数),那递归调用sum2(list[1:])就会返回None,直接导致list[0] + None触发错误。 - 没真正递归
sum2:你现在的sum2只是套了个壳子调用之前的sum函数,根本没用到自己的递归逻辑。
如果想用sum2实现递归求和,正确写法应该是在else分支返回当前元素 + 递归调用sum2的结果:
# 建议把参数名list换成lst,避免覆盖内置的list类型 def sum2(lst): if lst == []: return 0 else: # 重点:return + 递归调用sum2自身 return lst[0] + sum2(lst[1:]) # 测试调用 print(sum2([1,2,3])) # 输出: 6
为啥之前会报错?假设你不小心笔误写成了这样:
def sum2(lst): if lst == []: return 0 else: # 这里调用了sum2但没return,sum2返回None print(lst[0] + sum2(lst[1:]))
这时候sum2(lst[1:])返回的是None(因为else分支只有print没有return),自然就触发了类型错误。
内容的提问来源于stack exchange,提问作者flystar
相关产品推荐
相关产品推荐

