3 回答
TA贡献1808条经验 获得超4个赞
这两个语句具有非常不同的语义。请记住,Python 是动态类型的。
对于 的情况a = []
, 和not a
是len(a) == 0
等价的。一个有效的替代方案可能是检查not len(a)
. 在某些情况下,您甚至可能想通过执行以下操作来检查空虚和安逸a == []
。
但a
可以是任何东西。例如,a = None
. 支票not a
没问题,会退回来的True
。但len(a) == 0
根本不会好起来。相反,你会得到TypeError: object of type 'NoneType' has no len()
. 这是一个完全有效的选项,但是这些if
语句的作用非常不同,您必须选择您想要的。
(几乎)__bool__
Python 中的所有东西都有方法,但并非所有东西都有__len__
. 您必须根据情况决定使用哪一种。需要考虑的事情是:
你已经验证是否
a
是一个序列了吗?你需要吗?
您介意您的
if
语句因非序列而崩溃吗?您是否想将其他虚假对象视为空列表来处理?
请记住,让代码看起来漂亮比正确完成工作要重要。
TA贡献1804条经验 获得超3个赞
虽然这个问题很老了,但我想提供一个观点。
在动态语言中,我的偏好是始终描述变量的预期类型和目标,以便提供更多的目的理解。然后尽可能使用语言知识来简洁并增加可读性(在Python中,空列表的布尔结果为假)。因此代码:
lst_colours = []
if not lst_colours:
print("list is empty")
更好地传达含义是使用变量进行非常具体的检查。
lst_colours = []
b_is_list_empty = not lst_colours
if b_is_list_empty:
print("list is empty")
在代码库中多次检查列表是否为空是很常见的事情。因此,在单独的文件辅助函数库中实现更好的功能。从而隔离常见的检查,并减少代码重复。
lst_colours = []
if b_is_list_empty(lst_colours):
print("list is empty")
def b_is_list_empty (lst):
......
最重要的是,尽可能多地添加含义,有一个商定的公司标准来选择如何处理简单的事情,例如变量命名和隐式/显式代码选择。
TA贡献1815条经验 获得超10个赞
试着想一想:
if not a: ...
作为以下形式的简写:
if len(a) == 0: ...
我不认为这是 Python 禅宗规则“显式”优于“隐式”的一个很好的例子。这样做主要是为了可读性。并不是说第二个是坏的,另一个是好的。只是第一个更有技巧而已。如果你了解 Python 中列表的布尔性质,我想你会发现第一个在 Python 中更具可读性和可读性。
添加回答
举报