リファクタリングをPythonで実践!基本手法とコード例・注意点まで
- 1.Pythonの関数とは?
- 2.組み込み関数とは
- 3.ユーザー定義関数とは
- 4.関数の定義や読み出しの基本
- 5.関数における引数とは?
- 6.関数における戻り値とは?
- 7.関数を扱う上での注意点やよくあるミス
1.Pythonの関数とは?
関数とは特定の処理を定義し、呼び出せるようにしたものです。Python(に限らず、どんなプログラミング言語でもですが)でコードを書いていると、同じ処理があちこちに出てくることがよくあります。
そのようなときに、同じ処理を関数として定義し、任意の場所から定義した関数を呼び出すことで、同じ処理を複数回書かなくても、いつも同じ処理をさせることが可能になります。
また、Pythonに同梱されている、Pythonが提供している関数もあります。これを組み込み関数と呼びます。組み込み関数を呼ぶことで、目的の処理を実現できます。
2.組み込み関数とは
先述の通り、組み込み関数とはPythonが提供している関数のことです。代表的なものをいくつか紹介しましょう。
画面に文字を出力する「print」やファイルを開く「open」などがあります。「print」は以下のようにして使います。
print('printの使い方の例')
この文を実行すると
printの使い方の例
と画面に出力されます。printの()の中は、どんなデータ型でも大丈夫です。ただし、異なるデータ型を混在させるとエラーになるので注意してください。
print(1 + 'です')
はエラーです。
print(str(1) + 'です')
のように、1を文字列型に変換してデータ型を揃えてやります。この文での「str」も他のデータ型を文字列型に変換するという組み込み関数です。strの仲間でよく使う関数は以下です。
str:文字列型に変換
int:整数型に変換
float:少数型に変換
組み込み関数一覧
関数名 | 処理内容 |
画面に文字を出力する | |
open | ファイルを開く |
str | 文字列型に変換 |
int | 整数型に変換 |
float | 少数型に変換 |
3.ユーザー定義関数とは
ユーザー定義関数とは、自分で定義した関数のことです。
関数は定義したソースコードファイル内からであればどこからでも呼び出せます。高度なトピックになるので割愛しますが、import文を使うと、他のソースコードファイルからでも自由に呼び出せるようになります。
この、定義した関数をシステム内のどこからでも呼び出せるという機能を使って、巨大なシステムを部品化して管理します。部品化してあればあるほど保守性が向上します。
プログラミングを行う際はコピペで同じ処理をあちこちに書くことは避けましょう。なるべく関数化するようにしてください。コードに修正をかけるとき、何箇所も修正するのと、1箇所修正すれば済むのと、どちらが楽ですか?
4.関数の定義や読み出しの基本
関数の定義方法や読み出しの基本的なやり方を解説します。
①関数の定義の方法
関数は以下のように定義します。
def logging(text):
f = open('xxx.log', mode='a')
f.write(text)
f.close()
これはxxx.logというログファイルを追記形式で開き、そのログファイルの最後に引数でもらった文字列を書き込む関数です。openでファイルを開きます。「mode=’a’」が「最後に書き込むモード」という意味です。writeでテキストを書き込み、最後にcloseでファイルを閉じます。(ファイルは開いたら必ず閉じてください)
ここで記載された「text」のことを引数と呼びます。
関数を呼び出す側で何らかの値を入れて呼び出します。その値がtextという変数にコピーされ(厳密に言うと違うのですが、ここではコピーとしておきます)、関数内ではtextという変数でアクセスできるようになります。
②関数の呼び出し方
上の関数を呼び出す際には
logging('テストログ')
と書いて呼び出します。こう書くと、xxx.logの最後に「テストログ」と追加されます。
ログを取りたいところでこの関数を呼べば、どこでもログが取れます。ログファイル名を気にする必要はありません。ログを取りたいポイントがあちこちにあれば、実際にファイルを開いて書き込むより効率的です。関数はこのように定義し、呼び出して使います。
5.関数における引数とは?
先ほど「引数」について紹介しました。引数にはどのようなものがあるのでしょうか。
①位置引数
「位置引数」とは、書いた順番に値が渡される引数の与え方です。
def sample1(a, b, c):
s = a + b - c
print(s)
という関数があったとして
sample1(0, 1, 2)
と書くと、aに0、bに1、cに2がコピーされ、sは-1になります。
したがって出力は
-1
です。
②キーワード引数
キーワード引数とは、open関数で出てきたmodeのようなキーワードのことです。関数を呼び出す側で、どの引数にどの値を与えるか具体的に書いてやることです。
例えば上のsmaple1関数で
sample1(a=0, c=1, b=2)
として呼び出すと、aには0、bには2、cには1がコピーされます。書いた順番に関係なく、どの引数にコピーされるか指定できるのです。この場合、sは1になり、出力は
1
です。
③デフォルト引数
関数側で引数に値を付けておくと、その引数が省略されたとき、あらかじめ付けた値がデフォルト値としてセットされます。
def sample2(a, b, c=-1):
s = a + b - c
print(s)
という関数があったとして、
sample2(0, 1)
と書くとaに0、bに1、cには何も書かれてないのでデフォルト値の-1がセットされます。だからsは2です。出力は
2
になります。
ただしデフォルト引数には制約があります。デフォルト引数がある引数をデフォルト引数のない引数の前に書くとエラーになります。どこが省略されているのか分からなくなるのですから当たり前です。ここは注意しましょう。
④可変長引数
可変長引数を理解するためには
*args
**kwargs
というキーワードがあります。このうち、**kwargsは難しく、かつ使う機会も実際問題ないので、本記事では*argsについてのみ解説します。
*argsは、任意の数の引数を受け取る時につかいます。これを可変長引数と呼びます。*argsは関数内ではタプルになります。
def sample3(*args):
print(args)
を
sample3(1, 2, 3)
と呼び出すと出力は
(1,2,3)
となります。argsが関数内でタプルになっているのです。argsの一つ一つを取り出すには例えば
def sample4(*args):
for num in args:
print(num)
などとすればいいでしょう。argsはタプルなのでタプルに対する操作は何でも行えます。sample3もsample4も、いくつ引数を書いても呼び出せます。
sample3(1, 2)
sample4(1, 2, 3, 4, 5)
はどちらも動作します。*argsは、通常の引数の後に付けることもできます。
def sample5(a, b, *args):
for num in args:
print(a + b + num)
として
sample5(0, 1, -1, -2, -3)
とすれば出力は
0
-1
-2
です。ただし、*argsを通常の引数の前に書くことはできないので注意してください。エラーになります。
6.関数における戻り値とは?
関数は値を返すこともできます。これを戻り値と呼びます。returnで書きます。
def add(a, b):
return a + b
という関数があったとして、
c = add(1, 2)
と書けばcは3です。複数の値を返すこともできます。その場合、複数の変数で受け取ります。
def add_sub(a, b):
add = a + b
sub = a - b
return add,sub
という関数があったとして、
c,d = add_sub(1, 2)
と書けば、cは3、dは-1になります。
7.関数を扱う上での注意点やよくあるミス
関数を扱うときによくやる失敗は、関数がどのような値を受け取り、どのような処理をするのかよく調べずに使ってしまうことです。関数が絡んだ処理で想定通りの結果にならない場合、まず関数呼び出しの際の引数を精査するのがデバッグの近道です。そもそも、その関数の処理内容も分からずに関数を使ってはいけません。部品は正しく使わなければ全体が動かないのです。
この記事では簡単なサンプルばかりでしたので引数の名前も簡単にしていましたが、込み入った処理の関数を作るときは、誰もがぱっと見て分かる引数の名前にしましょう。openのmodeにしてもモードだということがぱっと見て分かります。これがmだったらなんだか分かりません。