この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。
前回は、組み込み関数についてご紹介しました。Pythonには便利な組み込み関数がたくさんあります。
今回は、関数の記述です。組み込み関数のような機能を、自分でプログラミングできるのです。
関数を作る
前回もお話した通りPythonで関数とは、入力値に対して何らかのまとまった処理を施し、その結果を返す機能になります。Pythonにはまとまった処理を、関数としてプログラミングする機能があるのです。
関数の記述方法は、以下になります。
def 関数名(引数1, 引数2,・・・): # 処理 return 戻り値 #戻り値がない場合は省略できる
returnの後にもプログラムを記述できますが、実行はされません。 記述した関数は、以下のように呼び出します。呼び出す関数は、それより前に記述されている必要があります。
関数名(引数1, 引数2,・・・)
以下は、value_1をvalue_2で割ったときの余りを計算する関数の例です。
def calc_remainder(value_1, value_2): return value_1 % value_2 print(calc_remainder(7, 5)) #2が返ってくる
関数に戻り値が指定されていない場合、「None」が返されます。これは前回ご紹介したprint関数の結果と同じです。
def empty_func(value_1, value_2): pass print(empty_func(2, 5)) #Noneが返ってくる
上記関数の「pass」は、何もしないコマンドです。文法的に何かを記述しなければならないが、何もしたくないときに記述します。
引数の指定方法
上の例では関数に値を渡した位置によって、受け取る値が決まります。このような引数の渡し方を「位置引数」といいます。
これに対して引数の名前を指定して、値を渡すこともできます。これを「キーワード引数」といいます。上の関数をキーワード引数を使って呼び出すと、以下のようになります。
print(calc_remainder(value_2 = 5, value_1 = 7)) #2が返ってくる
この様にキーワード引数を使うと、値を渡す順番を変えても同じ結果を得ることができます。位置引数とキーワード引数は混在できますが、最初に位置引数を指定して、その後にキーワード引数を指定なければなりません。
また、キーワード引数を使うと省略できる引数(後述するデフォルト引数値)をとばして指定した引数に値を渡すことができます。
デフォルト引数値
関数の引数指定を省略した場合、デフォルトの値を持たせるようにできます。これを「デフォルト引数値」といいます。デフォルト引数値を指定するには、以下のように記述します。
def 関数名(引数 = デフォルト値): # 処理
以下は税込み価格を返す関数の例です。tax_rateを省略すると、10%となります。
def get_total_price(price,tax_rate = 10): return int(price * (1 + tax_rate /100)) print(get_total_price(100,8)) # 108を返す print(get_total_price(100)) # 110を返す
可変長位置引数
関数に任意の複数の値を渡したい場合、値のリスト、タプルなどを作成して渡せば可能になります。しかし、この方法では事前に渡したいオブジェクトを作成しなければなりません。「可変長位置引数」を使用すると、オブジェクトを作成しなくても任意の複数の値を渡せます。可変長位置引数を指定するには、以下のように記述します。
def 関数名(*引数): # 処理
引数名は任意で良いのですが、慣例的に「*args」とすることが多いです。以下はキーワード引数の例です。
def print_positional_args(*args): print(args) print_positional_args(10, 30, 20, 40) # (10, 30, 20, 40)が返ってくる
この様に、可変長位置引数で渡された値はタプルの要素として処理されます。 また、関数呼び出し時にタプルに「*」をつけて引数に指定することで、タプルを直接渡すこともできます。
t = (10, 30, 20, 40) print_positional_args(*t) # (10, 30, 20, 40)が返ってくる
可変長位置引数は、1つの関数につき1つだけになります。また、位置引数と併用できますが、配置できるのは可変長位置引数の前だけです。可変長位置引数の後はキーワード引数による指定になります。
print関数の見直し
これを踏まえて前回触れたprint関数について、見直してみましょう。
print(*objects, sep=' ', end='\n')
可変長引数で複数の出力要素を指定して、そのあとはキーワード引数でデフォルト引数値を指定している、というわけです。
次回も関数の記述
いかがでしょうか。関数を記述する際の引数指定方法には、色々あることが分かりました。次回も引き続き関数の記述について学んでいこうと思います。お楽しみに!!