2017-02-17 88 views
-2

我看到下面一段简单的代码的一些变化:奇怪的Python的布尔运算符

if dist_1>dist_2 : 
    print enemy_2 
else: 
    print enemy_1 

变化1:

print (enemy_1, enemy_2)[dist_1 > dist_2] 

变化2:

e1, d1, e2 = (raw_input() for _ in '123') 
print (e1, e2)[d1 > raw_input()] 

能有人请解释print (x,y)[x>y]代码的工作原理是什么?

+1

我在这里添加了一个python 2标签,因为我确信这在Python 3中不起作用 –

+1

它只是一个元组,根据'x> y'的结果访问0或1 ... – Li357

+1

@MadPhysicist它没有花时间在3.6.0下进行测试。有用! – Jules

回答

3

布尔实际上是整数的一个子类中的Python:

isinstance(True, int) 
isinstance(False, int) 

都是真实的陈述。所以你可以用一个布尔值来索引一个两元素序列。如果布尔值为False,您将获得第一个元素。如果布尔值为True,则会得到第二个元素。

表达式(enemy_1, enemy_2)创建了一个双元素tuple[dist_1 > dist_2]提供了布尔指数。 print是偶然的;它只是用来输出结果。

+1

为防止混淆:类型bool从int类型派生,因此isinstance(2,bool)为False。所以布尔实际上是整数,但整数不是布尔。就像猫是动物,但动物不一定是猫。 –

+0

@JacquesdeHooge。我不是特别相关的,相反是不正确的,但我确实让我的语言更准确地表明它。 –

+0

我很想知道为什么downvote。我的解释中有什么不真实或根本缺乏? –

1

如果你将至少一个逗号放在parens中,它将变成一个元组。与列表类似,您可以索引一个元组。您通常使用整数进行索引。但是,如果使用的是布尔然后假将被解释为0和True您索引将被解释为1

因此,代码:

(enemy_1, enemy_2)[dist_1 > dist_2] 

是英文解释为“如果dist_1>比dist_2给予我从元组中取得第1项,否则给我第0项。“

如果你愿意,你可以做一个元组教程。

+2

“如果你把东西在parens它成为一个元组”。不一定:是(2)'元组? –

+0

@ Jean-FrançoisFabreNotpick:如果它是函数调用的一部分,那么是的,它可能成为元组的一部分(['PyArg_ParseTupleAndKeywords'](https://docs.python.org/3/c-api/arg.html #c.PyArg_ParseTupleAndKeywords)或者如果函数接受'* args'):-) – MSeifert