ユーザ定義関数 (def)
実施のプログラムでは一度作ったプログラムコードの一部を別のところでも使いたいということが頻繁に起きます。Pythonでは複数の命令文をまとめたものに名前をつけてユーザオリジナルの関数として定義できます。ここではユーザオリジナルの関数の定義方法について説明します。
ユーザ定義関数の定義方法
ユーザ定義関数は以下に示すようなdef構文を使うことで定義できます。
また、慣例として 関数名はすべて小文字にして複数の単語を含む場合は function_a() のように単語をアンダーバーでつなげて記載することが多いです。
def 関数名(): 処理内容 |
1 2 3 4 5 |
# def文の例 def function_a(): print('function_aの内部の命令文です') function_a() # 定義後はfunction_a()を呼び出すだけでその中身を実行できます。 |
関数の引数の記載方法
ユーザ定義関数には関数を呼び出すときに値を渡すことができます。関数に渡される値のことを引数といいます。引数の渡し方は下記のように記載します。
一般的な引数
引数の受け渡しは関数の後ろの()を使って行います。複数渡すときはカンマ(,)で区切って必要なだけ並べます。
function(x,y,z) |
1 2 3 4 5 6 7 8 |
# 一般的な関数の渡し方の例 def function_countdown(start, stop): counter = start while counter >= stop: print(counter,'',end='') counter -= 1 function_countdown(10,3) #ここで関数を呼び出しています |
出力結果:10 9 8 7 6 5 4 3
キーワード引数
次のようにすると変数の名前を指定して渡すことができます。
キーワード引数を用いると、関数を呼び出すときに引数で指定する値の意味が分かりやすくなる利点があります。また、順番を入れ替えても正しく値を渡すことができます。def構文で引数を受け取る変数名がそのままキーワードになります。
function(name1=x, name2=y) |
1 2 3 4 5 6 7 8 |
# キーワード引数 def function_countdown(start, stop) counter = start while counter >= stop: print(counter,'',end='') counter -= 1 function_countdown(stop=3,start=10) #ここでキーワードを指定して渡しています |
出力結果:10 9 8 7 6 5 4 3
デフォルト引数
関数を呼び出すときに引数を指定しなかったとしても、あらかじめ決められている値を使用するように関数側で設定できます。
※ デフォルト値を設定していても、引数を指定することで指定した引数を渡すことができます。
def 関数名(変数名=デフォルト値): 処理内容 |
1 2 3 4 5 6 7 8 |
# デフォルト引数の例 def function_countdown(start, stop=3): #stopにデフォルト値を設定しています counter = start while counter >= stop: print(counter,'',end='') counter -= 1 function_countdown(10) #デフォルト値が設定されているので第2引数が省略できます |
出力結果:10 9 8 7 6 5 4 3
可変長引数(引数をタプル型で受け取る)
print関数はいくつでも引数を受け取れます。このように受け取れる引数が固定されていない引数のことを可変長引数といいます。可変長引数を定義するには引数の変数名にアスタリスク(*)をつけます。
def 関数名(*変数名): 処理内容 |
1 2 3 4 5 6 7 8 |
# 可変長引数の例(タプル型) def function_average(*args): total = 0 for a in args: total += a print('合計 =', total / len(args)) function_average(40,66,36,50) # 4つの値を引数として渡しています |
出力結果:合計 = 48.0
可変長引数(引数を辞書で受け取る)
関数の定義で次のようにアスタリスクを2つ(**)つけると、キーワード引数を可変長引数にできます。
def 関数名(**変数名): 処理内容 |
1 2 3 4 5 6 |
# 可変長引数の例(辞書型) def function_data(**kargs): for key, value in kargs.items(): print(f'キー:{key}, 値:{value}') function_data(item='リンゴ', count=1, price=120) #キーワード引数を3つ入れています |
出力結果:
キー:item, 値:リンゴ
キー:count, 値:1
キー:price, 値:120
関数の戻り値
関数では処理に使用する値を引数として渡すことができました。それとは逆に関数で処理を行った結果を呼び出し側に戻すこともできます。関数から戻す値を”戻り値”といい関数の命令文の末尾にreturnというキーワードを記載して設定します。
戻り値が一つの場合
戻り値が一つの場合はreturnの後に続いて戻り値を記載します。
def 関数名(引数) 処理内容 return 戻り値 |
1 2 3 4 5 6 7 |
# 戻り値のある関数の例 def function_area(width,hight): S = width * hight return S S_area = function_area(10,15) #戻り値を"S_area"に代入しています print(S_area) |
出力結果:150
戻り値が複数の場合
戻り値が複数の場合はタプルを利用して複数の値を戻すことができます。
def 関数名(引数) 処理内容 return (戻り値1, 戻り値2, … ) |
1 2 3 4 5 6 7 8 |
# 戻り値が複数ある関数の例 def function_multi(length): double = length ** 2 triple = length ** 3 return (double, triple) # 2つの値を格納したタプルを戻します d,t = function_multi(5) print(d,t) |
出力結果:25 125
ユーザ定義クラス (class)
Pythonではオリジナルのクラスを定義することができます。
ここではユーザオリジナルのクラスの定義方法について説明します。
ユーザ定義クラスの定義方法
ユーザ定義クラスは以下に示すようにclass構文を使うことで定義できます。
また、慣例として クラス名は先頭の文字を大文字にして複数の単語を含む場合は MyClass のように各単語の先頭を大文字にしてつなげて記載することが多いです。
class クラス名: def __init__(self, その他の引数): # 初期化メソッド(コンストラクタ) 処理内容 def 関数名(self, その他の引数): # メソッド 処理内容 |
- 初期化メソッド
インスタンスが生成されたときに自動で呼び出される処理です。 __init__ という関数名であることが決められています。初期化メソッドはコンストラクタとも呼ばれます。
第1引数は生成されたインスタンス自身が渡されることが決まっているため、初期化メソッドに値を渡す場合には第2引数以降を使います。第1引数は慣例として self で記載されることが多いです。 - メソッド
インスタンスの持つ機能です。インスタンスのメソッドを使用するにはインスタンスを参照する変数名の後にドット(.)とメソッド名をつなげて記載します。
初期化メソッド同様に第一引数は生成されたインスタンス自身です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# classの例 class StudentCard: def __init__(self, id, name): #初期化メソッド self.id = id self.name = name def print_info(self): #メソッド print('学籍番号=', self.id) print('氏名=', self.name) a = StudentCard(1234,'山田太郎') # インスタンスを生成 b = StudentCard(1235,'山田花子') # インスタンスを生成 a.print_info() # インスタンスのメソッドを呼び出しています。 b.print_info() # インスタンスのメソッドを呼び出しています。 |
出力結果:
学籍番号= 1234
氏名= 山田太郎
学籍番号= 1235
氏名= 山田花子
クラス変数 & クラスメソッド
クラスには、インスタンスを生成しなくても使用できる変数(クラス変数) やメソッド(クラスメソッド)を定義することができます。
クラス変数はclassブロックの中に直接「変数名 = 値」と記載することで定義できます。
クラスメソッドは「@classmethod」をメソッドの前に記載することで、その下に続くメソッドをクラスメソッドとして定義することができます。クラスメソッドでは第一引数はクラスそのものが渡されます。また、変数名はclsとするのが一般的です。
class クラス名: クラス変数名 = 値 # クラス変数 @classmethod def 関数名(cls, その他の引数): # クラスメソッド 処理内容 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# クラス変数&クラスメソッドの例 class StudentCard: school_name = 'Python university' #クラス変数 def __init__(self, id, name): #初期化メソッド self.id = id self.name = name @classmethod def is_id_even(cls,id): # クラスメソッド(idが偶数かどうかを判定) if id%2 == 0: return True else: return False print( StudentCard.is_id_even(1234) ) #インスタンスを生成せずにメソッドだけ使用することができます。 |
出力結果:True
他のプログラムコードでクラスを再利用する方法
一度定義したクラスを他のプログラムコードでも再利用できます。他のプログラムコードでクラスを読み込む場合は次のようにコードの先頭にimport文を使用し,プログラムが記載されたファイル名とクラス名を指定して読み込むことができます。
※ファイル名は拡張子(.py)を除いたファイル名です。
from ファイル名 import 読み込むクラス名 |
例えば、前述した「#classの例」で定義したクラスを「student_card.py」というファイル名で保存した場合は別のプログラムコード次のように記載することで再使用することができます。
1 2 3 4 5 |
# オリジナルのクラスを他のプログラムコードで使用する例 from student_card import StudentCard # ここでクラスを読み込んでいます。 a = StudentCard(1234,'山田太郎') # 読み込んだクラスのメソッドを使用できます。 a.print_info() |
出力結果:
学籍番号= 1234
氏名= 山田太郎
※ 読み込むファイルはパスが設定済みのフォルダまたは現在の作業フォルダに保存しておく必要があります。
コメント