为了账号安全,请及时绑定邮箱和手机立即绑定

Python 之禅“显式优于隐式”

Python 之禅“显式优于隐式”

月关宝盒 2023-09-12 15:10:24
我试图理解“隐式”和“显式”在 Python 上下文中的真正含义。a = []# my understanding is that this is implicitif not a:   print("list is empty")# my understanding is that this is explicitif len(a) == 0:   print("list is empty")我试图遵循Python 的禅宗规则,但我很好奇这是否适用于这种情况,或者我是否想得太多了?
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

这两个语句具有非常不同的语义。请记住,Python 是动态类型的。

对于 的情况a = [], 和not alen(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语句因非序列而崩溃吗?

  • 您是否想将其他虚假对象视为空列表来处理?

请记住,让代码看起来漂亮比正确完成工作要重要。


查看完整回答
反对 回复 2023-09-12
?
狐的传说

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):

  ......

最重要的是,尽可能多地添加含义,有一个商定的公司标准来选择如何处理简单的事情,例如变量命名和隐式/显式代码选择。


查看完整回答
反对 回复 2023-09-12
?
动漫人物

TA贡献1815条经验 获得超10个赞

试着想一想:

if not a:
    ...

作为以下形式的简写:

if len(a) == 0:
    ...

我不认为这是 Python 禅宗规则“显式”优于“隐式”的一个很好的例子。这样做主要是为了可读性。并不是说第二个是坏的,另一个是好的。只是第一个更有技巧而已。如果你了解 Python 中列表的布尔性质,我想你会发现第一个在 Python 中更具可读性和可读性。


查看完整回答
反对 回复 2023-09-12
  • 3 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信