Python中如何获取函数名而非其返回值?random模块骰子功能排障
问题原因与解决方案
问题根源
- 你定义的
d4()/d6()这类函数返回的只有随机掷出的点数,没有携带「骰子类型」的信息 - 你构造
diceDict的时候直接执行了d4()、d6()等函数,字典里存的是程序启动时一次性掷出的固定点数,不是骰子类型和对应逻辑的映射 getKey函数是用点数匹配字典里存储的固定点数,只要不同骰子掷出相同数值,就会返回第一个匹配到的骰子类型,完全不符合需求
修复方案
调整数据结构,让每个骰子的信息同时包含类型和点数即可解决问题,参考修改后的代码:
import random # 定义不同骰子的面数映射,不需要单独写N个重复的骰子函数 dice_type_map = { 'd4': 4, 'd6': 6, 'd8': 8, 'd10': 10, 'd12': 12, 'd20': 20 } # 掷骰子函数,返回(骰子类型, 点数)的元组,两类信息绑定存储 def roll_dice(dice_type): if dice_type not in dice_type_map: raise ValueError(f"不支持的骰子类型:{dice_type}") return (dice_type, random.randint(1, dice_type_map[dice_type])) # 生成玩家骰子 player1 = [roll_dice('d4'), roll_dice('d4')] player2 = [roll_dice('d4'), roll_dice('d4')] # 直接取元组第一位即可得到骰子类型,不需要额外遍历匹配 print(f'P1 dice are: {player1[0][0]}和{player1[1][0]},对应点数分别为{player1[0][1]}、{player1[1][1]}') print(f'P2 dice are: {player2[0][0]}和{player2[1][0]},对应点数分别为{player2[0][1]}、{player2[1][1]}')
该方案还附带优化点:新增骰子类型只需要在dice_type_map里加一条记录即可,不需要重复编写相似的骰子函数,逻辑更简洁,不会出现类型识别错误。
内容的提问来源于stack exchange,提问作者Adam Brame
相关产品推荐
相关产品推荐

