関数[1]
関数とは
これまでのコードは非常に短いものでした。確認のためやサンプルとして提示する分には問題ありませんが、現実的なコードはこれほど短いということはないでしょう。コードが長くなればなるほど似たような処理が増えてきます。その度に同じような処理を書きたいと思う人は少ないでしょう。また、コードが冗長になってしまい、プログラムの可読性を下げてしまうという問題も引き起こします。そのような場合は、そうすれば良いのでしょうか。そこで登場するのが関数です。関数は、似たようなコードを一つの部品としてコード体系として管理することができるのです。つまり、関数とは、名前の付いたコードであり他のコードとは区別されたものです。関数は任意の型・任意の個数の引数を取ることができ、任意の型・任意の個数の返り値を返します。もちろん0個でもかまいません。
関数の定義と呼び出し
関数は自ら定義し、呼び出すことができます。まずは、サンプルを見ましょう。
>>> def isOdd(x): ... if x % 2 != 0: ... print("True") ... else: ... print("False") ... # 1行空ける。空けないと関数の続きと判断されてしまいます。 >>> isOdd(10) False >>> isOdd(5) True >>> for x in range(0, 10): ... isOdd(x) ... False True False True False True False True False True
関数の定義
- 「def」で関数を定義する。「def」の右横には任意の関数(今回は"isOdd")をつける。関数名は、変数名と同じ規則に従います。組み込み関数などと名前が被らないように注意しましょう。また、関数名は関数が何をするのかわかるような名前にした方がいいです。
- 関数名の右横に()を書き、中に任意の名前の引数(今回はx)を書く。引数名もわかりやすいものをつけた方がいいですが長すぎると返って判りにくくなるので注意してください。
- 最後にセミコロン(":")を書きます。
- インデントして関数の中身を書いていきます。ここには、関数を呼び出した時にどのような処理をして欲しいのかを書きます。
関数の呼び出し
- 関数名を書きます。引数がある場合には引数を()内に書きます。
- 以上です。
今回は、isOdd()関数を定義しました。isOdd()関数は、奇数ならTrueを偶数ならFalseを表示します。この関数に返り値はありません。
返り値のある関数関数
今度は返り値のある関数です。サンプルを見ましょう。
>>> def isEven(x): ... if x % 2 == 0: ... return True ... else: ... return False ... >>> for i in range(0, 10): ... if isEven(i): ... print("Even") ... else: ... print("Odd") ... Even Odd Even Odd Even Odd Even Odd Even Odd
- 1~4までは先程までと同じです。
- 「return 」の後に返り値にしたいものを書きます。今回はTrueまたはFalseを返り値としました。
関数の中で変数を宣言
関数の中で変数を宣言するとどうなるでしょうか。サンプルを見ましょう。
>>> def countOne(list): ... cnt = 0 ... for i in list: ... if i == 1: ... cnt += 1 ... return cnt ... >>> countOne([1, 3, 2, 4, 5, 1, 1, 2, 7, 8]) 3 >>> countOne([0, 0, 0,]) 0 >>> print(cnt) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'cnt' is not defined
返り値として関数内で宣言した"cnt"用いています。しっかりと値が返されていることがわかります。それでは、"cnt"の値を表示するとどうなるでしょうか。上の例にあるように例外が発生します。関数内で宣言された変数は関数内だけで有効です。このように変数などの定義されている領域をスコープと呼びます。スコープはブッロクと同じような意味で使われます。スコープの話はもう少し先でしたいと思います。今は、関数内で宣言した変数は関数を抜けると使えなくなるという程度の理解で良いと思います。
関数の中で関数を呼び
関数の中で関数を呼び出したらどうなるでしょうか。サンプルを見ましょう。
>>> def child(): ... print("child") ... >>> def parent(): ... print("parent") ... child() ... >>> child() child >>> parent() parent child >>> def parent(): ... grandparent() ... print("parent") ... child() ... >>> parent() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in parent NameError: name 'grandparent' is not defined >>> def grandparent(): ... print("grandparent") ... >>> parent() grandparent parent child
上記の結果のように関数の中から関数を呼ぶことができます。定義していない関数を呼ぶと例外が発生しますが、きちんと定義すると呼ぶことができます。また。関数の定義の順番はその関数を呼び出すまでに定義されているならばどのような順でも問題ありません。
引数(ひきすう)の名前について
参考書などを読むと引数のことを実引数や仮引数と書いてあるものがあると思います。関数定義で使われる方を仮引数と呼び、関数呼び出し時に実際に渡される方を実引数といいます。説明の中では特に注意しなければいけない時以外は引数で統一します。
最後に
お疲れ様でした。関数の基本定義はこれで終わりです。次回は関数の2回目ということで位置引数やキーワード引数、デフォルト引数など引数に注目した話をしたいと思います。