Noneオブジェクト

Noneオブジェクト

Noneオブジェクト

 NoneNoneType クラス から生成される唯一のオブジェクトであり、値が存在しない ことを示すために用いられます。

# In[1]

# Noneのクラスを調べる
type(None)
NoneType

 たとえば、戻り値が設定されていない関数を実行してみましょう。

# In[2]

# 戻り値のない関数を定義
# pass は何もしないコード
def myfunc():
    pass

myfunc()

 画面には何も表示されませんが、このとき実際には None オブジェクトが返っています。print() を使えば None を確認できます。

# In[3]

print(myfunc())
None

 次は辞書型オブジェクトを定義してみます。

# In[4]

# 辞書を定義
mydic = {"apple":"りんご", "orange":"オレンジ", "banana":"バナナ"}

 存在しないキーで値の参照を試みると KeyError を返します。

# In[5]

# "lemon"に対応する値を参照
mydic["lemon"]
KeyError: 'lemon'

 辞書には指定した key に対応する値を返す get() メソッドが備わっています。dict.get() は存在しない key を指定すると None が返るように設計されています。

# In[6]

# "lemon"に対応する値を参照
x = mydic.get("lemon")

print(x)
None

 このようにリターンすべき適切な値がないことを示すために、エラーを送出する代わりに None オブジェクトを返すように設計されている関数やメソッドがあります。

 意図的に None を返すような関数を設計することもできます。
 たとえば、x = 0 だけで値が定義されているような特殊な関数を設計できます。

# In[7]

# x=0だけ値が定義されている関数
def func_zero(x):
    if x == 0:
        return 1
    else:
        return None

 この関数の引数に 0 を渡すと 1 が返ります:

# In[8]

print(func_zero(0))
1

 0 以外の値を入れると戻り値は None です:

# In[9]

print(func_zero(3))
None

 プログラマーは、0 以外の引数が渡されたときにエラーを返すことを望んでいるのではなく、値が存在しないことを示したいのです。このような場合に None を返すのが適切です。
 
 NumPy の配列に None を組み込むと、データ型 (dtype) は自動的に "object" となります。

# In[1]

import numpy as np

# Noneを含む配列を定義
arr = np.array([1, 2, None])

arr
array([1, 2, None], dtype=object)

 NumPy の配列はデータを整数または浮動小数点数型で扱うことを想定しているため、None と数値の演算は定義されていません。

# In[2]

# 配列の各要素に1を加える
print(arr + 1)
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

 したがって、NumPy で欠損値に None を当てることは推奨されておらず、代わりに 非数 numpy.nan を使用するのが一般的です。numpy.nan は浮動小数点数型の特殊オブジェクトとして定義されていて、数値との算術演算が定義されています。

# In[3]

# numpy.nanを含む配列を定義
arr = np.array([1, 2, np.nan])

# 配列の各要素に1を加える
print(arr + 1)
[ 2.  3. nan]