Tech-Joho.info

関数を作ってコードを再利用する | Python独学ならTech-Joho(12)

Python独学ならTech-Joho TOP > Python入門カリキュラム > たくさんのデータで同じ処理を繰り返す

関数とは

関数は、データを変換する道具です。 その使い方についてはこちらの記事で説明しました。 関数とメソッドを使ってみる

Pythonに限らず様々なプログラミング言語では、関数は使うだけでなく、自分でオリジナルのものを作ることができます。
今回は、この「関数を作る」方法やその目的や利点を解説します。

関数を作りたい時、作りたい時とは

自分で関数を作らなくても、プログラムを作ることはできます。
それでは、関数を作る理由とはなんなのでしょうか?
それは、同じような処理を複数の箇所でするときに、同じようなコードを何度も書くのではなく、一度書いたコードを使いまわすためです。
言い換えると、関数を作るべき時とは同じようなコードを何度も書いている時です。

熟練のプログラマーなら、3回くらい同じようなコードを書いたな、と思うと関数を作りたくなってくるはずです。同じようなコードを書くということは、繰り返し同じような処理を人間が手動でやっているということです。 しかし、繰り返し同じような処理をやるのはコンピュータの方が人間より得意です。プログラムを書く大きな理由の一つがコンピュータに同じような繰り返し処理をやらせることだといっても過言ではありません。


関数の作り方

まず、Pythonにおける関数の作り方を簡単に解説します。

関数を作ることを、関数を「定義する」と言います。一般的に、pyhtonで関数を定義するときには、下のように書きます。

>>> def 関数名(引数):
>>>        return 戻り値

より詳細を正確に知りたい方は、公式ページを確認してください。

https://docs.python.org/ja/3/tutorial/controlflow.html#defining-functions

関数定義の具体例

具体をお見せしましょう。下に書いてあるのは、文字列の最初の一文字を取り出す関数saishoを作っているところです。意味が分かりますか?

>>> def saisho(mojiretsu):
>>>        return saisho[0]

なお、saisho[0]の意味は、変数saishoの最初の1文字を取り出す処理です。pythonの番号の数え方は0で始まります。そのため、[0]で0番目、つまり最初の1文字を取り出します。ちなみに、[1]で2番目、[2]で3番目…と続きます。
文字列から一部の文字を取り出す方法については、こちらの記事もご覧ください

この関数を作った後、使ってみる例は以下のようになります。

>>> def saisho(mojiretsu):
...     return mojiretsu[0]
... 
>>> saisho("aiueo")
'a'

この例では、関数saisho を実行しています。その時、文字列”aiueo”の引数に指定しています。すると、”aiueo”の最初の1文字である1が返ってきました。
関数を使う方法については、こちらの記事をご覧ください。

関数定義の練習

名前はtwo、引数はmojiretsuで、引数mojirestuが文字列だとして、その2番目の文字を戻り値にする関数を定義してみましょう

>>> def two(mojirestu):
...     return mojiretsu[1]
... 

このようになるのが分かりますか?ヒントはpythonでは文字列の中の文字にアクセスするときの番号は0で始まるということです。

関数を作る例

関数の作り方は上で解説しましたが、関数をどのような時に作るべきか、まだはっきりとはわからないこともあると思います。
そこで、プログラムを書いていて、関数を作るべき例と、関数を作った後のビフォーアフターの例をいくつかご紹介しましょう。

文字列の最初の文字を取り出したい

手元に、近畿地方の都道府県の名前のリストがあるとします。このたくさんの文字列のそれぞれ最後の一文字を表示するpythonコードを書きたいとしましょう。表示された「県」や「府」の数を数えると、近畿地方にいくつの府県があるか分かるというわけです。

>>> namelist = ["大阪府", "京都府", "兵庫県", "奈良県", "三重県", "滋賀県", "和歌山県"]

関数を自分で作らずに書くとすると、下のような例が考えられます。

ビフォー: 同じようなコードをたくさん書く例

>>> namelist = ["大阪府", "京都府", "兵庫県", "奈良県", "三重県", "滋賀県", "和歌山県"]
>>> name = namelist[0]
>>> print(name[-1])
府
>>> name = namelist[1]
>>> print(name[-1])
府
>>> name = namelist[2]
>>> print(name[-1])
県
>>> name = namelist[3]
>>> print(name[-1])
県
>>> name = namelist[4]
>>> print(name[-1])
県
>>> name = namelist[5]
>>> print(name[-1])
県

ステップ1: リスト namelistの要素を1つ取り出す

まず、リストの要素を一つずつ取り出します。一番最初から始めるとすると、リストの変数namelistの最初の要素を取り出すのはnamelist[0]と書きます。これは”大阪府”という文字列です。


ステップ2: 文字列の最後の文字取り出す

次に、その文字列の一番最後の文字を取り出します。ここで、リストの一番後ろの要素を取得するときは、[-1]という番号を指定できました。

リストの使い方:負のインデックス

それと同じように、文字列の一番後ろの文字を取り出したいときも、文字列の変数名[-1]と書けます。

つまり、name = namelist[0]と name[-1] で、namelistの中の最初の要素”大阪府”の最後の文字”府”を取り出すことができます。上の例ではこの文字をprintで画面に表示しています。

ステップ3: リストnamelistのすべての要素について繰り返す

ステップ2とステップ3を、大阪府以外の要素についても繰り返します。

問題

この例でも、 「近畿地方の都道府県の名前のリストの要素のそれぞれ最後の一文字を表示 する」ことはできています。しかし、print(namelist[2][-1])のようなコードを6回も書いています。各行は、[]の中の数字しか違いません。


アフター: 関数を作成して同じようなことをたくさん書かない例

上のコードで、同じようなことを書いていた個所を 関数にしてまとめましょう。

>>> namelist = ["大阪府", "京都府", "兵庫県", "奈良県", "三重県", "滋賀県", "和歌山県"]
>>> def print_one(targetlist, i):
...     name = targetlist[i]
...     print(name[-1])
...
>>> print_one(namelist,0)
府
>>> print_one(namelist,1)
府
>>> print_one(namelist,2)
県
>>> print_one(namelist,3)
県
>>> print_one(namelist,4)
県
>>> print_one(namelist,5)
県

print_oneという関数を定義し、引数にはリストと、その何番目を表示するかという番号をとります。この関数にnamelistと番号を指定して6回実行しています。

print_one関数を最初に定義する箇所が増えましたが、関数を6回実行する箇所は1行に減ったので、全体としてすっきりした構造のプログラムになりました。

今回のような例なら、関数を作らなくてもあまり変わらないようにも見えるかもしれません。しかし、もし、最後の1文字を表示していたプログラムを、最初の1文字を表示するプログラムに変更したいとしたらどうでしょうか? ビフォーの例だと、[-1]と書いてある6箇所を[0]に書き換える必要があります。アフターの例だと、関数の中の1箇所だけです。このように、関数を作るとプログラムに変更を加えることが容易になる場合があります。

<< 前へ 第11回 たくさんのデータで同じ処理を繰り返す

>> 次へ 第13回