Python中单个输入函数能否根据用户输入接收1或2个变量?
解答
仅使用单个函数完全可以实现该需求。
你原有函数的逻辑默认所有输入都包含逗号、可直接拆分为两个坐标值,当用户输入M或Z这类单字符指令时,直接调用.split(",")会触发值错误,只需要在拆分坐标前增加输入分支判断,同时补充非法输入的重输逻辑即可,无需拆分多个函数。
推荐使用循环实现的稳定版本,避免多次输错触发递归深度问题,代码如下:
def first_player_input(): while True: # 读取输入并清除首尾多余空格,提示里明确告知用户所有可用操作 raw_input = input("请输入目标坐标(格式为x,y),输入M可重新查看棋盘,输入Z可放弃游戏:").strip() # 匹配功能指令,不区分大小写 if raw_input.upper() == "M": return "show_board" if raw_input.upper() == "Z": return "give_up" # 尝试解析坐标 try: x, y = raw_input.split(",") # 可按需追加校验逻辑:比如判断x、y是否为数字、是否在棋盘坐标范围内 return x.strip(), y.strip() except ValueError: print("输入格式无效,请按规则重新输入")
该实现的逻辑特点:
- 读取输入时自动清除首尾多余空格,指令匹配不区分大小写,用户输入小写
m/z也可正常识别 - 优先判断功能类输入,匹配到查看棋盘、放弃游戏指令时直接返回约定的标识,不会执行坐标拆分逻辑
- 坐标解析环节用异常捕获处理格式错误的输入,提示规则后重新获取输入,不会因输入格式不符合预期直接崩溃
- 你可以在坐标解析分支下追加自定义校验,比如判断输入的坐标是否为数字、是否落在棋盘尺寸范围内,不符合规则时同样提示重输即可
函数返回值分为三类,你在游戏主逻辑里判断返回值类型即可执行对应操作,调用示例:
choice = first_player_input() if choice == "show_board": # 执行打印棋盘的逻辑 display_board() elif choice == "give_up": # 执行玩家认输、结算游戏的逻辑 end_game(surrender=True) else: # 返回值为二元组时即为坐标,执行对应翻牌逻辑 target_x, target_y = choice flip_card(target_x, target_y)
如果偏好递归写法,也可以把循环替换为函数自调用实现重输,逻辑效果一致,但不推荐在用户输入场景下用递归。
内容的提问来源于stack exchange,提问作者Alexandre Faisst
相关产品推荐
相关产品推荐

