今回はPythonにおける関数の書き方、実際の使用例を解説していきます。
Pythonにおける関数の書き方に焦点を当てて、特にlambda、next、returnといったキーワードにスポットを当ててみたいと思います。
これらの概念はPythonの特徴を理解し、効果的なコードを書くためには欠かせないものです。
Pythonはそのシンプルで読みやすい構文で知られていますが、初めて触れる方にとっては関数の概念がややこしく感じられるかもしれません。
しかし一歩ずつ手を動かしながら学んでいけば、これらの概念も理解しやすくなります。
関数の基本から少し発展的な要素までを覗いていくことで、Pythonの関数に対する理解が深まることでしょう。
Pythonにおける関数の書き方
関数は同じような処理を何回も書かなくても良いように、事前にテンプレートを作って後は使いたい時に名前だけ呼び出せれば良いようにするためにあります。
またPythonの関数はdefというキーワードを使って以下のように書きます。
def add_num(a,b):
result = a + b
return result
上記コードではadd_numという名前の関数を作成しており、内容としては2つの数字を足し算するものです。
これ自体では何も変わりません、あくまでテンプレートを用意しただけだからです。
テンプレートはdefに続けて関数の名前を書き、名前は以下のようにして使いたい時に別で呼び出すわけです。
def add_num(a,b):
result = a + b
return result
# ここを追加
print(add_num(1,2)) # 3と表示される
名前のカッコの中身は引数と呼ばれていて、returnの続きにあるのが戻り値と呼ばれます。
数学のy = 2xという式があったとしてxが引数にあたり、yが戻り値に当たると思ってもらって大丈夫です。
引数、戻り値ともに必要のない時には空欄にしておいてOKです。
また上記コードでは足し算を実行しただけですが、実行結果を変数に格納して別の処理に転用することもあります。
def add_num(a,b):
result = a + b
return result
# ここを変更
test = add_num(1,2)
print(test) # 3と表示される
引数に関してですがデフォルト引数というものがあり、以下のように書くことで「事前に決まっている引数」を設定できます。
デフォルト引数を設定しているときの実行方法ですが、記載した引数はそのまま渡されます。
一方でデフォルト引数のある関数では対象の引数を実行時に書かなくてもエラーにならず、その際にはデフォルトで指定していた値が自動的に渡される仕組みです。
def textFn(a,b="bbb"):
result = b
return result
print(textFn("xxx", "yyy")) # yyyと表示される
print(textFn("xxx")) # bbbと表示される
Pythonにおける関数の注意点
初心者によくありがちな関数の書き方、実行方法について注意事項が何点か紹介します。
まずは引数についてですが引数は空欄にできますが、設定した場合には引数の個数を合わせる必要があります。
以下は間違いの例です。
def add_num(a,b):
result = a + b
return result
print(add_num()) # 2個設定したのに空欄で実行している
print(add_num(1)) # 2個設定したのに1個で実行している
さらに必ずしもエラーになるとは限りませんが引数は書いた順番通りに実行しないと意図しない動作になることがあります。
def textFn(a,b):
result = a
return result
print(textFn("aaa","bbb")) # a="aaa", b="bbb"が代入されるので"aaa"が結果になる
print(textFn("bbb","aaa")) # a="bbb", b="aaa"が代入されるので"bbb"が結果になる
個数が合っていても順番を間違えることがありますので注意してください。
また変数に結果を代入したい時には戻り値がないと意味がありません。
以下はエラーではないですが関数の実行結果を変数に代入できていません。
def add_num(a,b):
result = a + b
test = add_num(1,2)
print(test) # returnがなかったので何も表示されない
さらに前章でデフォルト引数を紹介しましたが、第一引数にはデフォルトを設定することができません。
デフォルト引数は2番目以降の引数に対して設定してください。
def textFn(a="aaa",b):
result = a return result
print(textFn("xxx", "yyy")) # エラーになる
Pythonにおける関数のテクニック
関数は柔軟な使用に対応させることができます。
前章までに説明した基本の書き方や注意点を踏まえた上で便利な使い方を何点か紹介します。
まず引数に関して、任意の引数を設定することができます。
「実行のタイミングで必要になったり不要になったりする引数」で活用できます。
以下の例では第一引数、第二引数は必須で、第三引数が任意のものとして作っています。
def add_Num(a,b,*arg):
result = a + b
print(a, b, arg)
return result
# どちらもエラーにならない
print(add_Num(1,2))
print(add_Num(1,2,10))
引数を設定するときに先頭に「*」を書いておくと「任意の引数」という意味になります。
任意の引数については実行時に書き損していたとしてもエラーになりません。
お問い合わせフォームなど必須項目と任意項目があるのがイメージしやすいでしょう。
続いて戻り値ですが2個以上の結果を返すことができるようになっています。
以下の例のように「,」で区切ることで2個以上の戻り値を作ることができます。
つまり1個の関数で2個の結果を出すこと可能なわけです。
def textFn(a,b):
resultA = a
resultB = b
return resultA, resultB
print(textFn("aaa","bbb")) #('aaa', 'bbb')と表示される
さらに関数の中に関数を書くこともできます。
処理内容が長くなった時にわかりやすくするために、関数の中身を関数とまとめることが実務ではあります。
Pythonにおける関数はインデント(字下げ)で表現されるので関数の中に関数を書くときは、字下げに注意しましょう。
def textFn(a,b,c,d):
resultA = a
resultB = b
def addNum(x,y):
result = x + y
return result
resultC = addNum(c,d)
return resultA, resultB, resultC
print(textFn("aaa","bbb",1,2)) # ('aaa', 'bbb', 3)と表示される
Pythonにおけるジェネレータ、アノテーション、ラムダとは?
Pythonでは開発者の慣例で同じ内容でも特別な書き方をする人が一定数います。
自分は使わなくても他人のコードを読むことがあるはずなのでここで紹介する書き方は頭に入れておいてください。
まずはジェネレータというもので「yield」というキーワードを関数の中に書くことで「そこで処理を強制的にストップさせる」という意味があります。
def textFn(a,b):
resultA = a
print(resultA)
yield "stop"
resultB = b
return resultA, resultB
# 引数を受け取れているがyieldまでで止まるのでprint(resultA)までが見れる
print(next(textFn("aaa","bbb"))) #aaaと表示される
主に実行状況を細かく確認したいときやテストコードで見られる書き方です。
続いてアノテーションというもので「引数と戻り値のデータの種類を共有」することができる書き方です。
def textFn(a: str,b: str)->str:
resultA = a
resultB = b
return resultA, resultB
print(textFn("aaa","bbb"))
上記の例だと「文字列の引数を受け取って文字列の結果を返す」という意味になります。
チーム開発で他人が自分のコードを触るかもしれませんのでわかりやすく明示しておくわけです。
注意点としてはプログラムとしてデータの種類をチェックするわけではありません。
最後にラムダという短く省略して書く方法があります。
result = lambda a,b: a + b
print(result(1,3))
こちらは以下のコードと同じ意味になっています、あくまで同じ内容を1行で省略した形です。
def addNum(a,b):
result = a + b
return result