Python报错TypeError: int与NoneType无法相加,求问题排查与解释
解决旅行成本计算代码的TypeError问题
Hey there, let's break down this error and fix your code step by step!
错误原因解释
那个TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'的意思很明确:你在尝试把一个整数和None值做加法运算。在Python里,如果一个函数没有明确写return语句(或者return后面没有值),它会默认返回None——所以肯定是你的某个费用计算函数返回了None,导致后续加法报错。
问题排查
看你调用trip_cost的代码:print trip_cost("Los Angeles " , 5 , 600),注意到"Los Angeles "后面多了一个空格!而你的plane_ride_cost函数里判断的是"Los Angeles"(没有空格),所以这个城市名完全不匹配任何一个if/elif分支,函数没有执行任何return语句,自然返回了None。之后在trip_cost里把这个None和酒店、租车、零花钱这些整数相加,就触发了类型错误。
另外还有个小细节:Python 3里print是函数,必须加括号,原来的print trip_cost(...)写法也会报错。
修正后的代码
这里给你调整后的代码,还加了一些健壮性优化:
def hotel_cost(nights): return 140 * nights def plane_ride_cost(city): # 自动去除城市名前后的空格,避免输入失误 city_clean = city.strip() if city_clean == "Charlotte": return 183 elif city_clean == "Tampa": return 220 elif city_clean == "Pittsburgh": return 222 elif city_clean == "Los Angeles": return 475 # 增加默认分支,避免未知城市返回None else: raise ValueError(f"Sorry, we don't have data for {city}") def rental_car_cost(days): if days >= 7: return (40 * days) - 50 elif days >= 3: # 改成elif让逻辑更严谨 return (40 * days) - 20 else: return 40 * days def trip_cost(city, days, spending_money): # 把sum改成total_cost,避免占用Python内置函数名 total_cost = rental_car_cost(days) + plane_ride_cost(city) + hotel_cost(days) + spending_money return total_cost # 修正了城市名的空格,加上print的括号 print(trip_cost("Los Angeles", 5, 600))
关键优化点
- 给
plane_ride_cost加了city.strip():自动处理输入时不小心多打的空格,再也不会因为这种小失误导致匹配失败; - 增加默认错误分支:如果输入了不支持的城市,会直接抛出明确的错误提示,而不是默默返回
None,方便调试; - 调整
rental_car_cost的条件判断:把第二个if改成elif,让逻辑更连贯(原代码其实能跑,但这样写更符合条件判断的常规逻辑); - 避免使用内置函数名:把变量
sum改成total_cost,因为sum是Python自带的函数,用它当变量名可能会引发其他问题; - 修正
print语法:适配Python 3的函数式写法。
内容的提问来源于stack exchange,提问作者baby_outcast




