6日目のゴールとテーマ
6日目のテーマは 「関数でコードに“名前をつけて整理する”」 です。
ここまでで、if・for・while・リスト・辞書を使って、けっこう本格的な処理が書けるようになりました。
でも今のままだと、
「1ファイルの中に処理がベタッと並んでいて、どこで何をしているのか分かりにくい」
という状態になりがちです。
今日はここに、
関数(function)で処理のかたまりに名前をつける
「入力」と「出力」を意識して関数を書く
関数を組み合わせて、ミニアプリを“きれいな形”にする
ここまでを狙います。
関数とは何かをイメージでつかむ
「よく使う処理に名前をつけた“道具”」
関数は、一言でいうと 「処理のかたまりに名前をつけたもの」 です。
例えば、「挨拶を表示するコード」があったとします。
print("こんにちは")
print("Pythonを勉強中ですね")
Pythonこれを関数にすると、こうなります。
def greet():
print("こんにちは")
print("Pythonを勉強中ですね")
Pythondef は「define(定義する)」の略です。greet が関数の名前、その下のインデントされた部分が「関数の中身」です。
この関数を使うときは、こう呼びます。
greet()
greet()
Python実行すると、greet() を呼んだ回数だけ、挨拶が表示されます。
ここでの大事な感覚は、
「一度定義しておけば、何度でも呼び出せる“自作の命令”になる」
ということです。
引数つきの関数:値を渡して動きを変える
「誰に挨拶するか」を外から渡す
さっきの greet は、毎回同じメッセージでした。
今度は、「名前を渡して、その人に挨拶する」関数にしてみます。
def greet(name):
print("こんにちは、" + name + "さん")
Pythonここでのポイントは、
def greet(name): の name が「引数(ひきすう)」
関数を呼ぶときに渡される値を受け取る“受け皿”
ということです。
呼び出し側はこうなります。
greet("太郎")
greet("花子")
Python実行結果はこうです。
こんにちは、太郎さん
こんにちは、花子さん
関数の中では、「渡された値」を普通の変数のように使えます。
これで、「同じ処理だけど、使うデータだけ変えたい」という場面に対応できます。
戻り値つきの関数:「計算して結果を返す」
「表示する」のではなく「結果を返す」関数
今度は、「合計金額を計算する関数」を考えてみます。
def calc_total(price, count):
total = price * count
return total
Pythonここで新しく出てきたのが return です。return は、「関数の“結果”として値を返す」ためのキーワードです。
この関数を使う側は、こうなります。
result = calc_total(120, 3)
print("合計は" + str(result) + "円です")
Python実行結果はこうです。
合計は360円です
流れを丁寧に追います。
calc_total(120, 3) を呼ぶ
関数の中では price = 120, count = 3 として処理されるtotal = 120 * 3 で 360 になるreturn total で「360」という値が呼び出し元に返る
呼び出し元では、その値が result に入る
ここでの超重要ポイントは、
「関数の中で print する」のと「値を return する」のは別物
ということです。
- 画面に表示したいだけなら
print - 計算結果を“あとで使いたい”なら
return
この使い分けを意識できると、一気にコードが整理されます。
「入力」「処理」「出力」を関数で分けてみる
お会計アプリを関数で整理する
1日目に作った「お会計アプリ」を、関数で整理してみましょう。
元のイメージはこんな感じでした。
- 商品名・値段・個数を入力
- 合計金額を計算
- メッセージとして表示
これを関数に分けると、こうなります。
def input_item():
name = input("商品名を入力してください: ")
price_text = input("1個あたりの値段を入力してください(円): ")
count_text = input("個数を入力してください: ")
price = int(price_text)
count = int(count_text)
return name, price, count
def calc_total(price, count):
return price * count
def print_result(name, count, total):
print(name + "を" + str(count) + "個で、合計" + str(total) + "円です。")
print("ご利用ありがとうございました。")
print("=== お会計アプリ(関数バージョン) ===")
item_name, price, count = input_item()
total = calc_total(price, count)
print_result(item_name, count, total)
Pythonここでの重要ポイントを深掘りします。
input_item は「入力だけを担当する関数」
中で input と int をやって、最後に return name, price, count で3つの値を返している
calc_total は「計算だけを担当する関数」price * count の結果をそのまま返している
print_result は「表示だけを担当する関数」
渡された値を使ってメッセージを組み立てている
そして、メインの流れは、
input_item()で入力をもらうcalc_total(...)で合計を計算するprint_result(...)で結果を表示する
という“物語”になっています。
関数を使うと、
「この関数は何をしているのか」が名前から分かるようになり、
コード全体が“読める文章”に近づいていきます。
関数を使うメリットを具体的に感じてみる
「同じ処理を2回書かなくていい」「テストしやすい」
関数のメリットはたくさんありますが、
初心者のうちに体感してほしいのはこの2つです。
ひとつ目、同じ処理を何度も書かなくていい。
例えば、「税込金額を計算する処理」があったとします。
def calc_tax_included(price):
return int(price * 1.1)
Pythonこれを作っておけば、
total1 = calc_tax_included(1000)
total2 = calc_tax_included(2500)
Pythonのように、どこからでも同じルールで使えます。
もし税率が変わっても、calc_tax_included の中身を1か所直すだけで済みます。
ふたつ目、テストしやすい。
例えば calc_total が正しく動いているか確認したいとき、
関数になっていれば、こういう小さなテストができます。
print(calc_total(100, 3)) # 300 になるはず
print(calc_total(250, 0)) # 0 になるはず
Python関数がないと、「入力や表示とごちゃまぜ」になってしまい、
どこが悪いのか分かりにくくなります。
関数+リスト+辞書で「ミニ名簿アプリ」を整理する
5日目の名簿アプリを“関数化”してみる
5日目で作った「辞書+リストの名簿アプリ」を、関数で整理してみましょう。
やりたいことはこうです。
- 入力を担当する関数
- 一覧表示を担当する関数
- メインの流れ
コードはこんな形になります。
def input_people():
people = []
while True:
name = input("名前を入力してください(終了するには空のままEnter): ")
if name == "":
print("入力を終了します。")
break
age_text = input("年齢を入力してください: ")
age = int(age_text)
person = {"name": name, "age": age}
people.append(person)
return people
def print_people(people):
print("=== 名簿一覧 ===")
if len(people) == 0:
print("誰も登録されていません。")
else:
for i in range(len(people)):
person = people[i]
print(str(i + 1) + "人目: " + person["name"] + "(" + str(person["age"]) + "歳)")
print("=== 名簿アプリ 6日目(関数バージョン) ===")
people = input_people()
print_people(people)
Pythonここでのポイントは、
input_people は「名簿(peopleリスト)を作って返す」関数print_people は「渡された名簿を表示する」関数
メイン部分は「関数を呼び出しているだけ」
という構造になっていることです。
この形にしておくと、
「あとで検索機能を足したい」「平均年齢を出したい」となったときに、
新しい関数を足していくだけで、きれいに拡張できます。
関数の“引数の数”と“戻り値の数”の考え方
「この関数は何を受け取って、何を返すのか」を先に言葉で決める
関数を書くときに、いきなりコードから入ると迷子になりがちです。
おすすめは、先に日本語でこう書いてみることです。
「この関数は、〇〇を受け取って、△△を返す」
例えば calc_total なら、
「この関数は、値段(price)と個数(count)を受け取って、合計金額(total)を返す」
と決めてから書く。
input_people なら、
「この関数は、何も受け取らず、peopleリストを返す」
print_people なら、
「この関数は、peopleリストを受け取って、何も返さない(表示するだけ)」
こうやって「役割」を先に言葉で決めておくと、
関数の引数と戻り値が自然に決まっていきます。
6日目で一番大事な感覚
「関数は、“自分で作る命令”」
今日あなたに持ってほしい感覚はこれです。
Pythonには print や input のような「最初から用意された命令」があります。
でも、あなたはもう 自分で命令を作れる 段階に来ています。
def ... で関数を定義するというのは、
「こういうときは、こう動いてね」という“自分ルール”をPythonに教える行為です。
- よく使う処理
- まとまりとして意味がある処理
- 名前をつけたら読みやすくなる処理
こういうものを見つけたら、どんどん関数にしていく。
それが「プロっぽいコード」に近づいていく第一歩です。
6日目のまとめ
今日のキーポイントを短く整理すると、
def 関数名(...):で処理のかたまりに名前をつけられる- 引数で「外から値を受け取る」ことができる
returnで「計算結果を返す」ことができる- 「入力」「処理」「出力」を関数で分けると、コードが読みやすくなる
- 関数+リスト+辞書で、アプリの骨組みをきれいに設計できる
もし余裕があれば、今日の名簿アプリに次のような関数を足してみてください。
- 「20歳以上だけを表示する
print_adults(people)」 - 「平均年齢を計算して返す
calc_average_age(people)」 - 「名前で検索して、その人だけ表示する
search_by_name(people, keyword)」
どれも、「関数に役割を与える」練習になります。
ここを越えると、いよいよ“アプリ設計”の世界に入っていきます。
