python如何判断为空_[Python]判断序列是否为空的正确姿势

本篇文章起源于StackOverflow上一个热度非常高的问题:

@Ray Vega (提问者)

举例说明,现在我得到了如下代码:

a = []

我如何该检查 a 是否为空?

面对这个问题,各路高手给出了不尽相同的回答。

最高票答案十分简洁:@Patrick (答题者)

if not a:

print("List is empty")

利用空列表的隐式布尔值是一个非常Pythonic的方式。

排名第二的答案与第一观点相同,并以PEP 8作为依据,说明不仅是列表,Python中的内置序列类型都有推荐的做法:@Harley Holcombe (答题者)

PEP 8 风格指南 给出了推荐的Pythonic的方法(其中Yes 表示推荐, No表示不推荐):

对序列数据类型(字符串,列表,元组),利用空列表隐式为False的事实

Yes: if not seq:

if seq:

No: if len(seq):

if not len(seq):

然而,排名第三的答案给出了不同的看法:我更推荐显式的方法:

if len(li) == 0:

print('the list is empty')

这种方式明确声明了li是一个序列类型的变量,并且我们是在检查它的长度。而if not li的问题在于,它会给我li是一个布尔类型变量的印象。

那么,判断列表(序列)是否为空的正确姿势到底是什么呢?这貌似只是一个编码风格的问题,但我们分别从两类不同看法的出发点挖掘更深层次的原因,可以让自己更明确地选择适合自己的风格。

什么是PEP 8

PEP,全称Python Enhancement Proposals (翻译过来就是Python增强建议书),有兴趣的读者可以直接阅览PEP原文。 PEP本质上是一份Python的官方文档库,给Python社区提供信息,或者描述Python的新特性或开发进展。而PEP 8是这个文档库中的一员,专门用于描述Python的编码规范,这里规范是指官方推荐的,被认为是更符合Python设计哲学的各种实践。

同样实现相同的功能,不同编程语言的倾向于使用不同的风格,这是因为每种语言都有自身的设计目的,而Python的设计目的非常明显:优雅,简单,可读。正如PEP 20(另一份PEP)Python之禅中所说:简单优于复杂

于是,依据序列长度是否为0将序其隐式转化为布尔值,成为Python实现中的特性之一,并成为官方推荐的判断序列是否为空的Pythonic方式。

关于Python是如何做到序列类型乃至所有类型到布尔值的隐式转化的,我会专门就此问题写文讨论,欢迎关注。

什么是动态类型

那么为什么还会有人提出明确使用看上去复杂的if len(li) == 0来判断,并且还有很多人表示赞同呢?这其实来源于Python语言的动态类型特性。

关于什么是动态类型,我也会另外专门讨论,在这里,我们只需阐明,动态类型带来了一个弊端,我们无法对变量在程序中某一位置的类型进行准确判断。在阅读Python代码的过程中,我们可能最为头痛的问题就是:这里这个变量是什么(类型)???唯一留给我们的线索也许只有变量名了。而在静态类型语言,如Java中,一个变量的类型从其声明时是确定的,在程序中不会发生改变。

回到我们的问题,if not li,看到这段代码的程序猿可能会疑惑,这里的li变量是什么,是一个布尔类型?还是一个整型?这里的测试是在干什么?而if len(li) == 0可以很大程度上进行提示:这大抵是个容器性质的变量,我们在做的大抵是判断其元素数量是否为0.

总结

讨论到这里,我们仍然只能说,Python中如何判断一个列表是否为空,是一个与风格和习惯有关的问题,但是深入探究我们发现,风格和习惯不是目的,而是手段,代码最终是服务于编码者和阅读者的,抛开性能问题,只从可读性出发,你希望阅读这份代码的人接受到的是什么,是简单优雅,还是信息提示,这才是比所谓Pythonic更值得思考的问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值