関数を定義する

このレッスンで作るもの — 処理のかたまりに名前を付ける 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 には たろうさん、おこづかい帳へようこそ が入ります。

diagram (will load when visible)

「関数を書いたのに何も起きない」の原因は、たいてい呼び出しを書き忘れていることです。定義と呼び出しは必ずセットです。

動きを追ってみる

greet_user("はなこ") を呼んだときの流れは下記のとおりです。

  1. 引数の "はなこ" が、関数の中の name に入る
  2. name + "さん、おこづかい帳へようこそ" が計算される
  3. できあがった文字列が 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 つ増えていく感覚を持っておくとよいです。

よくある間違い

  1. コロンと字下げを忘れるdef greet_user(name) とコロンを書かないと SyntaxError です。字下げがないと IndentationError になります。字下げは半角スペース 4 つに揃えます。
  2. 呼び出しでかっこを付け忘れるgreet_user とだけ書くと、関数そのものを指すだけで実行されません。greet_user("たろう") とかっこを付けて初めて動きます。
  3. return を書かずに print で済ませる — 画面には出ますが、戻り値は None になります。採点は戻り値を見るので、必ず return で返します。

やってみよう

関数 greet_user(name) を実装してください。引数 name を受け取り、name のうしろに "さん、おこづかい帳へようこそ" をつないだ文字列を return します。

ただし name が空文字 "" のときは、name の代わりに "ゲスト" を使って ゲストさん、おこづかい帳へようこそ を返します。文字列の連結は + です。書けたら print(greet_user("たろう")) を手元で試して、定義と呼び出しがつながる感覚を確かめてみてください。

要件

  1. 関数名は greet_user で、引数は name の 1 つ
  2. 戻り値は name + "さん、おこづかい帳へようこそ" の文字列
  3. name が空文字 "" のときは "ゲスト" を使う
  4. print ではなく return で返す

入出力例

greet_user("たろう")"たろうさん、おこづかい帳へようこそ" greet_user("はなこ")"はなこさん、おこづかい帳へようこそ" greet_user("")"ゲストさん、おこづかい帳へようこそ" greet_user("Taro")"Taroさん、おこづかい帳へようこそ" greet_user("あ")"あさん、おこづかい帳へようこそ"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
main.py
学習モード

メモ

関数を定義する

⌘S で保存