9. 関数(機能を作る)
よく使うコードに名前を付けてまとめ、必要なときに呼び出して使いましょう。
この章で学ぶこと
- 関数を作る(
作ろう)、呼ぶ(実行しよう)- 材料(引数)を渡す、結果を受け取る(
返そう)- 出力することと返すことの違い
- 関数の中と外の名札、デフォルト値、再帰
関数とは?
同じコードをあちこちで使っていると、コピーして貼り付けることになりますよね。そのコードを一度まとめて名前を付けておき、必要なたびに名前で呼べば楽です。このように名前を付けたコードのまとまりを関数といいます。〈文字列に〉のように山かっこで書くものは、すべて関数です。今度は自分で作ってみましょう。
作って呼ぶ
〈あいさつする〉を作ろう():
「こんにちは!」を出力しよう
「今日もいい一日を。」を出力しよう
〈あいさつする〉()を実行しよう
〈あいさつする〉()を実行しよう
〈あいさつする〉を作ろう():—〈あいさつする〉という関数を作ります。字下げした行が、関数のやることです。- 作っただけでは実行されません。
〈あいさつする〉()を実行しようで呼んではじめて実行されます。 - 2回呼んだので、あいさつが2回出ます。
材料を渡す(引数)
かっこの中に名札を書くと、呼ぶときに渡した値がその名札に入ります。この値を引数といいます。
〈あいさつする〉を作ろう(『名前』):
枠「{『名前』}さん、こんにちは!」を出力しよう
〈あいさつする〉(「カナデ」)を実行しよう
〈あいさつする〉(「花子」)を実行しよう
引数がいくつもあるときは、コンマで並べます。呼ぶときも同じ順番で渡します。
〈紹介する〉を作ろう(『名前』, 『年齢』):
枠「{『名前』}は{『年齢』}歳です。」を出力しよう
〈紹介する〉(「カナデ」, 20)を実行しよう
結果を受け取る: 返そう
関数が計算した結果を、呼んだ場所へ返すことができます。返ってきた値は、名札に入れたり、そのまま使ったりできます。
〈足す〉を作ろう(『あ』, 『い』):
(『あ』 + 『い』)を返そう
『合計』を〈足す〉(10, 20)にしよう
『合計』を出力しよう
(〈足す〉(1, 2) * 10)を出力しよう
30と30が出ます。2つ目の行では、〈足す〉(1, 2)が3になり、それに10を掛けました。
返そうに出会うと、関数はその場で終わります。 その下の行は実行されません。だから、条件によって早めに返すことができます。
〈評価〉を作ろう(『点数』):
もし(『点数』が90以上だ)なら:
「A」を返そう
もし(『点数』が80以上だ)なら:
「B」を返そう
「C」を返そう
(〈評価〉(95))を出力しよう
(〈評価〉(85))を出力しよう
(〈評価〉(50))を出力しよう
出力する vs 返す
初心者がいちばん迷うところです。
| 出力しよう | 返そう | |
|---|---|---|
| すること | 画面に見せます | 呼んだ場所に値を渡します |
| その値でさらに計算 | できません | できます |
〈二倍を出力〉を作ろう(『x』):
(『x』 * 2)を出力しよう
〈二倍を返す〉を作ろう(『x』):
(『x』 * 2)を返そう
『あ』を〈二倍を出力〉(5)にしよう
『い』を〈二倍を返す〉(5)にしよう
『あ』を出力しよう
『い』を出力しよう
10(関数の中の出力)、空っぽ、10が出ます。〈二倍を出力〉は画面に見せるだけで何も返さないので、『あ』には空っぽが入りました。結果をほかの場所で使いたいなら返そうを使ってください。
関数の中と外の名札
- 関数の中で作った名札は、関数が終わると消えます。外では使えません。
- いちばん外側(トップレベル)で作った名札は、関数の中でも読んだり変えたりできます。
『点数』を10にしよう
〈点数を上げる〉を作ろう():
『ボーナス』を5にしよう
『点数』に『ボーナス』を足そう
〈点数を上げる〉()を実行しよう
『点数』を出力しよう
15が出ます。『ボーナス』は関数の中にしかなかったので、外で『ボーナス』を出力しようと書くとエラーになります。
ただ、関数が外の名札を変えると、どこで値が変わったのか探しにくくなります。できれば引数で受け取って結果を返す形がおすすめです。
〈ボーナスを足す〉を作ろう(『点数』):
(『点数』 + 5)を返そう
『私の点数』を10にしよう
『私の点数』を〈ボーナスを足す〉(『私の点数』)にしよう
『私の点数』を出力しよう
リストや辞書を渡すと
7章で見たように、リストと辞書は別の名札に入れても同じまとまりを指します。関数に渡すときも同じなので、関数の中でリストを変えると外のリストも変わります。 数字や文字列は、関数の中で変えても外はそのままです。
〈項目を追加〉を作ろう(『リスト』):
『リスト』に「新しい項目」を追加しよう
〈数字を変える〉を作ろう(『数』):
『数』に100を足そう
『私のリスト』を【「最初」】にしよう
『私の数字』を1にしよう
〈項目を追加〉(『私のリスト』)を実行しよう
〈数字を変える〉(『私の数字』)を実行しよう
『私のリスト』を出力しよう
『私の数字』を出力しよう
[最初, 新しい項目]と1が出ます。
引数のデフォルト値
引数のあとに= 値を書くと、呼ぶときにその引数を省いても、デフォルト値が入ります。
〈あいさつする〉を作ろう(『名前』, 『言葉』 = 「こんにちは」):
枠「{『名前』}さん、{『言葉』}!」を出力しよう
〈あいさつする〉(「花」)を実行しよう
〈あいさつする〉(「花」, 「はじめまして」)を実行しよう
カナデには、同じ名前で引数だけ変えて関数を何度も作るオーバーロードがありません。 関数の名前は1つの場所に1つだけなので、同じ名前をもう一度作ると、プログラムが実行される前に構文エラーになります。引数があるときとないときを分けたいなら、上のようにデフォルト値を使うか、別の名前を付けてください。
〈あいさつする〉を作ろう():
「こんにちは!」を出力しよう
〈あいさつする〉を作ろう(『名前』):
枠「{『名前』}さん、こんにちは!」を出力しよう
タイプを付ける(選んでOK)
引数と返す値にもタイプを付けられます。付けると、間違った値が入ったり出たりしたときにすぐ教えてくれます。
【数字】を返す〈面積〉を作ろう(【数字】の『横』, 【数字】の『縦』):
(『横』 * 『縦』)を返そう
(〈面積〉(3, 4))を出力しよう
【数字】を返す〈年齢〉を作ろう():
「二十」を返そう
〈年齢〉()を出力しよう
「関数『年齢』は『数字』型を返す必要がありますが、『文字列』の値を返しました。」 が出ます。何も返さずに終わる関数(空っぽ)は、どのタイプでも通ります。
関数が自分自身を呼ぶ(再帰)
関数の中で、同じ関数をもう一度呼べます。これを再帰といいます。大きな問題を、同じ形の小さな問題に分けるときに使います。5の階乗(5 × 4 × 3 × 2 × 1)は「5 ×(4の階乗)」です。
〈階乗〉を作ろう(『n』):
もし(『n』が1以下だ)なら:
1を返そう
(『n』 * 〈階乗〉(『n』 - 1))を返そう
(〈階乗〉(5))を出力しよう
再帰には止まる条件が必ず必要です。上では、『n』が1以下ならそれ以上呼ばずに1を返します。止まる場所がないと呼び出しが限りなく積み重なり、10000階層を超えるとカナデがRecursionErrorで止めてくれます。
よくある間違い
1. 作るだけで呼ばない
作ろうは関数を準備するだけです。実行するには〈名前〉()を実行しようで呼ぶ必要があります。
2. 出力と返すことを混同する
関数の結果を名札に入れたのに空っぽが出るなら、関数の中で出力しようだけして、返そうをしていないか確かめてください。
3. 引数の数が合わない
必要な引数を渡し忘れたり、多すぎたりするとエラーになります。
〈二倍〉を作ろう(『数』):
(『数』 * 2)を返そう
(〈二倍〉())を出力しよう
「引数『数』が必要です。」 が出ます。多すぎると 「引数が多すぎます。」 が出ます。
4. かっこを忘れる
関数を呼ぶときは、引数がなくても()を必ず付けます。〈あいさつする〉()を実行しよう。
まとめ
| やりたいこと | 書き方 |
|---|---|
| 関数を作る | 〈名前〉を作ろう(『引数1』, 『引数2』): |
| 呼ぶ(結果は使わない) | 〈名前〉(値1, 値2)を実行しよう |
| 結果を受け取る | 『x』を〈名前〉(値)にしよう |
| 結果を返す | 値を返そう(その場で関数が終わる) |
| デフォルト値 | (『言葉』 = 「こんにちは」) |
| タイプ | 【数字】を返す〈名前〉を作ろう(【数字】の『x』): |
練習問題
1. 摂氏の温度を受け取って、華氏の温度を返す〈華氏に〉を作ってみましょう。(華氏 = 摂氏 × 9 / 5 + 32)
答えの例
〈華氏に〉を作ろう(『摂氏』):
(『摂氏』 * 9 / 5 + 32)を返そう
(〈華氏に〉(100))を出力しよう
(〈華氏に〉(0))を出力しよう
212と32が出ます。
2. 数字のリストを受け取って平均を返す〈平均を求める〉を作ってみましょう。(8章の「全部足す」を関数の中で使います。)
答えの例
〈平均を求める〉を作ろう(『数たち』):
『合計』を0にしよう
『数たち』の『数』ごとに繰り返そう:
『合計』に『数』を足そう
(『合計』 / 『数たち』の『長さ』)を返そう
(〈平均を求める〉(【80, 90, 100】))を出力しよう
3. 数が偶数なら真、そうでなければ偽を返す〈偶数か〉を作って、1から5までそれぞれの結果を出力してみましょう。
答えの例
〈偶数か〉を作ろう(『数』):
(『数』 % 2が0と同じだ)を返そう
1から5まで繰り返そう(『i』):
枠「{『i』}: {〈偶数か〉(『i』)}」を出力しよう
次の章では、エラーが出てもプログラムが止まらないようにエラーを受け止める方法を学びます。