我无法理解%背后的这种情况如何运作
for i in range(1,6):
print "pet%d" % (i == 1 and 2 or 4)
这部分(i == 1 and 2 or 4)
是我无法理解的。据我所知,它和
if i == 1:
i = 2
else:
i = 4
但(i == 1 and 2 or 4)
如何使用%d%i格式化?
答案 0 :(得分:4)
使用python 2 if i == 1 else 4
或a if b else c
if i == 1 then 2 else 4
除非4
返回true,否则会提供i == 1
,然后它会2
:
pet2
pet4
pet4
pet4
pet4
这种布尔(ab)用法在shell脚本中很常见:
如果i == 1
为True
,那么我们必须测试and
另一边的内容。 2
也是true
,因此我们提前退出(因为or
已知为true
,并返回最后一个值2
。
如果i == 1
为False
,我们会跳过and
的另一面,并评估or
的另一面,即4
。 4
为true
,因此我们返回4
。
答案 1 :(得分:2)
您所拥有的是short-circuiting与and
和or
的示例。
我们可以添加一些parens来查看表达式的评估方式:
(((i == 1) and 2) or 4)
时才计算第二个参数
or
:仅在第一个参数为False
时才计算第二个参数
and
:仅在第一个参数为True
当i
为1时,评价的结果为2(因为2是真的,而or
的第二个操作数将不被评估),否则为4(因为{{1}在False
的第一个操作数中,表示将返回and
的第二个操作数。
答案 2 :(得分:1)
关于条件声明:
在Python中,某些值可以像True
和False
一样进行评估,即使它们不是布尔值:
例如:
if []:
print "this branch is never reached since it evaluates to False"
print "due to the empty list"
if 0:
print "same thing here"
(有关如何在布尔表达式中评估某些数据类型的更多信息:http://getpython3.com/diveintopython3/native-datatypes.html#booleans)
现在,回到以下声明:
(i == 1 and 2 or 4)
这里我们也有一个布尔表达式。解剖表达式,我们有以下内容:
(i == 1 and 2 or 4)
((i == 1) and 2) or (4) # This is the order of evaluation
由于2和4不是0,它们将始终评估为True
现在,了解输出:如果i
不同于1,输出将始终为4 。
这是因为如果i == 1
返回值为2.返回值2是因为没有必要计算整个表达式2 or 4
,因为第一部分被评估为True。
另一方面,如果i不是1,则必须评估值4。因为4不为零,所以它被评估为True。
这就是为什么如果i不同于1
,输出总是为4关于"三元"操作强>:
Python没有像Java / C / C ++那样的三元运算符(?:)但你使用if-else也有类似的效果:
# value a = <value if condition is true> if <condition> else <other value>
# Example
>>> a = 2 if 1 < 10 else 0
>>> a
2
因此,如果要打印范围功能中的值,则应使用以下内容:
for i in range(1,6):
print "pet%d" % i
或者,也许,为偶数打印A,为奇数打印B:
for i in range(1,6):
print "pet%s" % ("A" if i % 2 == 0 else "B")
答案 3 :(得分:-1)
我可能错了,但我知道在javaScript中,当你说i == 1和2或4时,它从左到右进行评估。
因此,计算机将确定i == 2,如果确实如此,它将具有设置为1的临时值,并取该标志并按位AND与2,得到值2.由于下一个表达式是一个OR,它不会计算,因为条件为真,无论“和”运算符是否短路。因此2将打印。
但是如果i!= 2,则第一部分将评估为false,并且具有全0位的临界值。然后,使用4或将值更改为4(按位0将4更改为4),因此将打印4。
我希望这是有道理的!如果您有任何其他问题,请告诉我。