こんにちは、ナナです。
『関数』はプログラムにおいて「処理をまとめるための仕組み」です。
私が知っているプログラミング言語は、すべてこの『関数』の仕組みを持っています。
そのため、これからプログラミングを学ぼうとしている方は、必ずプログラミングにおける『関数』の役割を理解する必要があります。
これから先は『関数』という単位で、プログラミングを考えていくことになるのです。
本記事では次の疑問点を解消する内容となっています。
では、関数の使い方を学んでいきましょう。
プログラムにおける『関数』の役割を知ろう
『関数』というと、y=f(x)みたいなやつですよね。学生時代に学んだことがあります。プログラムと関係あるんですか?
この筋肉も興味津々ですよ!
『関数』というと数学で登場したものを思い浮かべる人も多いでしょう。プログラムにおける『関数』は、数学的な関数と似ている部分もあるし、違う部分もあります。
でも、プログラムにおける『関数』は便利な道具なんですよ。
プログラムにおける『関数』とは、いくつかの処理を一つにまとめたカタマリのことです。
『関数』とは処理をまとめたカタマリである
これから実際にたくさんのプログラムを作っていくと、何回も同じ処理を記述しなければならないケースが出てきます。
このようにプログラムの中で同じ処理が何度も出てくると、メンテナンスが大変になります。
なぜなら、処理A・処理Bを変更するときに、すべての同じ個所を漏れなく直さなくてはならなくなるからです。 同じ処理が10カ所ある場合、10カ所すべてを直さないといけません。
このような場面で『関数』を作ることにより、同じ処理を1つにまとめることができます。
プログラムの中で関数を作ることを「関数定義」、利用することを「関数呼び出し」といいます。
関数定義をすることで「処理A」「処理B」に変更を加えても、修正は1カ所だけで済むようになることがわかりますね。
『関数』の定義方法と呼び出し方
なるほど。『関数』を使うことでプログラムを無駄なく効率よく作ることができるってことですね。うん、うん、なるほど~。
で、Pythonにおける『関数』はどうやって作るんですか?
プログラミング言語によって関数の作り方は様々なんです。Pythonにおける関数の定義方法を教えますよ!
他の言語で『関数』を知っている人は、作り方の違いに着目するとよいです。
今後、『関数』はたくさん作ることになるので、書き方をしっかりと覚えていきましょう。
関数定義の書き方
Pythonにおける『関数定義の方法』、つまり関数の作り方を解説します。
まず、覚えていただきたい関数定義の書き方は次のものです。
関数定義の書き方
def 関数名():
関数として行う処理①
関数として行う処理②
「関数名」の部分には皆さんの好きな名前を付けることができます。通常この名前は関数としての役割を示す名前を付けてあげます。
関数として行う処理はいくつも書くことができます。
この処理部分は「if文」や「for文」などと同じように『ブロック』として書く必要があります。つまり、インデントを意識して書く必要があります。
『関数定義』の書き方は他にもあります。今の段階では一番基本となるこの形を知ってください。
別の書き方は、後ほど解説しますよ。
関数定義と関数呼び出しをプログラムしてみよう!
それでは関数の作り方を練習してみましょう。プログラムは書いて覚えていくことが基本です。
次のプログラムは簡単ではありますが、『関数定義』と『関数呼び出し』をシンプルに表したものです。
Pythonの『関数定義』と『関数呼び出し』の基本プログラム
# 関数定義
def hello():
print("こんにちは")
print("ナナです")
print("今日はいい天気だな")
# 関数呼び出し(2回呼び出す)
hello()
hello()
「hello関数」として、あいさつを行うための『関数』を定義しています。
実行した結果は、次のものです。
こんにちは
ナナです
今日はいい天気だな
こんにちは
ナナです
今日はいい天気だな
結果として、あいさつが2回表示されましたね。
このように『関数』というものに処理をまとめることで、関数を呼び出せば同じことを何回も実施することができます。
関数の呼び出し方
先ほどのプログラムをよく見てみましょう。関数定義で作成した『関数』は、次のように呼び出しています。
# 関数呼び出し
hello()
関数の呼び出し方は、次の方法で書きます。
関数の呼び出し方
関数名()
定義された関数名に()を付ける、これが関数の呼び出し方です。
関数名に()を付ける。他の多くのプログラミング言語でも、関数を呼び出す時はこの形ですね。
『関数定義』と『関数呼び出し』を書く場所で注意すること
『関数定義』と『関数呼び出し』の2つを組み合わせてプログラムを組み立てていくんですね。プログラムってパズルゲームみたいですね。
この2つはファイルの中で好きに書いていいんですよね。
実は『関数定義』と『関数呼び出し』をファイルに書く時には注意することがあります。
『関数定義』と『関数呼び出し』の順番
main.pyに対して、次のように『関数呼び出し』⇒『関数定義』の順番で書いたとしましょう。
# 関数呼び出し
hello()
# 関数定義
def hello():
print("こんにちは")
print("ナナです")
このプログラムを動かすとエラーが発生します。
File "C:/PythonProject/project1/main.py", line 2, in <module>
hello()
NameError: name 'hello' is not defined
「NameError: name ‘hello’ is not defined」とは「helloが定義されていません」というエラー内容です。
この問題は、次のように「関数定義」⇒「関数呼び出し」の順に書くと解決します。
# 関数定義
def hello():
print("こんにちは")
print("ナナです")
# 関数呼び出し
hello()
Pythonでは、次のようにファイルの先頭から順にプログラムが読み込まれます。
hello()という関数呼び出しを動かさなければならないタイミングにおいて、呼び出される先の関数は事前に読み込まれていなければならないのです。
この問題はいくつかの解決策があるのですが、まずはこの書き順において解決できる、ということを理解しましょう。
Q&A:Pythonの『関数』に関するよくある質問
『関数』に関する質問をどしどし募集中だよ!
Q:関数を定義するときの「def」って何なの?
『関数』を定義するときって最初に「def」って書きますよね。「デフ」っていったい何なんですか!気になるじゃないですかっ。
「def」はね、「define」ですよ。日本語で「定義」という意味ですね。『関数』を『定義』するから「def」と書く。そのまんまですけどね。
プログラムの世界はPythonに限らず、英単語を省略した名前が結構使われます。
「最初からdefineって書けばいいじゃないか?」と思うかもしれませんが、「全部書くのは無粋でしょ!わかるでしょ」って感じですね。
このような省略された英語が、もとは何なのかを知ることって大事です。
「def」⇒「define」⇒「定義」⇒「関数の定義」ということをイメージできることで、関数を定義するときは「def」って書かないといけなかったと思い出すことができます。
このような略語が出てきたら調べてどんな意味かを知ることですよ。
Q:『関数』を定義したら変な警告が出たんです…
『関数』を定義した次の行に赤い波線の警告表示が出るんです。何が悪いっていうんですかっ!
「PEP 8」の警告だね。「PEP 8」はPythonにおけるコーディング規約と呼ばれるものだよ。プログラムする上でのルールのことだね。
「PEP 8」とはPythonにおける標準の『コーディング規約』を定義したものです。
『コーディング規約』とはプログラムをする上で、「みんなでこのルールを守って誰が見てもわかりやすいプログラムにしようよ!」というルールを定めたものです。
今回、指摘されている警告は「expected 2 blank lines after class of function definition」であり、これは「関数定義やクラスの後には、2つの空白行が必要ですよ」と警告しています。
そのため、次のように関数定義の下に2行の空白行を入れることで警告がなくなります。
# 関数定義
def hello():
print("こんにちは")
print("ナナです")
hello() # 関数定義の後に空白2行いれる
このような『コーディング規約』は複数の人数で作るシステムにおいては、プログラム全体の統一性を持たせるために大事なものなのです。
「PEP 8」に関して詳しく知りたい方は『PEP 8 コーディング規約』を見るとよいでしょう。
Pythonという言語に限らずですが、企業などにおいては独自のコーディング規約を定義し「みんなこのルールに従ってプログラムしましょう!」としてたりしますよ。
課題:『関数』の書き方と呼び出し方が学べたかを確認しよう
もしも、プログラムが上手く動かなくて困ったときは、答えを見るのではなく「デバッガ」の使い方を学びましょう。
この記事を見ると問題の解決技術が身に付きます。困ったときのオススメ記事です!
課題1:『関数定義』と『関数呼び出し』を自分で書いてみよう
課題内容
- 関数「my_name」を定義し、print命令で「苗字」と「名前」を改行して表示せよ
- my_name関数を呼び出し、結果を画面に表示せよ
出力期待結果
モノづくり
ナナ
基本的な『関数定義』と『関数呼び出し』の書き方を身に付けましょう。
def my_name():
print("モノづくり")
print("ナナ")
my_name()
まずは、簡単でも関数を書いて覚えていきましょう。『関数定義』と『関数呼び出し』の書く順番にも気をつけてください。
課題2:2つ以上の『関数定義』をしてみよう
課題内容
- 関数「print_even」を定義し、print命令で「偶数です」と表示せよ
- 関数「print_odd」を定義し、print命令で「奇数です」と表示せよ
- number変数を定義し、任意の数値で初期化せよ
- number変数が『偶数』か『奇数』かを判別し、偶数のときは「print_even」、奇数のときは「print_odd」を呼び出せ
出力期待結果
number を「8」で初期化したとき
偶数です
number を「5」で初期化したとき
奇数です
関数はいくつでも定義することができます。
「if文」や「for文」などの制御命令と組み合わせて、様々な関数を呼び変えるのはプログラムの中でよく出てくるパターンです。
# print_even関数の定義
def print_even():
print("偶数です")
# print_odd関数の定義
def print_odd():
print("奇数です")
# number変数の定義
number = 8
# 偶数・奇数の判定
if number % 2 == 0:
print_even()
else:
print_odd()
関数を複数定義するときも、形は一緒ですね。
C言語技術者が知るべきPython言語との違い:「関数」
すでにC言語を習得している人は、次のポイントに気を付けよう!
C言語技術者は、インデントを使って処理ブロックを定義することに慣れる必要があります。
関数定義の方法の違いは言語によっても様々なので、最初は違和感を感じるかもしれませんが、慣れるものと捉えることです。