自分の関数を定義する必要性
今回はpythonのdef関数に関して、解説をしていきます。
プログラミングをしていくと、何度も何度も同じ処理をするプログラムを書くことがでてくることでしょう。
何度も書いていくと、どうしてもプログラム自体が長くなってしまいますし、ちょっと変えようと思っても、何箇所も変える必要が出てきて、メンテナンス性が悪くなってしまいます。
もちろんプログラムの読みにくさにもつながり、結局全部描き直すことになるなんてこともあります。
ではそんなときどうしたらいいでしょうか?
その解決策の1つとして、自分で関数を定義するという方法があります。
それがdef文というわけです。
defとはdefinition、つまり英語の定義の頭3文字をとったものになります。
またdef文を使うことのもう1つのメリットは自分の関数ライブラリを作成できることにあります。
つまり新しいプログラムを書く時に、必要な関数を引っ張ってきて、組み合わせることで新たなプログラムを作成することも可能になります。
といいつつも、簡単なプログラムしか書かない私にとっては、活躍の場はそうなかったりするのですが、使う時にはすごく使う文なので、覚えておいた方が絶対的に良いです。
(この時はあまり使っていなかったのですが、最近はがっつり使っています)
ということで始めていきましょう。
def文の使い方
def文の書き方の基本はこんな感じです。
def 関数名(引数):
処理
ものすごく簡単なプログラムを書いてみましょう。
def test(x):
print(x)
test(2)
実行結果
2
この例では、まずdef test(x):で、testという名の関数を作りました。
そこに引数として x という変数が入っています。
処理はprint(x)なので、1行目のtest(x)のxに代入された文字列なり、数字なりが代入され、printで出力されています。
ただしdef文は読み込まれるものの、即座に処理されるわけではなく、通常の関数のように呼び出す必要があります。
そこで4行目でtest(2)として、引数に2を入れて、呼び出し、処理を開始しています。
def文の注意点
def文で書かれた処理は、その関数を呼び出す前に定義しなければいけないことです。
つまりこういう書き方ではエラーが出てしまいます。
test2(5)
def test2(x):
print(x)
実行結果
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-XX-XXXXXXXXXXXX> in <module>
----> 1 test_2(2)
2
3 def test_2(x):
4 print(x)
NameError: name 'test2' is not defined
最初の行で、test2(5)を処理しようとしていますが、test2という関数はこの時点では存在しません。
そこで「name ‘test2’ is not defined」、つまり「test2は定義されていません」とエラーが表示されました。
そのため、通常def文はプログラムの最初の方に一括で読み込みます。
個人的にはライブラリをインポートした後に記載するようにしています。
def test1(x):
print(x)
def test2(x):
print(x+1)
def test3(x):
print(x+2)
a = 1
test1(a)
test2(a)
test3(a)
実行結果
1
2
3
ちなみにそれぞれのdef文の引数ですが、同じ変数名を使っても構いません。
それぞれの中でのみ使われる「ローカル変数」として使われるためです。
複数の引数を定義
ちなみにこれまで引数は1つだけでしたが、複数の引数を定義することもできます。
その際は、def 関数名(引数1, 引数2, 引数3 …): というようにカンマで繋げます。
例えばこんな感じです。
def calc1(x, y, z):
print(x)
print(x + y)
print(x + y + z)
calc1(1, 2, 3)
実行結果
1
3
6
中で複雑な処理をすればするほど、引数は多くなる傾向にありますので、できれば引数名は複雑になる程、分かりやすい名前をつける方がオススメです。
オプション引数の基本
引数の中には、デフォルトで値を入れておいて、デフォルト値と異なる時だけ引数を入れたいなんて場合もあることでしょう。
そんなときはオプション引数を使います。
オプション引数は def 関数名(引数名 = 値)というように用います。
def test1(x=10):
print(x)
test1()
実行結果
10
この場合、testという関数に対してデフォルトでx=10が設定されています。
そのため、test()というように引数xに値を入れなくても 10 が表示されます。
もちろん引数に値を入れるとその値が引数に挿入されます。
def test1(x=10):
print(x)
test1(5)
オプション引数と必須引数
オプション引数に対して、最初に説明した値を入れなければいけない引数のことを必須引数と呼びます。
この必須引数とオプション引数は混ぜて使うこともできます。
def calc1(x, y=5):
print(x)
print(y)
print(x + y)
calc1(1)
実行結果
1
5
6
この場合、xが必須引数、yがオプション引数です。
def文を書く際、この必須引数とオプション引数を書く順番に注意する必要があります。
必ず必須引数を先に書き、オプション引数を後に書きます。
先ほどのcalc1という関数の引数をオプション引数、必須引数の順にしてみます。
def calc1(y=5, x):
print(x)
print(y)
print(x + y)
calc1(1)
実行結果
File "<ipython-input-XX-XXXXXXXXXXXX>", line 1
def calc1(y=5, x):
^
SyntaxError: non-default argument follows default argument
ちなみにこれは三つ以上の引数になった場合も同様です。
・良い例
def calc2(x, y, z=5):
print(x)
print(y)
print(z)
calc2(1, 3)
実行結果
1
3
5
・悪い例
def calc3(z=5, x, y):
print(x)
print(y)
print(z)
calc3(1, 3)
実行結果
File "<ipython-input-XX-XXXXXXXXXXXX>", line 1
def calc3(z=5, x, y):
^
SyntaxError: non-default argument follows default argument
def calc2(x, z=5, y):
print(x)
print(y)
print(z)
calc2(1, 3)
実行結果
File "<ipython-input-XX-XXXXXXXXXXXX>", line 1
def calc2(x, z=5, y):
^
SyntaxError: non-default argument follows default argument
引数の入力の仕方
これまでの例では関数を呼び出す際、引数は引数を設定した順番に入力していました。
def calc2(x, y, z=5):
print(x)
print(y)
print(z)
calc2(1, 3, 10)
実行結果
1
3
10
それ以外にも引数の名前を使って、入力することもできます。
def calc2(x, y, z=5):
print(x)
print(y)
print(z)
calc2(x=1, y=3, z=10)
実行結果
1
3
10
このように引数の名前を使って入力する場合、順番は入れ替わっても構いません。
def calc2(x, y, z=5):
print(x)
print(y)
print(z)
calc2(z=10, x=1, y=3)
実行結果
1
3
10
流石に毎回、全ての引数に対して名前を書いていくの面倒なので、個人的には必須引数は名前無しで前から順番に書いていって、オプション引数だけ名前を使って入力したりしています。
def calc3(a, b, c=2, d=4):
print(a)
print(b)
print(c)
print(d)
calc3(1, 3, c=5, d=10)
実行結果
1
3
5
10
これであればオプション引数のうち、入力しないものがあっても飛ばして次のオプション引数を入力することができます。
def calc3(a, b, c=2, d=4):
print(a)
print(b)
print(c)
print(d)
calc3(1, 3, d=10)
実行結果
1
3
2
10
ということで今回はdef文でのオプション引数、必須引数の使い方を解説しました。
最初にも言いましたが、これを覚えているとdef文が使える場面が増えるので、覚えておいて損はないと思います。
実際、私も最近覚えてここからdef文を多用するようになりました。
是非是非試してみてください。
次回は3PySciに届いたPythonの質問、グラフタイトルをCSVファイル名にする方法に関して解説をしていきます。
ということで今回はこんな感じで。
コメント