Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “如何强制所有人”;或;_Python - Fatal编程技术网

Python “如何强制所有人”;或;

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

由于“短路运算符”,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
        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中得到警告…)