この記事には、PR部分にUdemyのアフィリエイトリンクを含みますが、記事の内容は筆者が独自に作成したものです。記事の作成についてUdemy様から報酬等を受け取って作成したものではありません。
イントロダクション
今回は、入門書を読む際、早々に出てきて、初心者を挫折させてしまうPythonのクラス・メソッド・関数・オブジェクトなどの重要キーワードについて解説します。
前回・前々回の関数・メソッドの基礎練習コードをひと通り打ち込んでみた後、今回の記事を読むとより理解が進むと思います。
今回も、下記のコード例を実際にVscodeに打ち込んでみてください。Jupyter Notebookで簡単に実行結果を確認できるはずです。
極力わかりやすい解説を心がけますのでよろしくお願いします!
PR
クラスとは?型とは?
最初に手に取った入門書によっては、日本語的な「型」という言葉と、「クラス」という言葉がごちゃごちゃに記述されており、初心者が躓きやすいポイントになっています。
言葉の整理のためにシンプルに結論を言ってしまいましょう。
Pythonで言う「型」という言葉は、「クラス」という言葉と同じ意味であり、置き換えができます。
int(整数)型はint(整数)クラス、str(文字列)型はstr(文字列)クラス…と置き換えられます。
日本語の書籍でPythonを学ぶと、まず「型」という言葉に惑わされます。シンプルに「クラス」と読み替えましょう(逆もまた然りで、意味がとらえやすい方に読み替えましょう)。
なお、「データ型」という言葉は、どのような様式・型式でデータが記述されるか、という日本語の意味がとらえやすいため、入門書で頻繁に使われているようです。
基本的なクラスの紹介
Pythonは、さまざまな種類のデータを扱うための基本的なクラスを最初から備えています。
数値型
整数(int)、浮動小数点数(float)、複素数(complex)など、さまざまな数値型があります。これらの型は相互に変換することができます。int()関数を使うと整数型に、float()関数を使うと浮動小数点型に、complex()関数を使うと複素数型に変換できます。
#%%
X = 10 # int
Y = 20.5 # float
Z = 1+1j # complex
print(type(X))
print(type(Y))
print(type(Z))
文字列型
文字列(str)は、一連の文字を表します。文字列はシングルクォート(‘…’)またはダブルクォート(“…”)で囲みます。
#%%
S = "Hello, World!" # str
print(type(S))
ブール型
ブール(bool)型は、真(True)または偽(False)の2つの値を持つことができます。
#%%
T = True
F = False
print(type(T))
print(type(F))
上のtype()関数を用いたクラス判別だけでは、ブール型の使い方が分かりませんので補足します。Pythonの演算子には、比較の結果を出力する比較演算子(<,>,==)があります。比較演算子は、結果が真ならばTrueを、偽ならばFalseを返します。ここで返って来るTrueとFalseがブール型の値です。
#%%
print(2>1)
print(1>2)
print(2<1)
print(1<2)
print(1==2) # ==は、2つの比較対象が同一のものですか?と問いかけるものです。
シーケンス型
シーケンス型には、リスト(list)、タプル(tuple)、範囲(range)があります。これらは複数の要素を順序付けて格納するためのクラスです。
#%%
L = [1, 2, 3] # list
print(type(L))
T = (1, 2, 3) # tuple
print(type(T))
R = range(1, 10, 2) # range
print(type(R))
Pythonでは、[1,2,3]と(1,2,3)はそれぞれ異なるクラスを表します。前者はリスト(list)、後者はタプル(tuple)と呼ばれます。要素の変更が必要な場合はリストを、そうでない場合はタプルを使用します。タプルの方がリストよりもメモリ効率が良いため、要素の変更が不要な場合にはタプルを使用することが推奨されます。
リスト(list)型
リストはミュータブル(変更可能)なクラスです。[ ]を使用して定義します。リストの要素は後から追加、削除、変更することが可能です。リストの要素のカウントは、0から始まることに注意してください。
#%%
# リストの変更
L = [1, 2, 3]
L[0] = 4
print(L) # 出力:[4, 2, 3]
# リストの追加
L.append(1)
print(L)
L.insert(4,5) # 4番目の要素として5を追加
print(L)
# リストの削除 pop と remove
L.pop(0)
print(L)
L.remove(2)
print(L)
# リストの要素のカウント方法に注意
L = [1, 2, 3]
print(L[0])
print(L[1])
print(L[2])
# リストの足し算(連結)
L1 = [1,2,3]
L2 = [4,5,6]
print(L1 + L2)
print(L1) # 足し算はできるが、L1リストの中身はそのままである
# リストの全追加(拡張)
L1 = [1,2,3]
L2 = [4,5,6]
L1.extend(L2) # entendメソッドは、L1リストそのものを書き換える
print(L1)
タプル(tuple)型
タプルはイミュータブル(変更不可能)なクラスです。一度作成したタプルの要素を後から変更することはできません。タプルは( )を使用して定義します。また、要素が一つだけの場合は,を必ずつける必要があります(例:(1,))。タプルは辞書のキーとして使用できます。
#%%
T = (1, 2, 3)
print(T[0]) # 出力:1
T[0] = 4 # エラー:タプルの要素は変更できません
#%%
T = (1)
print(type(T)) # int
T = (1,)
print(type(T)) # tuple
マッピング型
マッピング型には、辞書(dict
)があります。辞書はキーと値のペアを格納します。
{ ’ 単語1 ’ : 値1 , ’ 単語2 ’ : 値2 } の様式で記述します。
# %%
my_dict = {'apple': 100, 'banana': 200, 'cherry': 300}
print(my_dict)
print(my_dict['apple']) # 一要素のみを出力
print(my_dict['apple'],my_dict['banana']) # 複数要素を出力
RESULT = 'apple' in my_dict # 辞書に登録があるかどうか確かめる
print(RESULT)
セット型
セット型は、リストと同じように複数の値をまとまった1つのデータとして扱うデータ型です。しかし、リストとは異なり、重複した値を持たず、要素の順序を保持しないという特徴があります。{ } 波括弧で囲んで作成できるほか、リストにset()関数を使用することでも作成出来ます。
#%%
S_1 = [3, 2, 1, 1, 2, 3] # リスト
S_2 = set(S_1) # set関数でリストをset型に変換
print(S_1) # 出力結果:[3, 2, 1, 1, 2, 3]
print(S_2) # 出力結果:{1, 2, 3} 重複した値がなくなり、順序も変化
print(type(S_1))
print(type(S_2))
フローズンセット(frozenset)
セットは、ミュータブル(変更が可能)ですが、イミュータブル(変更が不可能)の性質をもったセットを作成することもできます。フローズンセットと呼ばれ、frozenset()関数を用いることで作成できます。
# セットには要素を追加できる
#%%
S_1 = [3, 2, 1, 1, 2, 3] # リスト
S_2 = set(S_1) # set関数でリストをset型に変換
S_2.add(10) # add()メソッドで要素を追加
print(S_2)
# フローズンセットには要素を追加できない
#%%
S_1 = [3, 2, 1, 1, 2, 3] # リスト
S_2 = frozenset(S_1) # set関数でリストをfrozenset型に変換
S_2.add(10) # add()メソッドで要素を追加するとAttributeErrorになる
print(S_2)
関数・メソッドのイメージ
関数とメソッドの違い
関数とメソッドの違いを理解するポイントは、「関数はクラスから独立して存在しており、メソッドはクラスとセットで存在している」ということです。
メソッドは、特定の「クラス」と結びついており、使用できるクラスが決まっています。メソッドを呼び出すときに 「文字列.split()」、「書式文字列.format()」のように、「 . 」の前にクラスまたはオブジェクトが記述されるのはその現れです。
オブジェクトのイメージ
Pythonでは、「オブジェクト」という言葉がたびたび使われます。オブジェクトの直訳は「対象」・「物体」・「もの」・「こと」であり、Pythonでも、Pythonで扱うおよそすべてのデータやプログラムのことをオブジェクトと呼ぶ、と入門書では言われます。抽象的過ぎてよくわかりませんね。
結論として、オブジェクトであるか否かを判別するポイントは、プログラマーとして何らかの変更や働きかけができるデータであるか否か、です。
オブジェクトの例①ーインスタンス
一例を挙げます。クラスはオブジェクトの設計図であり、その設計図に従ってオブジェクトが作られるとよく言われます。そのようなオブジェクトのことをインスタンスと呼ぶこともあります。
この例では、私たちプログラマーは、TAPLEに対してメソッドを使ったり、関数を使ったりして内容をリスト化するなど、何らかの操作を行うことが出来ます。もちろん、整数や文字列なども同じです。
オブジェクトの例②ークラス・メソッド
また別の例を挙げます。「クラスはオブジェクトの設計図」だという言葉に対して、「クラスはオブジェクト」だと言われることもあります。それも正しいです。なぜならば、私たちはクラスに働きかけ、クラス自体を定義して、新しいクラスを作成することもできるためです。また、自分で作ったクラスの中で働くメソッドも作成することが出来ます。
したがって、クラスもメソッドもオブジェクトであるといえます。
オブジェクトの例③ー関数
関数もオブジェクトであるといわれます。関数を作る方法は、また別の記事で取り上げる予定ですが、簡単に説明すると、defというキーワードを用いることで、関数を作成することができます。したがって、関数もオブジェクトであるといえます。
オブジェクトではない例ー変数・制御構文
一方で、変数はオブジェクトではない、と言われます。変数はオブジェクトへの「参照」または「ポインタ」であり、オブジェクトへのアクセスルートに過ぎないためです。一方で、変数の値はオブジェクトです。判別ルールの例外です。
HENSU = 100
# HENSU自体はオブジェクトではなく、100というオブジェクトへのルートに過ぎない
また、「 if 」や「 else 」「 for 」、「 while 」などの制御構文も、オブジェクトではないといわれます。制御構文の内容を変更するならば、それはもはやPythonという言語ルール自体の変更だからです。判別ルールに反しません。
まとめ
お疲れ様でした!今回は抽象的な話が多く、「いったい、何を覚えれば…」という印象を持った方もいらっしゃるかもしれません。
特に覚えていただきたいポイントは、太字で記載した部分と、イメージ図の部分です。
初心者がPythonを学んでいると、「クラスってなんだったっけ?データ型って?」だとか「オブジェクトってそもそもなんだっけ?インスタンスって?」と初歩的な事項を忘れてしまうことがあります。
そんな時には、今回の記事の内容を思い出していただければ幸いです。
次回の記事はこちら
PR
コメント