if 语句和 if equals 语句的区别
Difference between an if statement and an if equals statement
两者有实际区别吗
if statement:
和
if statement == True:
除了第一个更短之外,哪个优先级更高,还是更慢?
编辑:
我意识到这可能不是很清楚,但 statement
通常是 statement = True
。
if statement
:只要 statement
是 truthy(int
不等于 '0',True
,一个 list
至少有一个元素,一个 dict
有一个键,值对..等)。
if statement == True
:仅当 statement
为 True
时才计算为真,即
>>> print(statement)
True
那些不等于。 Python 允许您 在大范围的元素 上定义 if
语句。例如你可以写:
if []: # is False
pass
if 1425: # is True
pass
if None: # is False
pass
基本上,如果您编写 if <expr>
,Python 将 计算表达式 的 truthness。这是为数字预定义的(int
、float
、complex
、不等于零)、一些内置集合(list
、dict
、不为空),并且您可以自己在任意对象上定义 __bool__
或 __len__
。您可以通过对对象调用 bool(..)
来获得对象的 真实性 。例如 bool([]) == False
.
if x
不等于 if x == True
的示例:
例如:
if 0.1:
pass # will take this branch
else:
pass
将采用 if
分支,而:
if 0.1 == True:
pass
else:
pass # will take this branch
将不走if
分支。这是因为一个数字 等于 True
如果它是一个 (1
, 1L
, 1+0j
,...) .而如果 x
是 非零 .
,则数字的 bool(x)
是 True
也可以定义一个对象,其中 ==
将 引发异常 。喜欢:
class Foo:
def __eq__(self,other):
raise Exception()
现在调用 Foo() == True
将导致:
>>> Foo() == True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __eq__
Exception
但是 不建议 在 __eq__
函数中引发异常(无论如何我强烈建议不要这样做)。
然而,它认为:if <expr>:
等同于 if bool(<expr>):
。
鉴于两者相等,显然 <expr> == True
会变慢,因为您额外调用了 __eq__
,等等
此外,通常更惯用来检查集合是否为空:
some_list = []
if some_list: # check if the list is empty
pass
这也更 安全 因为如果 some_list
可能是 None
(或另一种集合),您仍然检查它是否成立至少有一个元素,所以稍微改变一下想法不会产生太大的影响。
所以如果你必须写if x == True
,通常会有一些奇怪的与[=39的真实性 =]本身。
关于真相的一些背景:
如文档中所述 (Python-2.x/Python-3.x)。有办法解决真实性。
在python-2.x中,它被评估为(过度简化版本,更多"pseudo Python"代码来解释它是如何工作的):
# Oversimplified (and strictly speaking wrong) to demonstrate bool(..)
# Only to show what happens "behind the curtains"
def bool(x):
if x is False or x is None:
return False
if x == 0 or x == 0.0 or x == 0L or x == 0j:
return False
if x is () or x == [] or x == '' or x == {}:
return False
if hasattr(x,'__nonzero__'):
y = x.__nonzero__()
return y != 0 and y != False
if hasattr(x,'__len__'):
return x.__len__() != 0
return True
和过度简化的版本python-3.x:
# Oversimplified (and strictly speaking wrong) to demonstrate bool(..)
# Only to show what happens "behind the curtains"
def bool(x):
if x is False or x is None:
return False
if x == 0 or x == 0.0 or x == 0j:
return False
if x is () or x == [] or x == '' or x == {}:
return False
if hasattr(x,'__bool__'):
return x.__bool__() is True
if hasattr(x,'__len__'):
return x.__len__() != 0
return True
if statement:
和
if statement == True:
除了第一个更短之外,哪个优先级更高,还是更慢?
编辑:
我意识到这可能不是很清楚,但 statement
通常是 statement = True
。
if statement
:只要 statement
是 truthy(int
不等于 '0',True
,一个 list
至少有一个元素,一个 dict
有一个键,值对..等)。
if statement == True
:仅当 statement
为 True
时才计算为真,即
>>> print(statement)
True
那些不等于。 Python 允许您 在大范围的元素 上定义 if
语句。例如你可以写:
if []: # is False
pass
if 1425: # is True
pass
if None: # is False
pass
基本上,如果您编写 if <expr>
,Python 将 计算表达式 的 truthness。这是为数字预定义的(int
、float
、complex
、不等于零)、一些内置集合(list
、dict
、不为空),并且您可以自己在任意对象上定义 __bool__
或 __len__
。您可以通过对对象调用 bool(..)
来获得对象的 真实性 。例如 bool([]) == False
.
if x
不等于 if x == True
的示例:
例如:
if 0.1:
pass # will take this branch
else:
pass
将采用 if
分支,而:
if 0.1 == True:
pass
else:
pass # will take this branch
将不走if
分支。这是因为一个数字 等于 True
如果它是一个 (1
, 1L
, 1+0j
,...) .而如果 x
是 非零 .
bool(x)
是 True
也可以定义一个对象,其中 ==
将 引发异常 。喜欢:
class Foo:
def __eq__(self,other):
raise Exception()
现在调用 Foo() == True
将导致:
>>> Foo() == True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __eq__
Exception
但是 不建议 在 __eq__
函数中引发异常(无论如何我强烈建议不要这样做)。
然而,它认为:if <expr>:
等同于 if bool(<expr>):
。
鉴于两者相等,显然 <expr> == True
会变慢,因为您额外调用了 __eq__
,等等
此外,通常更惯用来检查集合是否为空:
some_list = []
if some_list: # check if the list is empty
pass
这也更 安全 因为如果 some_list
可能是 None
(或另一种集合),您仍然检查它是否成立至少有一个元素,所以稍微改变一下想法不会产生太大的影响。
所以如果你必须写if x == True
,通常会有一些奇怪的与[=39的真实性 =]本身。
关于真相的一些背景:
如文档中所述 (Python-2.x/Python-3.x)。有办法解决真实性。
在python-2.x中,它被评估为(过度简化版本,更多"pseudo Python"代码来解释它是如何工作的):
# Oversimplified (and strictly speaking wrong) to demonstrate bool(..)
# Only to show what happens "behind the curtains"
def bool(x):
if x is False or x is None:
return False
if x == 0 or x == 0.0 or x == 0L or x == 0j:
return False
if x is () or x == [] or x == '' or x == {}:
return False
if hasattr(x,'__nonzero__'):
y = x.__nonzero__()
return y != 0 and y != False
if hasattr(x,'__len__'):
return x.__len__() != 0
return True
和过度简化的版本python-3.x:
# Oversimplified (and strictly speaking wrong) to demonstrate bool(..)
# Only to show what happens "behind the curtains"
def bool(x):
if x is False or x is None:
return False
if x == 0 or x == 0.0 or x == 0j:
return False
if x is () or x == [] or x == '' or x == {}:
return False
if hasattr(x,'__bool__'):
return x.__bool__() is True
if hasattr(x,'__len__'):
return x.__len__() != 0
return True