python 判断列表为空_总结Python编程中遇到的无数个“坑”(None和空对象)

267f9e2f07082838d6ac9f8363db56054d08f148.jpeg?token=97510da499414ff9fe2e2c30570df955&s=132097088B795C8E11D081D1030010B3图片来自网络

在Python中我们经常会遇到一些判断某一个数据结构是否为空的时候,一般人可能会这么写:

if a is not None:

else:

仔细分析,如果a是list对象,如下面的例子所示:

cf1b9d16fdfaaf51f4c71b2b57166beaf11f7ac1.jpeg?token=673f4358dfb199a3bd3f71e7974eed3d&s=E8F237C202F0946A5448241A020070C1上述这种判断不能满足我们的要求

当a真的是空时,程序并没有按照我们的要求输出“空”(else中的语句没有执行)。因此,我们可以判断空列表和None是两个不同的对象,在程序中我们经常会遇到判断数值是否为0、列表是否为空、字符串是否为空字符串等等这样一些操作,小菜刚刚入门Python的时候肯定也会犯跟上面一样的错误。今天,我们详细分析一下,看看到底应该如何写这样的判断语句?我们知道Python中的空数据结构(不晓得这么讲正确不正确,但是大概意思大家了解就行)有以下几种(常用的,可能不是很全):

常量None布尔值中的常量False任何形式的数值类型零(0、0L、0.0、0j等)空的序列('', (), [])空的字典({})当用户定义的类中定义了__nonzero__()方法和__len__()方法,并且该方法返回整数0或者布尔值False时我们平时使用时,习惯于将下面的这些类型等同于None进行使用,其实这些对象都是不同的,常量None的数据类型是NoneType,而下面的这些空数值对象都不同于None对象的,判断对象为空时不可以相互混淆使用。我们看下面的例子。

21a4462309f79052a4a255cfd7b128ce7acbd54d.jpeg?token=23470d83ad7005ce90b394de9691447d&s=E8F237C25AA4B76C4445940D0000A0C3None与任何非None对象比较结果

那么问题来了,对于上面的判断比较,我们应该使用哪一种比较方法才能达到我们的需求呢?我们知道Python是一种很灵活的编程语言,对于判断列表、字符串、整形数据是否为空值([]、""、0)直接这样使用即可:

if a:

print('非空')

else:

print('空')

这样判断的话,更加Pythonic,而且也没有那么多繁杂的代码,又能达到我们想要的效果,岂不是很好?我们看下结果

d0c8a786c9177f3e895e3d9fab8dc4c39e3d5686.jpeg?token=f312bb5c8f69ba7e9bf43a8acc7e973a&s=E1F237C212AC976C0EC9BD0F0000F0C3正确的判断方法

下面我们研究一个更复杂的方法,用户自定义类中的空值返回。我们知道,Python提供了一系列的“魔法方法”,比如:__str__()、__len__()、__nonzero__()……诸如此类方法,这些方法既可以继承基类的方法,也可以由用户自定义,提供了一些更加灵活类扩展。

__nonzero__():该方法用于对对象进行空值测试,返回0、1或者True、False。如果一个类没有定义该方法,Python将获取__len__()方法调用的结果来进行空值判断。__len__()返回值为0则表示为空。如果一个类中既没有定义__nonzero__()方法也没有定义__len__()方法,该实例用if判断的结果都为True。我们看下自定义类的输出结果。

7a899e510fb30f2482b6949713d72e47ad4b0339.jpeg?token=0f35e3e35b298f0a43236d117596331a&s=E1F237C25BAC85684465BC030000A0C3自定义类的空值判断结果

当然,自定义类我们遇到的情况较少,但是对于Python内建数据结构(整形、列表、元组、字符串、字典、set等)进行空值判断时,强烈建议直接使用if a ……这样的形式,省去了不必要的麻烦,而且更加pythonic哦!欢迎留言讨论。

转载请注明出处(百家号:Python高手养成)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值