Python関数の書き方の基本

 前回の記事ではファイルのimport方法について学びました。この記事ではPythonで関数を定義する方法について学びます。プログラムの機能を関数に持たせることで、より可読性の高いプログラムを書くことが可能です。

この記事を読むことであなたは
・関数を定義する方法
・デフォルト引数
について理解することができます。

関数とは / 関数の書き方の基本

 関数とは引数を渡し、何かしらのプログラムを実行し、値を返す仕組みのことです(*値を返さない関数もありますが)。これだけだと分かりにくいので、実際のプログラムを見てみましょう。

def calc_square(x):
    squared_value = x ** 2
    return squared_value

 関数の中身はとても簡単で、引数xを受け取ってxの値を2乗し、値を返すというものです。順に解説を行います。

 まず、1行目のcalc_squareですが、これが関数名です。プログラムの中の動きがわかるように書きましょう。ここでは2乗値を計算するので、calc_squareとしています。( )カッコの中に、引数を渡します。

 2行目でxの2乗値を計算し、これをsquared_valueに渡しています。復習になりますが、変数名のつけ方としては、変数が何を表しているかを書くようにします。

最後に3行目でreturn squared_valueで戻値を返しています。ここでは戻り値として数値を戻していますが、数値や文字列、リストなど基本的になんでも返すことができます。また、関数の戻り値を返すことは必須ではなくreturnは省略可能です。

とても短い関数ですが、これが最も基本的な関数の書き方です。

関数の使い方

 関数が定義されていれば、関数名を呼ぶことでプログラムの中で使うことができます。次のプログラムを見てください。

x_list = [1, 2, 3, 4]
for x_val in x_list:
    x_squared = calc_square(x_val)
    print(x_squared)

 このプログラムの中では、x_listに入った数値をforで取り出し、この値に対して先ほど定義した関数calc_squareで2乗値を計算しています。そして、その値をprintで出力しています。実行結果は次の通りです。

実行結果

1
4
9
16

デフォルト引数

 関数に渡す引数にデフォルト値を設定することもできます。次のプログラムでは、最初に宣言したcalc_squareにデフォルト引数Noneを設定しています。

def calc_square(x=None):
    if x is not None:
        squared_value = x ** 2
        print("xの2乗値:", squared_value)
        return squared_value
    else:
        print("数値を渡してください")

calc_square(2.0)
calc_square()

 Noneとは“何もない”を意味する変数です。そののちに、関数呼び出し時に引数を渡す場合と、何も引数を渡さない場合の2種類を実行しています。後者の何も引数を渡さずに使うと、デフォルト値であるNoneが渡されて、if文を判定したときにx is not Noneが真にならず、elseが実行されます。このプログラムの実行結果は次の通りです。

実行結果

xの2乗値: 4.0
数値を渡してください

関数で可読性の高いプログラムを書く

 関数はプログラムの機能を纏める役割がありますので、関数を使いこなすことで、プログラムの可読性が上がります。ここでは例として、重力の影響を受けながら、空気の流れによって運動する粒子の疑似プログラムを例に説明します。次のプログラムを見てください。

time_steps = 10000
dt = 0.001 # 1ms
time_data_output = 100

#
# 粒子の座標と速度を初期化する 
#
x, y, z = init_particle_position()
vx, vy, vz = init_particle_velocity()

for t in range(time_steps):
    # 粒子に働く力を評価する ここでは抗力と重力を考慮
    fx, fy, fz = eval_force(ux, uy, uz, g_const)
    # 現在の座標と速度をアップデートする
    x, y, z = update_position(x, y, z, vx, vy, vz, dt)
    vx, vy, vz = update_velocity(m, vx, vy, vz, fx, fy, fz)
    #
    # 計算結果を出力する
    #
    if t % time_data_output == 0:
        print_log(x, y, z, vx, vy, vz)

 疑似プログラムですので、動きません。また詳しい解説も行いませんが、プログラムを上から順に読んでいけば、大体なにをやっているのかつかめるのではないでしょうか?(これが重要です。)

つまり、関数を使って、機能ごとにプログラムを纏め、その機能を表す関数名を使っているから文章を読むようにプログラムを読むことが可能なわけです。ぜひ、関数の使い方をマスターしましょう。

まとめ

 この記事ではPythonにおける関数の書き方の基本について学びました。if文、for文、関数が揃うととほとんどのプログラムはこの組み合わせであることに気が付くはずです。以下に、今回学んだ内容を纏めます。

# 関数の定義の仕方 デフォルト引数の与え方
def calc_square(x=1.0):
    squared_value = x ** 2
    return squared_value

# 関数の使い方
calc_square(2.0)

Tips: 無名関数 lambda

 関数を定義する場合はdefを使って定義していましたが、簡単な関数であればlambdaという無名関数で定義することもあります。次のプログラムを見てください。

f = lambda x : x ** 2

print(f(2.0))

 1行目でlambda(無名関数)を定義しています。lambdaと書いて、引数xを渡し、:コロンの右側に関数の動きを書きます。このlambdaはこの記事の最初に取り扱ったcalc_squareと同じ2乗値を計算する関数です。違いはというと、関数名が定義されてないことです。このため、無名関数と呼ばれるわけですね。使い方は、普通の関数と同じです。関数を定義した後に引数を渡せばよいわけです。このプログラムの実行結果は次の通りです。

実行結果

4.0

 lambdaは単独で使われることもありますが、pandasなどのライブラリと組み合わせて使われることが多いです。頭の片隅に覚えておいてください。

The following two tabs change content below.
メーカーR&D職 研究開発業務にPythonを使用。 Udemy講師およびKindleで電子書籍を出版。 Udemyでは受講生 約15,000名 Pythonの適用範囲: データ分析、画像処理、統計解析、並列計算、流体解析、深層学習

ABOUT US

メーカーR&D職 研究開発業務にPythonを使用。 Udemy講師およびKindleで電子書籍を出版。 Udemyでは受講生 約15,000名 Pythonの適用範囲: データ分析、画像処理、統計解析、並列計算、流体解析、深層学習