图片来自网络 在Python中我们经常会遇到一些判断某一个数据结构是否为空的时候,一般人可能会这么写:
if a is not None:
<statements>
else:
<statements>
仔细分析,如果a是list对象,如下面的例子所示:
上述这种判断不能满足我们的要求 当a真的是空时,程序并没有按照我们的要求输出“空”(else中的语句没有执行)。因此,我们可以判断空列表和None是两个不同的对象,在程序中我们经常会遇到判断数值是否为0、列表是否为空、字符串是否为空字符串等等这样一些操作,小菜刚刚入门Python的时候肯定也会犯跟上面一样的错误。今天,我们详细分析一下,看看到底应该如何写这样的判断语句?我们知道Python中的空数据结构(不晓得这么讲正确不正确,但是大概意思大家了解就行)有以下几种(常用的,可能不是很全):
常量None布尔值中的常量False任何形式的数值类型零(0、0L、0.0、0j等)空的序列('', (), [])空的字典({})当用户定义的类中定义了__nonzero__()方法和__len__()方法,并且该方法返回整数0或者布尔值False时我们平时使用时,习惯于将下面的这些类型等同于None进行使用,其实这些对象都是不同的,常量None的数据类型是NoneType,而下面的这些空数值对象都不同于None对象的,判断对象为空时不可以相互混淆使用。我们看下面的例子。
None与任何非None对象比较结果 那么问题来了,对于上面的判断比较,我们应该使用哪一种比较方法才能达到我们的需求呢?我们知道Python是一种很灵活的编程语言,对于判断列表、字符串、整形数据是否为空值([]、""、0)直接这样使用即可:
if a:
print('非空')
else:
print('空')
这样判断的话,更加Pythonic,而且也没有那么多繁杂的代码,又能达到我们想要的效果,岂不是很好?我们看下结果
正确的判断方法 下面我们研究一个更复杂的方法,用户自定义类中的空值返回。我们知道,Python提供了一系列的“魔法方法”,比如:__str__()、__len__()、__nonzero__()……诸如此类方法,这些方法既可以继承基类的方法,也可以由用户自定义,提供了一些更加灵活类扩展。
__nonzero__():该方法用于对对象进行空值测试,返回0、1或者True、False。如果一个类没有定义该方法,Python将获取__len__()方法调用的结果来进行空值判断。__len__()返回值为0则表示为空。如果一个类中既没有定义__nonzero__()方法也没有定义__len__()方法,该实例用if判断的结果都为True。我们看下自定义类的输出结果。
自定义类的空值判断结果 当然,自定义类我们遇到的情况较少,但是对于Python内建数据结构(整形、列表、元组、字符串、字典、set等)进行空值判断时,强烈建议直接使用if a ……这样的形式,省去了不必要的麻烦,而且更加pythonic哦!欢迎留言讨论。
转载请注明出处(百家号:Python高手养成)