python - Python - 棋盘 - For 循环不会遍历字典中的所有键,因为它返回 True 太早
问题描述
我已经学习 Python 几个星期了,它是我的第一门编程语言。
我正在尝试构建一个棋盘验证器。除其他事项外,此验证器应检查棋子是否在棋盘上的有效空间中。
为此,我使用了字典和正则表达式。
import re
chessBoard4 = { '8a': 'brook','8b': 'bknight', '8c': 'bbishop', '8d': 'bqueen', '8e': 'bking', '8f': 'bbishop', '8g': 'bknight', '8h': 'brook',
'7a': 'bpawn','7b': 'bpawn', '7c': 'bpawn', '7d': 'bpawn', '7e': 'bpawn', '7f': 'bpawn', '7g': 'bpawn', '7h': 'bpawn',
'2a': 'wpawn','2b': 'wpawn', '2c': 'wpawn', '2d': 'wpawn', '2e': 'wpawn', '2f': 'wpawn', '2g': 'wpawn', '2h': 'wpawn', '2h': 'wpawn', '2i': 'wpawn',
'1a': 'wrook','1b': 'wknight', '1c': 'wbishop', '1d': 'wqueen', '1e': 'wking', '1f': 'wbishop', '1g': 'wknight', '1h': 'wrook'}
def isValidChessBoard(dictionary):
def isValidSpace():
for space in dictionary.keys():
is_match = re.findall("[0-8][a-h]", space)
if is_match:
return True
else:
return False
break
if isValidSpace():
print("Hooray!")
else:
print("One or more chess pieces are not on the chess board.")
isValidChessBoard(chessBoard4)
由于有一个棋子不在棋盘的有效空间中('2i':'wpawn'),我想isValidSpace()
返回False
而不是True
。我知道“if is_match:”返回True
是因为返回的第一次for loop
迭代True
。但是我希望for loop
遍历字典中的所有键,以便它最终可以捕捉到不在棋盘上的棋子。
我希望我能明白我的意思,谢谢你的关注!
PS:这是Automate The Boring Stuff With Python中的一项任务。本章实际上还没有教授正则表达式,但我不知道我还能如何解决这个问题(所以我的正则表达式也很有可能得到改进)。没有正则表达式怎么能解决这个问题?
解决方案
问题在于您的isValidSpace
功能。由于您需要检查多个要求并且它们都必须是有效的,因此您不能一找到一个就返回。但是,一旦不存在,您就可以存在。因此,您需要将其重写为:
def isValidSpace():
for space in dictionary.keys():
is_match = re.findall("[0-8][a-h]", space)
if not is_match:
return False
return True
True
如您所见,在我们确保所有职位都匹配之前,我们无法返回。
另外,作为旁注;您永远无法break
在您编写的函数中找到您的语句,因为您总是会在此之前返回。因此,没有必要在那里拥有它。
推荐阅读
- reactjs - 如何在 firestore .forEach 循环内进行异步调用?
- javascript - Browserify 后 Dotenv 未定义
- php - 如果使用 2 次 PHP str_replace 不起作用
- kubernetes - EKS pod 在 Fargate 部署中卡在“待处理”状态?
- sql - 无法使用左连接编写更新语句
- python - Seaborn 子图未显示 IPython
- python - 在 tkinter 中构建了一个简单的 GUI 提示用户输入值之后,您如何实际使用他们输入的值?
- javascript - 从 obervablehq 迁移到 html 的径向树示例在左上角居中呈现
- python - 我在这种复杂的 numpy 用法中的错误在哪里?
- sockets - 通过 TCP 连接到 Socket 但服务器没有接收到它