Python “如何强制所有人”;或;
由于“短路运算符”,Python仅在第一个参数为False时计算第二个参数 我有这样一个函数:Python “如何强制所有人”;或;,python,Python,由于“短路运算符”,Python仅在第一个参数为False时计算第二个参数 我有这样一个函数: def calcule_deplacements_possibles(self, y, x, idx, pp): idp = pp['id'] if pp['piece'] == 'abeille': o = False o = self.glissement_test(y, x, -2, 0, -1, -1, -1, +1, idp) or o
def calcule_deplacements_possibles(self, y, x, idx, pp):
idp = pp['id']
if pp['piece'] == 'abeille':
o = False
o = self.glissement_test(y, x, -2, 0, -1, -1, -1, +1, idp) or o
o = self.glissement_test(y, x, -1, +1, -2, 0, +1, +1, idp) or o
o = self.glissement_test(y, x, +1, +1, -1, +1, +2, 0, idp) or o
o = self.glissement_test(y, x, +2, 0, +1, +1, +1, -1, idp) or o
o = self.glissement_test(y, x, +1, -1, +2, 0, -1, -1, idp) or o
o = self.glissement_test(y, x, -1, -1, +1, -1, -2, 0, idp) or o
if o:
self.board[y][x]['b'][idx]['m'] = True
这是六边形的单元格,所以我需要尝试所有的单元格,因为glissement\u test()
添加了一些标记,所以总是要调用它(这里有6次)
如何“强制”这些调用并像在我的代码中那样使用结果?据我所知,在Python中无法关闭短路(也没有无短路”或“运算符”) 条件语句中的代码无论如何都不应该“做”事情,因此大多数语言都有短路的习惯
首先计算
self.glissement\u测试的结果,将其分配给一个变量,然后检查或o
据我所知,在Python中无法关闭短路(也没有无短路的“或”运算符)
条件语句中的代码无论如何都不应该“做”事情,因此大多数语言都有短路的习惯
计算self.glissement\u test的结果。首先,将其分配给一个变量,然后检查或o
如果glissement\u test()
以某种方式改变了self
的状态,请不要在条件中使用它。它会混淆阅读代码的人,使您的意图不清楚
显式调用所有值,然后运行检查:
t1 = self.glissement_test(y, x, -2, 0, -1, -1, -1, +1, idp)
t2 = self.glissement_test(y, x, -1, +1, -2, 0, +1, +1, idp)
t3 = self.glissement_test(y, x, +1, +1, -1, +1, +2, 0, idp)
t4 = self.glissement_test(y, x, +2, 0, +1, +1, +1, -1, idp)
t5 = self.glissement_test(y, x, +1, -1, +2, 0, -1, -1, idp)
t6 = self.glissement_test(y, x, -1, -1, +1, -1, -2, 0, idp)
# Now do the check
if t1 or t2 or t3 or t4 or t5 or t6:
self.board[y][x]['b'][idx]['m'] = True
如果glissement\u test()
以某种方式改变了self
的状态,请不要在条件语句中使用它。它会混淆阅读代码的人,使您的意图不清楚
显式调用所有值,然后运行检查:
t1 = self.glissement_test(y, x, -2, 0, -1, -1, -1, +1, idp)
t2 = self.glissement_test(y, x, -1, +1, -2, 0, +1, +1, idp)
t3 = self.glissement_test(y, x, +1, +1, -1, +1, +2, 0, idp)
t4 = self.glissement_test(y, x, +2, 0, +1, +1, +1, -1, idp)
t5 = self.glissement_test(y, x, +1, -1, +2, 0, -1, -1, idp)
t6 = self.glissement_test(y, x, -1, -1, +1, -1, -2, 0, idp)
# Now do the check
if t1 or t2 or t3 or t4 or t5 or t6:
self.board[y][x]['b'][idx]['m'] = True
循环查看您要使用的每一组值,然后查看它们是否都发生了:
tests = [self.glissement_test(y, x, *vals, idp) for vals in ((-2, 0, -1, -1, -1, 1),
(-1, 1, -2, 0, 1, 1),
(1, 1, -1, 1, 2, 0),
(2, 0, 1, 1, 1, -1),
(1, -1, 2, 0, -1, -1),
(-1, -1, 1, -1, -2, 0))]
if any(tests):
self.board[y][x]['b'][idx]['m'] = True
请注意,默认情况下整数文本为正数,因此无需指定例如+1
来获得正数1。循环查看要使用的每一组值,然后查看它们是否全部出现:
tests = [self.glissement_test(y, x, *vals, idp) for vals in ((-2, 0, -1, -1, -1, 1),
(-1, 1, -2, 0, 1, 1),
(1, 1, -1, 1, 2, 0),
(2, 0, 1, 1, 1, -1),
(1, -1, 2, 0, -1, -1),
(-1, -1, 1, -1, -2, 0))]
if any(tests):
self.board[y][x]['b'][idx]['m'] = True
请注意,整数文本在默认情况下是正的,因此您不需要指定例如+1
来获得正1。@snakecharmerb它不会使用和
调用所有函数6次,如果其中一个计算结果为false,则您已经通过将这些调用放在或
的左侧来“强制”这些调用。您是在寻找更好的方法,还是没有意识到您现有的代码很好?@snakecharmerb它不会使用和
调用所有函数6次,如果其中一个计算结果为false,则您已经通过将这些调用放在或
的左侧来“强制”这些调用。您是在寻找更好的方法,还是没有意识到您现有的代码是好的?all(tests)
将对应于和,使用any(tests)
将等同于OP的或,
在出现错误时停止计算,而或
在某个结果为真时停止计算。在这种情况下,所有的测试都已经按照预期进行了,所以在检查它们是否都成功时可以短路。@TigerhawkT3:是的,但我们不应该检查它们是否都成功。我们应该检查它们是否成功。不错的Python写作方式,我将把这个添加到我的幻灯片中,以便在Python初学者和类似Python的代码之间进行比较:^D
FYI指定+1得到正1,这样缩进在所有地方都是一样的,对于“+0”也是一样的(否则我也会在PyCharm中得到警告)all(测试)
将对应于和,使用任何(测试)
相当于OP的或和
在出现错误时停止计算,而或在出现正确时停止计算。在这种情况下,所有测试都已按预期进行,因此在检查它们是否都成功时可以短路。@TigerhawkT3:是的,但我们不应该检查它们是否都成功。我们应该检查它们是否都成功。很好的Python写作方式,我将把这个添加到幻灯片中,以便在Python初学者和类似Python的代码之间进行比较:^D
FYI我指定+1为正1,以便缩进在t上都是一样的他的位置,与“+0”相同(否则我也会在PyCharm中得到警告…)