布尔运算符如何在python中对字符串起作用

时间:2013-06-03 03:43:27

标签: python

True and "asdf" or "qwer"

result => “ASDF”

False and "asdf" or "qwer"

result => “QWER”

我无法理解这些事情是如何运作的。我认为字符串上的布尔运算符会使类型错误,但它没有。它是否类似于预定义语句,例如“a if b else c”?

6 个答案:

答案 0 :(得分:4)

Python 以及操作在确定答案时停止,并返回扫描的最后一个对象的值。他们不会返回 True False 。我喜欢这个功能,发现自己一直在使用它。

由于非空字符串计为True

True and "asdf" or absolutely_anything_here_or_following

当它到达时停止计算,因为现在确定了答案(其中一个值为true),并返回它检查的最后一个东西(“asdf “)。甚至没有检查过其他操作数。

另一方面,

False and "asdf" or absolutely_anything_here

点击,它不知道anwser,所以继续下一个操作数。只要absolute_anything_here是最后一个操作,就会确定答案并返回最后扫描的内容。

答案 1 :(得分:3)

andor就像熟悉的布尔运算符一样 - 如果两个操作数都为真,则返回true,如果其操作数之一为真,则返回false。

它们也会短路,就像&&||一样。

但是,在Python中,在布尔上下文中可以将任何内容解释为TrueFalse,还有一个额外的事实 - 它将返回第一个计算为{{1}的操作数当有足够的信息来停止评估时,或者在布尔上下文中对True求值。 (这与构造和返回一个真正的布尔值FalseTrue相反。)这样做是可以的,因为如果它是布尔值,它将评估它将返回的布尔值,如果不是这样的话事实。

因此(注意False在布尔上下文中被评估为""

False

答案 2 :(得分:2)

在Python条件运算符之前:

>>> age=20
>>> 'legal' if age>=21 else 'not legal'
'not legal'

曾经有“货物代码”作为基于索引元组的解决方法:

>>> ('not legal','legal')[age>=21]
'not legal'
>>> age=22
>>> ('not legal','legal')[age>=21]
'legal'

您可以反汇编您发布的两个替代方案,以了解幕后发生的事情:

>>> import dis
>>> def f():
...    x=True and "asdf" or "qwer"
...    y=False and "asdf" or "qwer"
... 
>>> dis.dis(f)
  2           0 LOAD_GLOBAL              0 (True)
              3 POP_JUMP_IF_FALSE       12
              6 LOAD_CONST               1 ('asdf')
              9 JUMP_IF_TRUE_OR_POP     15
        >>   12 LOAD_CONST               2 ('qwer')
        >>   15 STORE_FAST               0 (x)

  3          18 LOAD_GLOBAL              1 (False)
             21 POP_JUMP_IF_FALSE       30
             24 LOAD_CONST               1 ('asdf')
             27 JUMP_IF_TRUE_OR_POP     33
        >>   30 LOAD_CONST               2 ('qwer')
        >>   33 STORE_FAST               1 (y)
             36 LOAD_CONST               0 (None)
             39 RETURN_VALUE 

您可以看到您看到的值弹出您所看到的值。您还可以查看boolean operators的短路行为,并查看这是记录的行为。

答案 3 :(得分:0)

python中的对象被视为True的False(例如,'',None)

布尔结果的结果依赖于可以确定结果的最后一个值。

  

打印'aa'和True

'aa'为True,但无法确定结果,因此结果转为True

,而

print True and 'aa'

'AA'

但是运营商或与运营商不同,请参阅

print None and True

第一个None被认为是False,它可以确定最后的结果, 所以打印'无'

,而

print False or 'bb'

'BB'

因为第一个False无法确定最终结果!

答案 4 :(得分:0)

第一个例子
Python从左到右扫描和评估。

在你的第一个例子中

True and "asdf" or "qwer"

评估为

"asdf" or "qwer"

因为非空字符串为True,所以Python短路(忽略第二个操作数)并返回第一个操作数"asdf"。请注意,无论True or x的值是什么,True都会返回x

第二个例子

False and "asdf" or "qwer"

这评估为

False or "qwer"

这次我们不会在第一个操作数上短路(我们还没有足够的信息),而Python需要检查第二个操作数qwer,它在{1}中计算为True布尔上下文(记住它不是空的),并返回它。

答案 5 :(得分:0)

运营商的运营顺序: - 首先评估; - 接下来评估; - 或最后评估。 根据您的问题,首先评估“和”运算符,因为非空字符串计为True。因此True和“asdf”变为True而不是True或“qwer”也变为true。结果变成“asdf” 在第二个False和“asdf”变为false和false并且“qwer”变为false。因此它是假的,所以它返回最后检查“qwer”的东西。