Pythonで自作の関数を定義する方法について解説します。関数を使いこなせば行数の多いコードも短く見やすくまとめることができるようになります。
目次
Pythonには組み込み関数と標準ライブラリのモジュールに便利な関数がたくさん用意されていますが、コードが長くなってくると複数の処理をオリジナルの関数としてひとまとめにしたい場合があります。
プログラムの中で同じような処理を何度も使用する場合は関数にまとめることができないか検討してみましょう。
関数を定義
関数を作成するにはdef文を使って次のように記述します。
def 関数名(): 処理
関数名のあとには必ず()とコロンを付け、次の行をインデントして処理を書き込みます。処理は何行でも書き込むことができます。
関数名を付ける際は次のようなルールがあります。
- 1文字目…アルファベットorアンダーバー
- 2文字目以降…アルファベットorアンダーバーor数字
また、慣習として関数名の先頭に大文字は使いません。関数名は動詞から始めるとどんな処理をする関数なのかわかりやすくなります。
では実際に関数定義の例を見ていきましょう。
次のコードはRPGの勇者の攻撃時に表示されるメッセージです。
ad = 100 # 勇者の攻撃力 skill = 2 # スキルの倍率 damage = ad * skill # 与ダメージを算出 print("勇者は" + str(damage) + "のダメージを与えた")
勇者の与ダメージを計算する処理と、メッセージを表示する処理は使いまわせそうですね。
この部分を関数に置き換えてみましょう。次のように記述します。
ad = 100 # 勇者の攻撃力 skill = 2 # スキルの倍率 def attack(): # attack関数を定義 damage = ad * skill # 与ダメージを算出 print("勇者は" + str(damage) + "のダメージを与えた") attack() # attack関数を実行
与ダメージを計算する処理とメッセージを表示する処理をattack関数という1つの名前で管理することができるようになりました。
実際にコードを実行してみましょう。
勇者は200のダメージを与えた
変数として定義されている勇者の攻撃力とスキルの倍率を元に与ダメージが計算され、それを利用したメッセージが表示されました。
処理を関数にまとめたことで今後この処理を行いたい場合はattack関数を実行するだけでよくなります。
また、処理を書き換えたい場合もattack関数の中身を書き換えるだけで済みます。実際に与ダメージの計算式を変更してみましょう。
ad = 100 skill = 2 def attack(): damage = ad * skill * 2 # ここを書き換えるだけ print("勇者は" + str(damage) + "のダメージを与えた") attack() # attack関数を実行
与ダメージを ad * skill から ad * skill * 2 に書き換えた例です。
定義の部分を書き換えるだけで、attack関数を実行する部分のコードは書き換える必要はありません。
実行結果は次のようになります。
勇者は400のダメージを与えた
これだけだと処理が短いのでありがたみが薄いかもしれませんが、使いまわす処理が長く複雑になってくると処理を関数にまとめているかどうかで手間が大きく変わってきます。
引数と戻り値を追加
関数を定義する際に引数を追加することもできます。
引数のある関数を定義したり呼び出したりする場合は次のように記述します。
def 関数名(第一引数, 第二引数) # 引数のある関数を定義 処理 関数名(第一引数, 第二引数) # 引数を指定して関数を呼び出し
関数呼び出しに引数が指定されていると、その値が関数定義の引数に渡されます。
先ほどのコードを例にしてみましょう。
def attack(ad, skill): # attack関数を引数を追加して定義 damage = ad * skill # 与ダメージを算出 print("勇者は" + str(damage) + "のダメージを与えた") attack(100, 2) # attack関数を引数を指定して実行
このコードではまずattack関数が定義され、その後attack関数を呼び出す際に第一引数に100、第二引数に2という値が指定されています。
この値が関数定義の第一引数、第二引数にそれぞれ渡され、attack関数の中でこの渡された値(引数)を使って処理が行われます。
実行結果は次のようになります。
勇者は200のダメージを与えた
先ほどまでは勇者の攻撃力とスキルの倍率をあらかじめ変数として定義していましたが、この書き方なら関数を呼び出す際に値を与えることができます。
関数を呼び出した後その処理結果を使ってさらに別の処理をしたい場合にはreturn文を使います。
では例として、attack関数をmsg変数で呼び出し、その処理結果を戻り値として呼び出し元であるmsg変数に返してみましょう。
def attack(ad, skill): damage = ad * skill return "勇者は" + str(damage) + "のダメージを与えた" # 戻り値を返す msg = attack(100, 2) + " …とでも思ったのか" # attack関数の処理結果に文字列を連結 print(msg)
このコードではmsg変数の中でattack関数を呼び出し、引数として100と2という値をattack関数に渡しています。
attack関数は受け取った引数を使って処理を行い、その結果である「勇者は~のダメージを与えた」という文字列の値を、呼び出し元であるmsg変数に返しています。
msg変数は返された値に文字列を連結して格納、最後にprint関数でmsg変数の中身を表示しています。
関数は一度定義してしまえばそのファイルの中で何度でも呼び出すことができます。
例として先ほどのコードに関数呼び出しをもう1行追加してみましょう。
def attack(ad, skill): damage = ad * skill return "勇者は" + str(damage) + "のダメージを与えた" msg1 = attack(100, 2) + " …とでも思ったのか" print(msg1) msg2 = attack(500, 3) + " …ような気がした" print(msg2)
実行結果は次のようになります。
勇者は200のダメージを与えた …とでも思ったのか 勇者は1500のダメージを与えた …ような気がした
それにしても随分と頼りない勇者になってしまいましたw