首页 > 解决方案 > 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中的一项任务。本章实际上还没有教授正则表达式,但我不知道我还能如何解决这个问题(所以我的正则表达式也很有可能得到改进)。没有正则表达式怎么能解决这个问题?

标签: 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在您编写的函数中找到您的语句,因为您总是会在此之前返回。因此,没有必要在那里拥有它。


推荐阅读