Python中NoneType类型的判断与None对象特性详解
本文深入解析Python中NoneType类型的判断方法,对比is None与== None的性能差异,详解None对象的特性、属性及与其他数据类型的区别,并提供三种判断变量是否为None的最佳实践。
在编写爬虫程序抓取数据时,常会遇到一个容易被忽视的问题,特此记录分享。
问题描述:
在提取信息时,若尝试判断数据类型,例如执行以下代码:
type(answers[0].find_all("table")[0].string)
运行后得到的结果为:
NoneType
由此推测,在条件过滤时可以使用is not或!=进行判断,例如尝试:
type(answers[0].find_all("table")[0].string) is '''NoneType'''
但实际运行结果为:
False
进一步使用==进行判断,结果同样为False,不禁让人疑惑:难道不能用type()来判断吗?
经查阅资料发现,NoneType类型实际上就是值为None,因此直接判断值即可,例如:
answers[0].find_all("table")[0].string is None
运行结果为:
True
至此问题得到解决,利用列表推导式可直接获取结果:
answer_table = [x.find_all("table")[0].string.strip() for x in answers if x.find_all("table")[0].string is not None]
answer_table 结果:
['水箱内部有没有通过,没有的话就是水箱堵了。', '我的小松也一样', '电控系统出现故障,电脑板传出的信号与实际动力不同,大泵与发动机动力不匹配发动机负荷重所以高温,动作慢', '换个新水箱,多页风扇', '这就是把水箱盖打开了,水流出来了,加点油门下水管就吸遍了。', '水箱堵了,拿下去专业悍水箱那输通,就ok', '如果缸垫没冲,就换水箱,我也准备换水箱。']
补充:Python对<type 'NoneType'>数据类型的处理
Python对象的概念
在Python中,万物皆对象,所有操作均针对对象展开。那么什么是对象?5是一个int对象,'oblong'是一个str对象,异常也是一个对象。从抽象角度看,人、猫、狗等也都是对象。
对于一个对象,它包含两方面的特征:
属性:用于描述其特征。
方法:表示其所具有的行为。
因此,对象=属性+方法(实际上方法也是一种属性,一种区别于数据属性的可调用属性)。
将具有相同属性和方法的对象归为一类,即Class。类好比是一张蓝图,使用一个类可以创建多个对象实例,例如人、猫、狗都属于哺乳动物类。
类是对象的抽象化,对象是类的实例化。
类不代表具体的事物,而对象表示具体的事物。
类同样具有属性和方法。
数据类型也是对象
实际上,Python在面向对象程序设计时才会有对象这一概念,而在面向过程型程序设计中,我们讨论最多的就是数据类型。
Python提供的基本数据类型主要有:布尔类型、整型、浮点型、字符串、列表、元组、集合、字典等。
数据类型也可以看做是一个“类”。
每一种数据类型都是一个对象,也具有其自己的属性和方法。
Python中的None与NULL(即空字符)的区别
None是Python的特殊类型,属于NoneType对象,它只有一个值None。
它不支持任何运算,也没有任何内建方法。
None和任何其他的数据类型比较永远返回False。
None有自己的数据类型NoneType。
你可以将None复制给任何变量,但是你不能创建其他NoneType对象。
是不同的一种数据类型:
>>>type(None)
<class 'NoneType'>
表示该值是一个空对象,空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。
>>>type('')
<class ''str'>
你可以将None赋值给任何变量,也可以将任何变量赋值给一个None值的对象。
判断的时候 均是False
>>> ff=None
>>> if ff:
print('ff is define')
执行结果:无打印!
属性不同
使用dir()函数返回参数的属性、方法列表。如果参数包含方法dir(),该方法将被调用。如果参数不包含dir(),该方法将最大限度地收集参数信息。
dir(None)
['__bool__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
dir('')
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
python 中is和= = 的区别
Python中的对象包含三要素:id、type、value,其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值。
is判断的是a对象是否就是b对象,是通过id来判断的;
==判断的是a对象的值是否和b对象的值相等,是通过value来判断的。
python中的not代表什么
在python中not是逻辑判断词,用于布尔型True和False,not True为False,not False为True。
pythond对变量是否为None的判断
python对变量是否为None的判断,有三种主要的写法:
第一种是if x is None;
第二种是 if not x:;
第三种是if not x is None(这句这样理解更清晰if not (x is None)) 。
在Python中 None, False, 空字符串”“, 0, 空列表[], 空字典{}, 空元组()都相当于False 。
<strong>not None == not False == not '' == not 0 == not [] == not {} == not ()</strong>
foo is None 和 foo == None的区别
>>> class foo(object):
def __eq__(self, other):
return True
>>> f = foo()
>>> f == None
True
>>> f is None
False
>>> list1 = [1, 2, 3]
>>> list2 = [1, 2, 3]
>>> list1==list2
True
>>> list1 is list2
False
另外:
(ob1 is ob2) 等价于 (id(ob1) == id(ob2))
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









