Pythonロゴともろみ先輩

この記事は以下の記事の続きになります。

これからpythonを始めるという方は以前の記事から読んでもらうと良いかと思います。

今回は少し複雑なコードを書くときに必ず使う「関数」を実装してみましょう。

それでは本題です。

プログラミングにおける「関数」とは?

プログラミングにおける関数は数学における関数と意味が若干異なります。

数学においては移り先が$\mathbb{R}$若しくは$\mathbb{C}$であるような写像のことを言うことが多いです。

一方でプログラミングにおける関数は数学の言葉で言うと関数ではなく写像に近い概念です。

返すものは何でも良いし,何個でも構いません。

以下では関数というとプログラミングにおける関数のことを指すことにします。

関数には”引数”と”戻り値”(返り値とも言います)と呼ばれるものがあります。

これは関数を,引数に何か操作をする”箱”のようなものだと思うと以下のようなイメージです。

つまり”引数”は関数に入れるもの,”戻り値”はその結果出てきたもののことを指しています。

例えばゲームセンターの両替機を関数と思うと,引数は1,000円札で戻り値は100円玉×10枚です,

どうでしょう,イメージは掴めたでしょうか?

早速関数を書いてみよう!

では関数が何か分かったところで早速書いてみましょう!まだなんとなくしか分からないという人も実際にプログラムを見てみたら(書いてみたら)感覚がつかめるかもしれません。

例として前回記事で扱った「自分が100円持っていて対象の物を買えるかどうかの判定を行う判定器」を関数にしてみましょう。

def judgement(price):
    if price <= 100:
        # 条件を満たせばこちらを実行
        return 1
    else:
        # 条件を満たさなければこちらを実行
        return 0

このプログラムでは購入可能な場合は1を,そうでない場合は0を返すようにしています。
では中身の解説です。

まず関数に必要なものは大きく4つあって,関数名,関数の内容,引数,戻り値です。
この4つを意識して書くと以下のようになります。

def 関数名(引数):
    関数の内容
    return 戻り値

ちなみにpythonの場合関数の終わりはインデントで判断されるので気をつけてください。

では次に先程作った関数を使ってみます。プログラムファイルに書く場合は関数の下に書きます。

# 関数
def judgement(price):
    if price <= 100:
        # 条件を満たせばこちらを実行
        return 1
    else:
        # 条件を満たさなければこちらを実行
        return 0
# メイン
apple = 98
result = judgement(apple)
if result==1:
    print("You can buy it.")
else:
    print("You can't buy it !")

このプログラムではresultに関数の戻り値を代入して,それが1かどうかで条件分岐して買えるかどうかを出力するようにしています。

ただこのプログラムはもう少し短くできます。ポイントは

“引数”や”戻り値”は無くても良い

ということです。上で引数や戻り値は何でも良いと言いましたが何もなくても構いません。

では次に戻り値なしで関数内で同じように買えるかどうかを文で出力するようにしましょう。

def judgement(price):
    if price <= 100:
        # 条件を満たせばこちらを実行
        print("You can buy it.")
    else:
        # 条件を満たさなければこちらを実行
        print("You can't buy it !")

これでより短いプログラムになりました。より短いコードにすることは計算量を減らせることや,場合によっては可読性が向上するという点で重要です。

慣れてきたらより短く簡潔にコードを書くことを意識しましょう。

関数の中で関数を呼び出そう!

実は関数の中で関数を使うこともできます。

先程のプログラムを少しだけ変更して,引数(税抜き価格)に対して10%の消費税を加味した判定をするプログラムにしてみましょう。

# 消費税込み価格を返す関数
def tax_included(price):
    return price * 1.1

# 買えるかどうか判定する関数
def judgement(price):
    price_tax = tax_included(price)
    if price_tax <= 100:
        # 条件を満たせばこちらを実行
        print("You can buy it.")
    else:
        # 条件を満たさなければこちらを実行
        print("You can't buy it !")

# 関数の呼び出し
apple = 98
judgement(apple)

この例ではjudgementという関数の中でtax_includedという名前の関数を呼び出しています。

では最後に関数の中で自分自身を呼び出す”再帰呼び出し“というものを簡単に紹介します。

関数の中で関数を呼び出せるわけですから当然自分自身も関数であるので呼び出せるのです。これによって効率よく書ける場合もありますので覚えておきましょう。

例として階乗を計算できる関数を書いてみます。

# 階乗を計算する関数(再帰呼び出し)
def factorial(n):
    if n==1:
        return 1
    else:
        return n * factorial(n-1)

# 関数の呼び出し
print(factorial(5))

出力が120になっていれば成功です。

再帰呼び出しは具体的な動作を考えるのが少し複雑になりがちです。

考える場合のコツは地道に呼び出しを辿っていくことだと思います。

上の場合だとまずn=5のときはelseに入って戻り値は5 * factorial(4)になります。更にfactorial(4)の戻り値は4 * factorial(3)となりますね。

整理するとここまでで戻り値は5 * 4 * factorial(3)となります。この調子で計算していくと結果が確かに階乗になっていることがわかります。

短く書けて便利ですね!

まとめ

今回は関数のことを簡単に説明しました。

関数が作れるようになったら書けるプログラムの幅が一気に広がると思います。

是非皆さん少しずつ慣れていきましょう。

それでは皆さん良いプログラミングライフを〜