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

我该如何判断一个Python列表是否为空?

@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更值得思考的问题。


获取最新文章更新,欢迎关注我的公众号: StackOverflow Daily

[Python]判断序列是否为空的正确姿势的更多相关文章

  1. python判断字符串是否为空的方法s.strip()=='' if not s.strip():

    python 判断字符串是否为空用什么方法? 复制代码 s=' ' if s.strip()=='':     print 's is null' 或者 if not s.strip():     p ...

  2. python判断字符串是否为空和null

    1.使用字符串长度判断 len(s==0)则字符串为空 test1 = '' if len(test1) == 0: print('test1为空串') else: print('test非空串,te ...

  3. Python - 判断list是否为空

    Python中判断list是否为空有以下两种方式: 方式一: list_temp = [] if len(list_temp): # 存在值即为真 else: # list_temp是空的 方式二: ...

  4. python判断值是否为空

    代码中经常会有变量是否为None的判断,有三种主要的写法: 第一种是`if x is None`: 第二种是 `if not x:`: 第三种是`if not x is None`(这句这样理解更清晰 ...

  5. Python判断自定义的参数格式是否正确

    import argparse def args_validation(valid_list, valid_value): assert valid_value in valid_list, 'inv ...

  6. python 判断字符串是否为空用什么方法?

    s=' ' if s.strip()=='': print 's is null' 或者 if not s.strip(): print 's is null'

  7. python 判断字典是否为空

    my_dict = {} if not bool(my_dict): print("Dictionary is empty")

  8. 利用Python构建时间序列模型解决实际问题的正确姿势

    要本着应用到实际工作中目的去学时间序列分析,才能深入浅出的学会,不要纠结于理论,只听我的,我有信心说明白. 本章内容 趋势分析 序列分解 序列预测 序列分解 统计学基础铺垫 划分 时间序列按照季节性划 ...

  9. python setup.py 安装和卸载 的正确姿势

    1.install python setup.py install --record files.txt 2. uninstall 删除这些文件 cat files.txt | xargs rm -r ...

随机推荐

  1. NGUI的slider的滑动条制作(SliderScript)

    一,添加一个sprite,给这个sprite添加一个背景如下图: 二,在当前的sprite添加一个子sprite同时给子层添加一个颜色较深的图片,这个子层覆盖当前sprite,我们需要调节子层的dep ...

  2. day50 初识JavaScript

    一.背景介绍 (一)web开发的三种样式: 结构:HTML:从语义的角度,描述页面结构 样式:CSS:从审美的角度,描述样式(美化页面) 行为(动态)JavaScript:从交互的角度,描述行为(用于 ...

  3. A星寻路

    逻辑代码 using System.Collections.Generic; using System.Text; using UnityEngine; namespace Game { public ...

  4. shell脚本实现ftp上传下载文件

    前段时间工作中需要将经过我司平台某些信息核验数据提取后上传到客户的FTP服务器上,以便于他们进行相关的信息比对核验.由于包含这些信息的主机只有4台,采取的策略是将生成的4个文件汇集到一个主机上,然后在 ...

  5. excel条件格式 满足包含xx的整行高亮

    条件格式-->新建规则-->使用公式确定要设置格式的单元格   =COUNTIF($D4,"*_S_*")   =COUNTIF($D4,"*_M_*&quo ...

  6. 关于嵌入式linux下的串口通讯问题---需增加回车/换行才能接收

    问题:在Linux应用层,直接从/dev/tty***使用read()函数读数据,无法读到,只有在数据末尾加上0a/0d才可以读到数据(这里是发送十六进制的数据,ASCLL码同理,增加回车才可以读到数 ...

  7. QT的总结文章(转)

    ★了解Qt和C++的关系  ★掌握Qt的信号/槽机制的原理和使用方法  ★了解Qt的元对象系统  ★掌握Qt的架构  ★理解Qt的事件模型,掌握其使用的时机 信号与槽.元对象系统.事件模型是Qt机制的 ...

  8. Python3.5-20190526-廖老师-自我笔记-单元测试-参数换-paramunittest

    参数化: import timeimport list1 #想测试list1中的求和函数是否正确fun1import paramunittestimport unittest #先设置参数组@para ...

  9. $NOI2014$ 购票(斜率优化 点分治)

    \(NOI2014\)购票 哇终于可以碰电脑了赶快切些火题找找感觉. 拿到这道题的时候发现简单的斜率优化推一推可以秒掉平方做法,然后一条链也可以做. 然后呢... 卧槽这个在一棵树上怎么办啊. 大力\ ...

  10. ubuntu chm文档阅读器

    一,chm阅读器名称 KchmViewer 安装方法 sudo apt-get install kchmviewer 使用 kchmviewer #非root用户可以直接使用