Python:If-else语句
以下代码显示错误:Python:If-else语句,python,if-statement,Python,If Statement,以下代码显示错误: if ((type(varA) or type(varB) ) == type('t')): print "string involved" elif varA<varB: print "RANDOM" 输出: RANDOM 而另一段代码 if ((type(varA) == type('t')) or (type(varB)== type('t'))): print "string involved" elif varA<varB:
if ((type(varA) or type(varB) ) == type('t')):
print "string involved"
elif varA<varB:
print "RANDOM"
输出:
RANDOM
而另一段代码
if ((type(varA) == type('t')) or (type(varB)== type('t'))):
print "string involved"
elif varA<varB:
print "RANDOM"`
输出如下:
string involved
这两个“如果”条件之间有什么区别?我发现他们的逻辑是一样的 这是错误的:
if ((type(varA) or type(varB) ) == type('t')):
应该是:
if type(varA) == str or type(varB) == str:
相当于:
if isinstance(varA, str) or isinstance(varB, str):
或者再短一点:
if str in ((type(varA), type(varB)):
这是错误的:
if ((type(varA) or type(varB) ) == type('t')):
应该是:
if type(varA) == str or type(varB) == str:
相当于:
if isinstance(varA, str) or isinstance(varB, str):
或者再短一点:
if str in ((type(varA), type(varB)):
问题在于这个表达式:
if ((type(varA) or type(varB) ) == type('t')):
编程语言不像英语那样工作。上面首先计算type(varA)或type(varB)
,这将产生varA
的类型,因为或返回第一个truthy值,任何类型都是truthy
然后它将检查这是否与type('t')
相同,即str
。这意味着只有当varA
是一个字符串并且varB
的类型被完全忽略时,它才是真的
您想要的可能是:
if type(varA) == type('t') or type(varB) == type('t'):
但是有更多的惯用/蟒蛇式的方法;有关一些示例,请参见奥斯卡·洛佩斯的答案。问题在于这个表达式:
if ((type(varA) or type(varB) ) == type('t')):
编程语言不像英语那样工作。上面首先计算type(varA)或type(varB)
,这将产生varA
的类型,因为或返回第一个truthy值,任何类型都是truthy
然后它将检查这是否与type('t')
相同,即str
。这意味着只有当varA
是一个字符串并且varB
的类型被完全忽略时,它才是真的
您想要的可能是:
if type(varA) == type('t') or type(varB) == type('t'):
但是有更多的惯用/蟒蛇式的方法;有关一些示例,请参见Óscar López的答案。如果您希望测试对str
的子类同样有效,最好使用isintance
而不是type
if any(isinstance(x, str) for x in (varA, varB)):
...
如果您希望测试对str
的子类同样有效,那么最好使用isintance
而不是type
if any(isinstance(x, str) for x in (varA, varB)):
...
我不懂python,但我怀疑你能做到。在大多数语言中,当你指的是(a==something)
(b==something)
时,你无法比较(a==something)
。你为什么要检查类型?Python的成语是寻求宽恕而不是许可。我不懂Python,但我怀疑你能做到这一点。在大多数语言中,当你指的是(a==something)
(b==something)
时,你无法比较(a==something)
。你为什么要检查类型?Python的习惯用法是寻求宽恕而不是许可。在那里使用元组真的有语义意义吗?我会使用一个列表。或者甚至isinstance(varA,str)或isinstance(varB,str)
@WaleedKhan这是一样的,但是为了使使用元组更有意义,因为元素不会被修改。事实上,您甚至可以查看isinstance
的文档:isinstance(对象、类或类型或元组)->bool
。您可以编写isinstance(a,(str,list))
,但不能编写isinstance(a,[str,list])
;试试看。@WaleedKhan导入这个
写着“尽管实用性胜过纯洁性”。在这种情况下,我们知道我们只会在这个对象上调用\uuuuu contains\uuuuu
,所以我们最好使用最有效的类型。在那里使用元组真的有语义意义吗?我会使用一个列表。或者甚至isinstance(varA,str)或isinstance(varB,str)
@WaleedKhan这是一样的,但是为了使使用元组更有意义,因为元素不会被修改。事实上,您甚至可以查看isinstance
的文档:isinstance(对象、类或类型或元组)->bool
。您可以编写isinstance(a,(str,list))
,但不能编写isinstance(a,[str,list])
;试试看。@WaleedKhan导入这个
写着“尽管实用性胜过纯洁性”。在这种情况下,我们知道我们只会在这个对象上调用\uuuuu contains\uuuu
,因此我们最好使用最有效的类型。