【问题标题】:Returned False three time instead of one返回 False 三次而不是一次
【发布时间】:2020-06-17 23:25:08
【问题描述】:
def jump_to(self, position_piece, target_position):


    middle_position = Position((position_piece.line + target_position.line)/2, 
                               (position_piece.column + target_position.column)/2)

    if position_piece not in self.cases:
        return False
    elif (target_position not in position_piece.four_position_jumps() and
        target_position in self.cases):
        return False
    elif middle_position in self.cases:
        if self.cases[position_piece] == self.cases[middle_position]:
            return False

    return True

我已经创建了上述函数,但我意识到我返回了 3 次 False。这对我来说看起来很糟糕。这是一个很好的实现吗?如何修改该代码以使其更 Pythonic?我很想知道如何返回 False 一次而不是三个。

【问题讨论】:

  • 只要设置一个变量叫做result = true,然后在if语句中修改result=false,最后返回result。
  • 老实说,您的代码布局方式是可读的 - 没有很长的 if 语句。
  • 虽然你有很多条件要测试都返回False,但是这种方式还是比较清晰易懂的。您可以将它组合成一个 if 条件,但它可能不太容易理解。这可能更好的一个重要原因是因为他们只是在做回报。如果他们每个人都执行相同的多行代码,并且必须在每个代码行中复制(如果需要更改,可能会出错),那将是不同的情况。

标签: python implementation


【解决方案1】:

我同意@leopardxpreload 的评论,即多个False 返回不是您的代码的主要问题,特别是因为它只有一个True 返回。我在代码的早期看到您对middle_position 的计算,只是在某些情况下忽略它,这是一个更大的问题:

def jump_to(self, position_piece, target_position):

    if position_piece not in self.cases:
        return False

    if target_position in self.cases and \
        target_position not in position_piece.four_position_jumps():
        return False

    line = (position_piece.line + target_position.line) / 2
    column = (position_piece.column + target_position.column) / 2

    middle_position = Position(line, column)

    if middle_position in self.cases:
        if self.cases[position_piece] == self.cases[middle_position]:
            return False

    return True

【讨论】:

  • 我可能会像您在编辑之前最初所做的那样放弃 if middle_position in self.cases 预检查,但将检查包装在 try/except 中以在 middle_position 不在 self.cases 中时捕获它.它看起来像一个字典,所以你会想要捕捉 KeyError。
  • elifs 更改为ifs 会更好。但是,我可能在这里遗漏了一些东西,但看起来您的代码不正确,因为您从第二个测试中删除了 target_position in self.cases 检查。我不清楚target_position not in position_piece.four_position_jumps() 是如何包含anded 条件的那部分的。
  • @GlennMackintosh,是的,我不小心删除了我最初与它的副本(在发布之前)结合起来的那个子句,它在 OP 的编辑中消失了。尽管刚刚将其添加回来时,我将其反转,因为如果 in 失败,则执行 in 然后函数调用似乎更有效。我不喜欢编写无法测试的代码!
【解决方案2】:

这可能是另一种方式,尽管我不会说它更具可读性或直观性,并且我还以更简约的形式编写了示例代码:

cases = ['a', 'b', 'c', 'e']
position_piece = 'w'
target_position = 'r'

def jump_to():
    check1 = not any([True if each_case == position_piece else False for each_case in cases])
    check2 = any([True if each_case == target_position else False for each_case in cases])
    return False if check1 or check2 else True

print(checker())

注意:因为您正在检查target_position in self.cases:,所以and 比较器意味着仅检查它就足以涵盖这些情况。

【讨论】:

  • 这显然不比原版更具可读性。
  • @GlennMackintosh 这已明确指出......问题是使用一个False 声明。
  • 没错,你确实指出了这一点。至于这个问题,我将 OP 的重点解释为他问Is it a fine implementation? 的部分,它比替代方案更清晰、更好。你说你的可读性差很多,但我不同意,说你的可读性差很多。
  • @GlennMackintosh 猜猜这就是编程的美妙之处。一个问题的许多解决方案 - 并且涉及个人偏好。谢谢你的意见,很有建设性,我学到了很多。
【解决方案3】:

您的实现很不错,但在使用后可以改进 @cdlane 的回答。

此答案旨在使用单点退出。虽然它可能比 cdlane 的答案更具可读性。它比 cdlane 的答案更复杂,可能更不易维护,您应该改用他/她的答案。但这里是单一回报的样子。

def jump_to(self, position_piece, target_position):
    middle_position = Position((position_piece.line + target_position.line)/2,
                                   (position_piece.column + target_position.column)/2)
    return (position_piece in self.cases
            and (not target_position in self.cases
                 or (target_position in position_piece.four_position_jumps()
                     and self.cases[position_piece] != self.cases[middle_position])))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2020-10-19
    • 2023-02-25
    • 2013-05-26
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多