Python | 2週間で身につく、アプリを作りながら学ぶPythonの基本 - 6日目

Python Python
スポンサーリンク

6日目のゴールとテーマ

6日目のテーマは 「関数でコードに“名前をつけて整理する”」 です。
ここまでで、if・for・while・リスト・辞書を使って、けっこう本格的な処理が書けるようになりました。

でも今のままだと、
「1ファイルの中に処理がベタッと並んでいて、どこで何をしているのか分かりにくい」
という状態になりがちです。

今日はここに、

関数(function)で処理のかたまりに名前をつける
「入力」と「出力」を意識して関数を書く
関数を組み合わせて、ミニアプリを“きれいな形”にする

ここまでを狙います。


関数とは何かをイメージでつかむ

「よく使う処理に名前をつけた“道具”」

関数は、一言でいうと 「処理のかたまりに名前をつけたもの」 です。

例えば、「挨拶を表示するコード」があったとします。

print("こんにちは")
print("Pythonを勉強中ですね")
Python

これを関数にすると、こうなります。

def greet():
    print("こんにちは")
    print("Pythonを勉強中ですね")
Python

def は「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 は「入力だけを担当する関数」
中で inputint をやって、最後に return name, price, count で3つの値を返している

calc_total は「計算だけを担当する関数」
price * count の結果をそのまま返している

print_result は「表示だけを担当する関数」
渡された値を使ってメッセージを組み立てている

そして、メインの流れは、

  1. input_item() で入力をもらう
  2. calc_total(...) で合計を計算する
  3. 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には printinput のような「最初から用意された命令」があります。
でも、あなたはもう 自分で命令を作れる 段階に来ています。

def ... で関数を定義するというのは、
「こういうときは、こう動いてね」という“自分ルール”をPythonに教える行為です。

  • よく使う処理
  • まとまりとして意味がある処理
  • 名前をつけたら読みやすくなる処理

こういうものを見つけたら、どんどん関数にしていく。
それが「プロっぽいコード」に近づいていく第一歩です。


6日目のまとめ

今日のキーポイントを短く整理すると、

  • def 関数名(...): で処理のかたまりに名前をつけられる
  • 引数で「外から値を受け取る」ことができる
  • return で「計算結果を返す」ことができる
  • 「入力」「処理」「出力」を関数で分けると、コードが読みやすくなる
  • 関数+リスト+辞書で、アプリの骨組みをきれいに設計できる

もし余裕があれば、今日の名簿アプリに次のような関数を足してみてください。

  • 「20歳以上だけを表示する print_adults(people)
  • 「平均年齢を計算して返す calc_average_age(people)
  • 「名前で検索して、その人だけ表示する search_by_name(people, keyword)

どれも、「関数に役割を与える」練習になります。
ここを越えると、いよいよ“アプリ設計”の世界に入っていきます。

タイトルとURLをコピーしました