Python - 带有Type和Or的布尔表达式的语法

时间:2014-01-18 22:37:24

标签: python boolean

varA = 1

varB = 2

具有正确结果的代码:

if type(varA) == type('a') or type(varB) == type('a'):
    print "string involved (either varA or varB is a string)"
else:
    print "varA and varB are not strings"

代码w /不正确的结果:

if type(varA) or type(varB) == type('a'):
    print "string involved (either varA or varB is a string)"
else:
    print "varA and varB are not strings"

为什么第二组代码没有返回预期结果(即“varA和varB不是字符串”)? Python使用第二组代码执行的操作的逐步细分是什么?我发现一个类似的问题已经得到解答,但并没有完全理解这个解释。 Python: If-else statements

4 个答案:

答案 0 :(得分:3)

在第二个代码片段中,Python正在解释if语句的条件,如下所示:

if (type(varA)) or (type(varB) == type('a')):

此外,总是评估为True

这是因为,无论varA的价值是什么,type(varA)评估为True

>>> varA = 'a'
>>> bool(type(varA))
True
>>> varA = False
>>> bool(type(varA))
True
>>>

事实上,由于Python的逻辑运算符短路(尽快停止评估),条件的type(varB) == type('a')部分将永远不会被评估。


另外,您应该使用is来比较类型:

if type(varA) is str or type(varB) is str:

或者,您可以使用isinstance

if isinstance(varA, str) or isinstance(varB, str):

答案 1 :(得分:1)

你的第二个例子不起作用,因为它解析为

if (type(varA)) or (type(varB) == type('a')):

type(varA)将始终是一个被视为True的类类型,因此整个表达式将为True


有更好的方法可以做到这一点

if any(isinstance(v, str) for v in (varA, varB)):
如果iterable中的任何内容为true,

any将获取一个iterable并计算为Trueisinstance检查第一个参数“是否是”第二个参数。将生成器表达式放在任何读取内部“如果任何v in(varA,varB)是一个字符串):...”

>>> var = 1
>>> isinstance(var, str) # var is an int, not a str
False
>>> isinstance(var, int)
True
>>> isinstance('a', int)
False
>>> isinstance('a', str) # 'a' is a str
True

答案 2 :(得分:0)

iCodez是绝对正确的,但是如果你真的想要按照“列出所有元素并检查其中一个是否为字符串”的方式做一些事情:

if str in map(type, [varA, varB]):
    print "string involved"

答案 3 :(得分:-1)

因为在第二种情况下,您没有比较两个变量。任何大于0的整数都将返回True,因此您不会在此处比较类型。

if type(varA):

将始终为True,因为varA等于1.您甚至不会达到条件的第二部分。