Python3超入門【第9回】「ユーザー定義関数」


はじめに

プログラミング初心者のためのPython3超入門講座の第9回目です。if文、for文、while文を学んでだいぶプログラミングの幅が広がってきたのではないでしょうか。今回は「関数」を自作する方法を詳細に解説します!

あ、ちなみに関数っていうのはExcelでよく使うsum()関数とかaverage()関数と同じ意味です。Excelに詳しい方ならエクセルでもオリジナル関数を作成できることをご存じかもしれません。Python3でも、もちろんオリジナル関数を作ることができます。

っていうか、ほとんど全てのプログラミング言語にはオリジナル関数を作成する機能がついています。

関数とは

ユーザー定義関数とは、便利な部品を作るようなものです。プログラムの中で何度も同じような処理を書くよりも関数を作成しておいて、都度、必要なときに呼び出すようにすれば、コードがシンプルになり読みやすくなります。

まずは簡単な関数を作成しながらPython3における関数の使い方に慣れていきましょう。

関数の書式

def 関数名():
        処理

書式はとっても単純ですね。実際のサンプルコードを見ながら関数に慣れていきましょう。

関数は定義しただけでは実行されません。関数を定義した上で、その関数を呼び出す必要があります。

このサンプルコードでは、print_hello()という関数名で、画面に文字を表示する処理を書いてみました。

この関数を実行している部分は、一番最後の行にあるprint_hello()です。このように関数を呼び出すことによって、関数の中身に書いた処理が実行されます。

引数(ひきすう)

引数(ひきすう)というのは関数に渡す値のことです。日本語で解説してもイメージしにくいと思うので、実際に原始的な引数を持った関数の例を見てみましょう。

double関数は与えられた引数を2倍して画面に表示する関数です。

引数を利用する場合は、関数を定義するときに関数名(引数名)とします。引数は一種の変数で、関数内で使うことができます。実際、サンプルコードでもnumberという引数を、print(number * 2)という形で利用しているのが分かりますね。

引数numberの具体的な値は関数を呼び出すときに指定します。このサンプルコードでは、double(199)とすることで、numberに199をセットしています。関数は199を2倍した値を画面に表示するので、実行結果は398になります。

さて、この例文ではあまりに簡易的すぎて関数の有用性がよく分からないと思います。もう少しだけ実用的な関数を使ったサンプルコードをご紹介します。

あ、言い忘れてましたが、引数は(,)で区切って複数渡すこともできますよ。

例:def function(a, b):

どうでしょうか。かなり不完全ですが簡単な計算機関数calc()を作ってみました。上から順番に説明しますね。

まずcalc()関数は3つの引数(インスウじゃなくてヒキスウと読みますよ!著者はずっと間違えてインスウと読んでいました、お恥ずかしい!)をとります。それぞれ順番に,num1、num2、modeです。modeだけ数値ではなく文字列をとります。

ポイント:数値だけではなく文字列も引数にできる!!!

で、あとはif-elif-else文を使って、足算、引算、掛け算、割り算の分類を行っています。

割り算だけは0で割ることはできないので、割る数(num2)が0の場合は最後のelseブロックに飛ばしてエラーにするようにしています。

具体的には、((mode==’division’) and (num2 != 0))という条件式を使って、num2がoの場合をはじいています。

とこんな感じで超簡易計算機関数をサンプルとしたわけです。

まあサンプルコード自体は、機能の貧弱さもさることながら、穴だらけで実戦には向きませんが、教育用のコードとしては、効果がでやすいように工夫したつもりです。

ちなみに機能以外で、どんなところがダメかというと、例えば、calc(‘a’, ‘b’, ‘division’)と指定すると文法エラーになってしまいます。

本当は、num1とnum2が数値かどうかも判定して、数値じゃなければエラーメッセージを表示したりしないといけないのですが、プログラミング初心者向けの入門講座なので、あまりコードが複雑にならないようにするために、あえてそういった例外処理は削りました。

皆さんがコードを書くときは、あらゆる事態を想定して、どんな値が入力されても文法エラーで止まらないプログラムになるように工夫して下さいね。

戻り値

前回の講座でinput()関数を使ったのを覚えていますか?

input()関数の仕様は以下の通りです。

変数 = input(画面に表示する文字列)

例:str = input(‘好きな言葉を入力してください。’)

下記の例のように書くと、ユーザーが入力した文字や数値が文字列型でstrにセットされます。数値を入力しても、文字としての数値扱いになる点に注意して下さい。

このように、ある関数を実行したときに、値が返ってくることを、戻り値と呼びます。

理解を助けるためにinput()関数で戻り値が返ってくる様子をサンプルコードで見てみましょう。

サンプルコードは単純明快ですね。是非、IDLEなどで実行して確かめて下さいね。

尚、strにセットされている数値は文字列としての数値なので、print文で+演算子を用いて他の文字列と連結できますよ。

ちなみに、ユーザーから入力された文字列型の数値を数値型に変換するにはint()関数を使うことも覚えておきましょう。

ちょっとだけ込み入ったサンプルコードですが復習もかねて!!!

どういう構造になっているかというと、まずプログラム全体をwhile(True)の無限ループで囲んでいます。で、numにユーザーからの入力を受け取ります。

次に、if(num.isdigit())という部分がありますね。このisdigit()関数もとっても便利なので是非、存在だけでも頭の片隅においていただければと思います。

isdigit()関数の仕様

[書式]文字列型の変数.isdigit()

[機能]文字列型の変数が数値かどうかを判定【例:‘2’.isdigit()

[戻り値]TrueまたはFalse

<参考画像>

isdigit()関数による数値判定

このisdigit()関数は文字列型の数値でも、それが数字の形をしているか判定してくれる便利な関数です。

ユーザーが入力した値が数値なのか文字なのかを一発判定できます。

で、プログラムの構造の話に戻りますね。

if(num.isdigit())とすることで、isdigit()の戻り値はTrueかFalseなので、ユーザーがinput()関数で入力した値が数字ならばif(True)となり、num = int(num)が実行されます。もしここでisdigit()関数を使って数値判定をしていないと、int(文字列)となってしまった場合、文法エラーでプログラムが止まってしまいますよね。

で、もしユーザーがinput()のところで誤って文字を入力すると、if(False)となり、elseブロックに処理が飛びます。そこでエラーメッセージが表示され、もう一度、whileループの先頭行からやり直しになります。

逆に、ユーザーがちゃんと数値を入力していれば、if(True)となり、

print(num ** 2)
break

が実行され、whileループを抜けてプログラムが終了します。

ちなみにnum ** 2の**という演算子の意味はご記憶にありますでしょうか?

a ** b でaのb乗を表します。なので、num ** 2でnumにセットされた数値の2乗を意味します。

せっかくなので、脇道にそれますが算術演算子の復習をしておきましょう。

演算子 意味 例の結果
+ 足算 7+3 10
引算 7-3 4
* 掛け算 7*3 21
/ 割り算 7/3 2.3333333333333335
// 小数点以下を切り捨てる割り算 7//3 2
** べき乗 7**2 49
% 剰余(割り算の余りのこと) 7%2 1

さて、だいぶ話が脇道にそれまくりましたが、今回は「ユーザー定義関数における戻り値の解説」をしていたのでしたね(筆者もなんの話題だったか忘れかけていました・・・でもなるべく読者の方がPyhon3プログラミングをしっかり理解できるように配慮した結果の寄り道なんです・・・お許しくださいm(-_-)m)。

というわけで、お次は、引数もとるし、戻り値も返す関数を定義してみましょう。

このプログラムはinput()関数を書く度に、ユーザーからの入力が本当に数値かどうかチェックするのがめんどうなので、自動的に数値判定をした上で、さらに、ユーザーからの入力が数値ならば、文字列型の数値を整数型にして返す関数です。もしユーザーの入力が数値以外の場合は、事前に指定したエラーメッセージを表示します。

尚、ユーザーに入力を求めるときに表示するメッセージはinput_messageに渡します。

関数からの戻り値を指定するにはreturn文を使用します。

ちなみにtype()関数は指定された値のデータ型を返す関数です。

 

少し長くなりましたが以上で関数の基礎的な解説は終わりにしたいと思います。実はまだまだ関数には豊富な機能があるのですが、入門段階でおさえるべき知識は網羅したつもりです。

次回、Python3超入門【第10回】も宜しくお願い申し上げます!!!

 

[PR]入門 Python 3

Python3超入門講座トップに戻る

【関連記事】

あわせて読みたい