Python掷骰子脚本dice函数第二个参数被视为1及运行异常如何解决
问题原因分析
- 仅展示第一个骰子结果、骰子数量参数看似失效:
是否重投的交互逻辑被放在了掷骰子的for循环内部,循环每执行1次(掷完1个骰子)就会触发用户询问,直接打断剩余骰子的掷出流程,不管输入的骰子数量是多少,都只会执行1次循环,看起来就像第二个参数总被识别为1。另外代码中的i += 1是冗余语句,for循环遍历range生成的序列时,i会自动递增不需要手动修改。 - 终止逻辑不稳定、无法彻底结束脚本:使用递归调用
start()的方式实现重新选择参数的功能,每次输入y就会新增一层函数调用栈。输入n时的break只能终止当前层级的dice函数循环,上层的函数栈依然在运行,所以需要输入和递归层数相同次数的n才能完全退出所有函数,就会出现有时能终止有时不能的异常表现。
修复方案
修改思路如下:
- 将是否重投的交互逻辑移出掷骰子的循环,先完成所有骰子的掷出和结果输出后,再询问用户是否重新选择参数
- 替换递归调用为循环逻辑,避免函数栈堆积,退出时直接终止循环即可彻底结束程序
修复后的可运行代码:
from random import randint import sys def dice(n_sides, n_dice): rolls = [] for i in range(n_dice): roll = randint(1, n_sides) rolls.append(roll) print(f"第{i+1}个骰子结果:{roll}") return rolls def start(): while True: print() try: print("请输入单个骰子的面数:") n_sides = int(input()) except ValueError: print("输入无效,请输入正整数。") continue try: print("请输入骰子的数量:") n_dice = int(input()) except ValueError: print("输入无效,请输入正整数。") continue dice(n_sides, n_dice) while True: choice = input("是否要重新选择参数掷骰子?(y/n)").lower() if choice == 'y': # 回到外层循环重新输入参数 break elif choice == 'n': # 直接退出程序 print("程序已退出。") sys.exit(0) else: print("输入无效,请输入y或者n。") if __name__ == "__main__": start()
内容的提问来源于stack exchange,提问作者polaris
相关产品推荐
相关产品推荐

