【python】判断空值
字符串
module_list=None
module_list=None print('module_list:%s'%module_list) print('module_list.isnull:%s'%pd.isnull(module_list)) print('pd.isna():%s'%pd.isna(module_list)) print('module_list is None:%s'%(module_list is None)) print('not module_list:%s'%(not module_list)) print('not module_list is None:%s'%(not module_list is None)) print('not (module_list is None):%s'%(not (module_list is None)))
小心有坑:
x = 1 print('not x:%s'%(not x)) x = [1] print('not x:%s'%(not x)) x = 0 print('not x:%s'%(not x)) x = [0] print('not x:%s'%(not x))
因为在python中 None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()都相当于False,即:
not None == not False == not '' == not 0 == not [] == not {} == not ()
if x is not None是最好的写法,清晰,不会出现错误,以后坚持使用这种写法。
使用if not x这种写法的前提是:必须清楚x等于None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()时对你的判断没有影响才行。
def _get_judge(x): if x is not None: print(x) else: print('x is None') print('-'*20) x=None _get_judge(x) x=[] _get_judge(x) x=[None] _get_judge(x) x=0 _get_judge(x) x=np.nan _get_judge(x)
判断tuple、list、dict是否为空
tuple_test = () print(bool(tuple_test)) tuple_test = [] print(bool(tuple_test)) tuple_test = {} print(bool(tuple_test))
if not xxx:
在使用列表的时候,如果你想区分x==[]和x==None两种情况的话, 此时if not x:将会出现问题:
x=[] y=None print('not x:%s'%(not x)) print('not y:%s'%(not y)) print(' ') print('x is None:%s'%(x is None)) print('y is None:%s'%(y is None))
module_list=[]
if len(mylist): # Do something with my list else: # The list is empty
由于一个空 list 本身等同于 False,所以可以直接:
if mylist: # Do something with my list else: # The list is empty
module_list=''
module_list='' print('module_list:%s'%module_list) print('module_list.isnull:%s'%pd.isnull(module_list)) print('len(module_list):%s'%len(module_list))
module_list=np.nan
module_list=np.nan print('module_list:%s'%module_list) print('module_list.isnull:%s'%pd.isnull(module_list)) print('math.isnan(module_list):%s'%math.isnan(module_list)) print('pd.isna():%s'%pd.isna(module_list))
>>> np.nan nan >>> type(np.nan)'float'>
nan的类型是float,当对nan进行强制类型转换时,转换为整数型时会报错
>>> int(np.nan) Traceback (most recent call last): File "", line 1, in ValueError: cannot convert float NaN to integer >>> long(np.nan) Traceback (most recent call last): File " ", line 1, in ValueError: cannot convert float NaN to integer >>> int('nan') Traceback (most recent call last): File " ", line 1, in ValueError: invalid literal for int() with base 10: 'nan'
如果是报上面的错前两个错,则是因为被转型的已经是一个float的nan(np.nan),如果是报第三个错,则被转换的是字符串'nan'
而将nan或'nan'从字符串到float转换时,都不会出现错误。这也是有时候会隐藏的错误,因为numpy的ndarray是支持复合类型的(如object),如果是一个非法字符被先后转换为float,string,则会表现出是一个string,如果进行强转,则报第三个错。而且此时不能用x!=x判断。
现在python的大部分普通运算中已经不会出现nan,但是在numpy包中,从list转换nparray时,如果遇到类型不匹配,或其他问题导致转换失败时,仍然会以nan填充,而不是报错。
表格
module_list=pd.DataFrame(index=[0])
module_list=pd.DataFrame(index=[0]) print(module_list) print('module_list.empty:%s'%module_list.empty) print('len(module_list):{}'.format(len(module_list)))
module_list=pd.DataFrame()
module_list=pd.DataFrame() print(module_list) print('module_list.empty:%s'%module_list.empty) print('len(module_list):{}'.format(len(module_list)))