You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Python代码中的'NoneType'对象不可迭代错误?

解决你的点餐脚本TypeError问题

嘿,我一眼就揪出问题所在啦!咱们来快速搞定这个报错~

错误根源:函数缺少返回值

你遇到的TypeError: 'NoneType' object is not iterable,核心原因是你的get_order函数没有返回收集到的订单列表。

当你在main里执行orders = get_order(menu)时,因为get_order函数末尾没写return orders,Python会默认返回None。接下来bill_total(orders, menu)接收的orders是None,而for order in orders根本没法遍历一个非可迭代的None对象,自然就触发报错了。

另外还有个小bug:main函数最后打印的order是循环里的单个变量,应该改成orders才能显示所有点的餐品。

修正后的代码

我把两处问题都修正好了,你可以直接运行试试:

menu = {'Angel Dust Blunt': 6.66, 'The OG Blunt': 4.20, 'Caviar Blunt': 7.10, 'The Chronic Blunt' : 4.20}

def print_menu(menu):
    for name, price in menu.items():
        print(name, ': $', format(price, '.2f'), sep = '')

def get_order(menu):
    orders = []
    order = input("What would you like to order (Q to quit)")
    while (order.upper() != 'Q'):
        # 查找订单,存在则添加到列表
        found = menu.get(order)
        if found:
            orders.append(order)
        else:
            print("Menu item doesn't exist")
        order = input("Anything else? (Q to Quit)")
    # 关键:添加返回语句,把收集到的订单列表返回给调用者
    return orders

def bill_total(orders, menu):
    total = 0
    for order in orders:
        total += menu[order]
    return total

def main():
    menu = {'Angel Dust Blunt': 6.66, 'The OG Blunt': 4.20, 'Caviar Blunt': 7.10, 'The Chronic Blunt' : 4.20}
    print_menu(menu)
    orders = get_order(menu)
    # 优化:如果用户直接输入Q退出,给出友好提示
    if not orders:
        print("You didn't order anything!")
        return
    total = bill_total(orders, menu)
    # 把单个order改成orders,显示所有订购项目
    print("You ordered:", orders, "Your total is: $", format(total, '.2f'), sep='')

main()

额外小提示

我还加了个判断逻辑:如果用户直接输入Q退出,会提示"You didn't order anything!",避免计算空订单的总额,体验更友好~

作为Python初学者,忘记写函数返回值是超级常见的坑,以后写函数的时候多想想:这个函数需要给调用者返回什么内容吗?如果需要,一定要加上return语句哦!

内容的提问来源于stack exchange,提问作者E1y1rac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:57:59