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
额外小优化说明
- 把
card_point_total改成接收参数的形式,不再依赖全局变量,代码逻辑更清晰。 - 把x和y的生成放到while循环内部,每次循环都发新牌,符合BlackJack的正常发牌逻辑。
- 去掉了原代码中重复的
card_conversion(x,y)调用,避免不必要的打印和计算。
这样修改后,函数不管x和y是什么值,都会返回一个包含两个元素的元组,就不会再出现解包None的错误了。
备注:内容来源于stack exchange,提问作者qavumm
相关产品推荐
相关产品推荐

