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

Python函数含return语句却返回None,引发解包NoneType对象的TypeError问题求助

Python函数含return语句却返回None,引发解包NoneType对象的TypeError问题求助

嘿,我看了你的问题和代码,你遇到的这个TypeError: cannot unpack non-iterable NoneType object问题其实很好解决——你的card_conversion函数漏掉了一种分支的return语句,导致当x和y都不等于10的时候,函数没有返回任何值,Python就会默认返回None,这时候你尝试把None解包成两个变量,自然就报错了。

问题原因分析

你的card_conversion函数里只处理了三种情况:

  • x和y都是10
  • x不是10但y是10
  • x是10但y不是10

但完全没处理x和y都不是10的情况!这种情况下函数没有执行任何return语句,Python函数如果没有显式return,就会返回None,你在while循环里尝试card_name_x, card_name_y = card_conversion(x,y),就相当于要把None拆成两个变量,这肯定会报错。

修复方案

只需要给函数加上最后一种情况的处理,确保不管什么输入,函数都有明确的返回值。比如在函数最后补充else分支:

else:
    card_name_x = x
    card_name_y = y
    return card_name_x, card_name_y

修改后的完整代码

同时我还优化了几个小细节(比如避免全局变量依赖、修复发牌逻辑重复的问题),调整后的代码如下:

import random

running = True

cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]
blackjack = ["jack", "king", "queen"]

player_deck = []
dealer_deck = []

def card_conversion(x,y):
    if x == 10 and y == 10:
        card_name_x = blackjack[random.randint(0, 2)]
        card_name_y = blackjack[random.randint(0, 2)]
        print(card_name_x, card_name_y)
        return card_name_x, card_name_y
    elif x != 10 and y == 10:
        card_name_y = blackjack[random.randint(0, 2)]
        card_name_x = x
        print(card_name_x, card_name_y)
        return card_name_x, card_name_y
    elif x == 10 and y != 10:
        card_name_x = blackjack[random.randint(0, 2)]
        card_name_y = y
        print(card_name_x, card_name_y)
        return card_name_x, card_name_y
    # 新增:处理x和y都不是10的分支
    else:
        card_name_x = x
        card_name_y = y
        print(card_name_x, card_name_y)
        return card_name_x, card_name_y

def card_point_total(x, y):
    # 改为传入参数,避免依赖全局变量
    return x + y

player_turn = True
dealer_turn = True

while running:
    # 每次循环生成新牌,避免重复发同一组牌
    x = cards[random.randint(0,12)]
    y = cards[random.randint(0,12)]
    
    if dealer_turn == True:
        # 去掉重复的函数调用,直接接收返回值
        card_name_x, card_name_y = card_conversion(x,y)
        dealer_deck.append(card_name_x)
        dealer_deck.append(card_name_y)
        print(f"Dealer's total: {card_point_total(x, y)}")
        print(f"Dealer's deck: {dealer_deck}")
        dealer_turn = False

    if player_turn == True:
        card_name_x, card_name_y = card_conversion(x,y)
        player_deck.append(card_name_x)
        player_deck.append(card_name_y)
        print(f"Player's total: {card_point_total(x, y)}")
        print(f"Player's deck: {player_deck}")
        player_turn = False
        
    # 新增退出逻辑,避免无限循环
    if input("Continue? (y/n): ").lower() != 'y':
        running = False

额外小优化说明

  1. 把card_point_total改成接收参数的形式,不再依赖全局变量,代码逻辑更清晰。
  2. 把x和y的生成放到while循环内部,每次循环都发新牌,符合BlackJack的正常发牌逻辑。
  3. 去掉了原代码中重复的card_conversion(x,y)调用,避免不必要的打印和计算。

这样修改后,函数不管x和y是什么值,都会返回一个包含两个元素的元组,就不会再出现解包None的错误了。

备注:内容来源于stack exchange,提问作者qavumm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:58:06