Whyから始めるプログラミング基礎
line通知機能に関するnoteにおいて、関数とはなんぞやという質問があったので補足します。
関数の使い方はググればたくさん出てきますので、ここでは関数を使うことで何が嬉しいのか?というメリットに着目して解説します。
このnoteを見れば関数を上手に使うことができるようになり、プログラミングスキルが上達するはずです。
まずは挨拶を表示するだけのプログラムを書きます。
print("おはよう")
これを関数化すると下のようになります。関数はdef 関数名(仮引数) とすることで定義可能です。利用する際は関数名(実引数)というように使います。
#関数定義
def greet(message): #greetは関数名、messageは仮引数
print(message)
#関数を利用
greet("おはよう") #おはようは実引数
関数化とは処理をまとめて、好きな名前をつけるということです。ここでは挨拶という意味を持つ"greet"を関数名としてつけましたが、この関数名は何でもかまいません。
つまり下のように書くこともできます。上のプログラムと、下のプログラムは全く同じ処理を行なっています。
#関数名は何でもよい
def aisatsu(message): #greetをaisatsuに変更
print(message)
aisatsu("おはよう")
ここに書いてあるmessageは、仮引数といって、関数の中で値を使い回すための変数です。
関数定義では、どのような値も取りうる変数を仮に置いておいて(だから仮引数!)、具体的な値は関数利用時に与えます。仮引数も使いやすい自分の好みの名前をつけれます。
def aisatsu(kotoba): #仮引数も何でもよい
print(kotoba)
aisatsu("おはよう") #具体的な値は関数利用時に決める
ここまでのコードは見た目は違えど、全て同じ処理をしています。
このように関数定義をすることで、挨拶を朝昼晩3回おこないたいと思ったときも簡単に記述することができます。
def aisatsu(kotoba): #関数定義しておくと。。。
print(kotoba)
aisatsu("おはよう")
aisatsu("こんにちは")
aisatsu("こんばんは") #具体的な値を変えて使い回せる!
しかしこのようなプログラムだと、あまり関数のメリットは感じません。上記の処理は下のように書いてもいいからです。
print("おはよう")
print("こんちには")
print("こんばんは")
むしろ関数定義をするほうが記述量が増えており、デメリットさえあるような気さえしてきます。
関数定義をすると何が嬉しいのでしょうか?
それは関数を作ることで、変更に強いプログラムを書くことができるのです!
上記の挨拶を3回するプログラムにおいて、挨拶後に"今日も頑張りましょう"と追加で表示させたいと思ったとします。その場合、関数定義なしだと以下のようにかけます。
print("おはよう"+"今日も頑張りましょう")
print("こんちには"+"今日も頑張りましょう")
print("こんばんは"+"今日も頑張りましょう")
それぞれのprint文の中に"今日も頑張りましょう"という文字を記述しなければなりません。
一方で、関数定義をしておくと、関数における特定の1行だけを変更するだけでOKです。
def aisatsu(kotoba+"今日も頑張りましょう"): #この1行を変えるだけでよい!
print(kotoba)
aisatsu("おはよう") #=>おはよう今日も頑張りましょうと表示される
aisatsu("こんにちは") #=>こんにちは今日も頑張りましょうと表示される
aisatsu("こんばんは") #=>こんばんは今日も頑張りましょうと表示される
ここでは3回挨拶するだけでしたので、関数を定義せずとも、さほど苦労しませんでしたが、仮に100回挨拶をするプログラムを作成する場合を想像してみてください。コピペといっても100回も行えば疲れますし、何よりミスをしてしまいそうです。
ちなみに、このようにコードを重複させないことは、Don't repeat yourself (DRY)の原則といって、プログラミングする上での原則として知られています。原則というと堅苦しいですが、コツのようなものと思っていただいて結構です。
関数定義をしておくことで、変更に強いプログラムを書くことができ、保守や拡張が簡単になるメリットを理解していただけたでしょうか?
参考になれば幸いです。