1. 程式人生 > 程式設計 >Python 實現使用空值進行賦值 None

Python 實現使用空值進行賦值 None

0.摘要

在Python中,尤其是陣列當中,對於一些異常值往往需要進行特殊處理。為了防止異常值與正常資料混淆,影響最終計算結果,常用的方法是將異常值置零或者置空。置零的方法較為簡單,本文主要介紹如果對python中的資料進行置空。

1.賦值為None

對於一般資料,可以直接為其賦值為None。

i = 1
i = None    # int 型資料置空
s = "string"
s = None    # 字串型資料置空
l = [1,2,3,4]
l[2] = None   # 列表中元素置空
print(i,s,l) 

Python 實現使用空值進行賦值 None

2.numpy型別

numpy 中的資料較為特殊,如果將一個int 型元素賦值為None,或者np.nan都會產生報錯:

a = np.arange(10)
a[2] = None

Python 實現使用空值進行賦值 None

a = np.arange(10)
a[2] = np.nan

Python 實現使用空值進行賦值 None

如果列印np.nan的型別,會發現np.nan是float型別的。

>>> type(np.nan)
<class 'float'>

在numpy陣列中,將int型元素賦值為float型別,是不合法的。賦值語句不會報錯,但numpy會自動將float型別轉為int型。

而列印None型別,會發現None沒有型別。

>>> type(None)
<class 'NoneType'>

賦值報錯的原因,個人認為是:numpy判斷型別不符,但也無法完成型別轉換,所以產生了報錯。

在numpy中,如果想將某一元素賦值為None或者這np.nan,可以先將陣列轉換為float型別。

a = np.arange(10,dtype=float)
a[2] = np.nan
a[3] = None
print(a)

Python 實現使用空值進行賦值 None

從最終結果上看,不論是np.nan,還是None,在numpy中都以nan的形式出現。

補充知識:Python 型別判斷 變數存在判斷 None與空字串 is和==區別 nan inf判斷

一、型別變數

type

#判斷是否為整數
type(varObj) is types.IntType 

 StringType 
 FloatType 
 DictType 
 TupleType 
 ListType 
 BooleanType

isinstance

isinstance(aaa,str)

type與isinstance區別

class A:
  pass
class B(A):
  pass
isinstance(A(),A)  # returns True
type(A()) == A    # returns True
isinstance(B(),A)  # returns True
type(B()) == A    # returns False

二、變數存在

異常捕獲

 try:
   print self.fileReadOpen
 except Exception:
   pass
 else:
   del self.fileReadOpen
def isset(v): 
  try : 
   type (eval(v)) 
  except : 
   return 0 
  else : 
   return 1 

isset('varname') //變數只能在try裡呼叫才會捕獲異常,所以採用字串引數。

名稱空間

'varname' in locals().keys()
'varname' in dir()

dir()不帶引數時,返回當前範圍內的變數、方法和定義的型別列表;帶引數時,返回引數的屬性、方法列表。如果引數包含方法dir(),該方法將被呼叫。如果引數不包含dir(),該方法將最大限度地收集引數資訊。

三、None與空字串

有句話說的Python中萬物皆為物件。None也是物件。這就好理解None與空字串NULL區別:

type(None)
<class 'NoneType'>

type('')
<class ''str'>

>>> None == 0     //(int)
False
>>> None == ' '   //(str)
False
>>> None == False  //(boolean)
False

四、is和==區別

is判斷的是a物件是否就是b物件,是通過id來判斷的。

==判斷的是a物件的值是否和b物件的值相等,是通過value來判斷的。

>>> d = {"a":1}
>>> dd = d.copy()
>>> d is dd
False
>>> d == dd
True

五、nan inf

記憶:對於is判斷,符合is的物件比較定義:物件is物件本身,物件不is新建物件。對於==判斷,除了nan,符合==的值比較的定義。對於nan在用==值比較時,可以認為,nan物件的值不==該nan物件的值,nan物件的值不==新建nan物件的值。

>>> inf = float("inf")
>>> ninf = float("-inf")
>>> nan = float("nan")
>>> inf is inf
True
>>> ninf is ninf
True
>>> nan is nan
True
>>> inf == inf
True
>>> ninf == ninf
True
>>> nan == nan  // nan物件時本身物件nan
False
>>> inf is float("inf")
False
>>> ninf is float("-inf")
False
>>> nan is float("nan")
False
>>> inf == float("inf")
True
>>> ninf == float("-inf")
True
>>> nan == float("nan")  //前一個nan值不等於新建物件float("nan")的值
False

判斷nan方法:

使用math模組:

>>> import math
>>> math.isinf(inf)
True
>>> math.isinf(ninf)
True
>>> math.isnan(nan)
True
>>> math.isinf(float("inf"))
True
>>> math.isinf(float("-inf"))
True
>>> math.isnan(float("nan"))
True

利用自身判斷:

>>> def isnan(num):
  return num != num
>>> isnan(float("nan"))
True

使用numpy:

>>> import numpy as np
>>> 
>>> np.isnan(np.nan)
True
>>> np.isnan(float("nan"))
True
>>> np.isnan(float("inf"))
False

以上這篇Python 實現使用空值進行賦值 None就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。