関数を定義する
このレッスンで作るもの — 処理のかたまりに名前を付ける
defを覚え、呼ぶたびにあいさつ文を返すgreet_userを作ります。
関数を定義する
第 1 章から、演習ではずっと def で始まる形を書いてきました。あれが 関数 です。ここまでは「そういう決まり」として受け入れてもらっていましたが、この章でようやく正面から扱います。
関数は、いくつかの処理をひとまとめにして名前を付けたものです。名前を付けておくと、あとから何度でもその名前で呼び出せます。
同じ処理を 3 回書いたら、それは関数にする合図です。書く量が減るだけでなく、直す場所が 1 か所になります。
def の書き方
def のうしろに関数名、かっこ ()、そして半角コロンを書きます。次の行から 半角スペース 4 つ分の字下げ をして、中身を書きます。
def greet_user(name):
return name + "さん、おこづかい帳へようこそ"greet_user が関数名、name が 引数 です。引数は「外から受け取る材料」で、関数の中では普通の変数として使えます。return のうしろに書いた値が、この関数の答えになります。
関数名は変数と同じ規則で付けます。小文字と _ でつなぐのが Python の慣習で、greetUser ではなく greet_user と書きます。
定義と呼び出しは別物
def の行を書いただけでは、中身は 1 度も実行されません。def は「この名前でこういう処理を用意する」という登録であって、実行の合図ではないからです。
def greet_user(name):
return name + "さん、おこづかい帳へようこそ"
message = greet_user("たろう")greet_user("たろう") と書いて初めて中身が動きます。この書き方を 呼び出し と言います。message には たろうさん、おこづかい帳へようこそ が入ります。
「関数を書いたのに何も起きない」の原因は、たいてい呼び出しを書き忘れていることです。定義と呼び出しは必ずセットです。
動きを追ってみる
greet_user("はなこ") を呼んだときの流れは下記のとおりです。
- 引数の
"はなこ"が、関数の中のnameに入る name + "さん、おこづかい帳へようこそ"が計算される- できあがった文字列が
returnで呼び出し元に戻る
name という変数は関数の中だけで生きています。関数の外で print(name) と書いても NameError になります。この性質は「変数のスコープ」の回で詳しく扱います。
未入力のときに備える
おこづかい帳では、名前を入れずに使い始める人もいます。name が空文字 "" のときは ゲスト を使うことにします。第 4 章の if がそのまま使えます。
def greet_user(name):
if name == "":
name = "ゲスト"
return name + "さん、おこづかい帳へようこそ"引数で受け取った name を、関数の中で別の値に置き換えています。引数はただの変数なので、こうした書き換えができます。
関数の入口で「変な値が来ていないか」を整えておくと、あとに続く処理が 1 本道になって読みやすくなります。
手元で動かしてみる
kakeibo.py に下記を書いて保存し、実行してみてください。定義が先、呼び出しがあとという順番は第 1 章の実行順序のとおりです。
def greet_user(name):
if name == "":
name = "ゲスト"
return name + "さん、おこづかい帳へようこそ"
print(greet_user("たろう"))
print(greet_user(""))
print(greet_user("はなこ"))3 行が表示されます。def の中身は 1 度しか書いていないのに、呼び出しの数だけ動いています。これが「名前を付けて何度でも使う」ということです。
渡す値を変えれば結果も変わります。関数を 1 つ作るたびに、自分で使える命令が 1 つ増えていく感覚を持っておくとよいです。
よくある間違い
- コロンと字下げを忘れる —
def greet_user(name)とコロンを書かないとSyntaxErrorです。字下げがないとIndentationErrorになります。字下げは半角スペース 4 つに揃えます。 - 呼び出しでかっこを付け忘れる —
greet_userとだけ書くと、関数そのものを指すだけで実行されません。greet_user("たろう")とかっこを付けて初めて動きます。 returnを書かずにprintで済ませる — 画面には出ますが、戻り値はNoneになります。採点は戻り値を見るので、必ずreturnで返します。
やってみよう
関数 greet_user(name) を実装してください。引数 name を受け取り、name のうしろに "さん、おこづかい帳へようこそ" をつないだ文字列を return します。
ただし name が空文字 "" のときは、name の代わりに "ゲスト" を使って ゲストさん、おこづかい帳へようこそ を返します。文字列の連結は + です。書けたら print(greet_user("たろう")) を手元で試して、定義と呼び出しがつながる感覚を確かめてみてください。
要件
- 関数名は greet_user で、引数は name の 1 つ
- 戻り値は name + "さん、おこづかい帳へようこそ" の文字列
- name が空文字 "" のときは "ゲスト" を使う
- print ではなく return で返す
入出力例
greet_user("たろう") → "たろうさん、おこづかい帳へようこそ"
greet_user("はなこ") → "はなこさん、おこづかい帳へようこそ"
greet_user("") → "ゲストさん、おこづかい帳へようこそ"
greet_user("Taro") → "Taroさん、おこづかい帳へようこそ"
greet_user("あ") → "あさん、おこづかい帳へようこそ"