括号字符串中的布尔条件的printf样式字符串格式设置%d%(i condition)

时间:2016-12-12 20:50:42

标签: python python-2.7 conditional-statements

我无法理解%背后的这种情况如何运作

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格式化?

4 个答案:

答案 0 :(得分:4)

使用python 2 if i == 1 else 4a if b else c

将其读作if i == 1 then 2 else 4

除非4返回true,否则会提供i == 1,然后它会2

pet2
pet4
pet4
pet4
pet4

这种布尔(ab)用法在shell脚本中很常见:

Evaluating the boolean如下:

如果i == 1True,那么我们必须测试and另一边的内容。 2也是true,因此我们提前退出(因为or已知为true,并返回最后一个值2

如果i == 1False,我们会跳过and的另一面,并评估or的另一面,即44true,因此我们返回4

答案 1 :(得分:2)

您所拥有的是short-circuitingandor的示例。

我们可以添加一些parens来查看表达式的评估方式:

(((i == 1) and 2) or 4)
  

or:仅在第一个参数为False

时才计算第二个参数      

and:仅在第一个参数为True

时才计算第二个参数

i为1时,评价的结果为2(因为2是真的,而or的第二个操作数将不被评估),否则为4(因为{{1}在False的第一个操作数中,表示将返回and的第二个操作数。

答案 2 :(得分:1)

关于条件声明:

在Python中,某些值可以像TrueFalse一样进行评估,即使它们不是布尔值:

例如:

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。

我希望这是有道理的!如果您有任何其他问题,请告诉我。