You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动