Python 之禅“显式优于隐式”

我试图理解“隐式”和“显式”在 Python 上下文中的真正含义。


a = []


# my understanding is that this is implicit

if not a:

   print("list is empty")


# my understanding is that this is explicit

if len(a) == 0:

   print("list is empty")

我试图遵循Python 的禅宗规则,但我很好奇这是否适用于这种情况,或者我是否想得太多了?



月关宝盒
浏览 104回答 3
3回答

炎炎设计

这两个语句具有非常不同的语义。请记住,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语句因非序列而崩溃吗?您是否想将其他虚假对象视为空列表来处理?请记住,让代码看起来漂亮比正确完成工作要重要。

狐的传说

虽然这个问题很老了,但我想提供一个观点。在动态语言中,我的偏好是始终描述变量的预期类型和目标,以便提供更多的目的理解。然后尽可能使用语言知识来简洁并增加可读性(在Python中,空列表的布尔结果为假)。因此代码:lst_colours = [] if not lst_colours:   print("list is empty")更好地传达含义是使用变量进行非常具体的检查。lst_colours = []b_is_list_empty = not lst_coloursif 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):  ......最重要的是,尽可能多地添加含义,有一个商定的公司标准来选择如何处理简单的事情,例如变量命名和隐式/显式代码选择。

动漫人物

试着想一想:if not a:     ...作为以下形式的简写:if len(a) == 0:     ...我不认为这是 Python 禅宗规则“显式”优于“隐式”的一个很好的例子。这样做主要是为了可读性。并不是说第二个是坏的,另一个是好的。只是第一个更有技巧而已。如果你了解 Python 中列表的布尔性质,我想你会发现第一个在 Python 中更具可读性和可读性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python