Python | 1 日 90 分 × 7 日アプリ学習:関数で処理をまとめるアプリ(初級編)

Web APP Python
スポンサーリンク

6日目のゴール

6日目のテーマは
「自分が書いた関数を“見直して、よりよく書き直せるようになること” です。

ここまでであなたは、

def で関数を定義できる
引数で入力を渡せる
return で結果を返せる
役割ごとに関数を分けられる

というところまで来ています。

今日はそこから一歩進んで、

この関数、本当にこの形でいい?
もっと分かりやすくできない?
同じパターンをまとめられない?

と、自分のコードを“評価して、改善する目”を育てます。


昨日のコードを「批評する目」で見てみる

まずは日本語で説明してみる

5日目のミニアプリを、もう一度思い出します。

名前を入力してもらう
空ならエラーメッセージを出して終わる
空でなければ、名前つきであいさつする
今日の目標を表示する

これを関数に分けて書きました。

ここで一度、
「この分け方で本当に読みやすいか?」
を考えてみます。

入力を受け取る関数
空かどうか判定する関数
枠つきで表示する関数
全体の流れを管理する関数

この分け方は悪くありません。
でも、もう一歩だけ整理できます。


「似たような処理」をまとめてみる

print_box の中身を見直す

昨日の print_box はこうでした。

def print_box(message):
    print("==========")
    print(message)
    print("==========")
Python

もし、枠の上下に空行を入れたくなったらどうでしょう。

def print_box(message):
    print()
    print("==========")
    print(message)
    print("==========")
    print()
Python

こうすると、アプリ全体の見た目が少し“呼吸しやすく”なります。

ここで大事なのは、
「見た目のルールは 1 か所に集める」 という発想です。

枠のデザインを変えたいとき、
アプリ中の print を全部探して直すのではなく、
print_box だけ直せばいい状態にしておく。

これが「関数で処理をまとめる」の本当の価値です。


「入力+チェック」をひとまとめにする

ask_text と is_empty を組み合わせる

昨日はこう分けました。

def ask_text(prompt):
    return input(prompt)

def is_empty(text):
    return text.strip() == ""
Python

これはこれで正しいのですが、
「空ならもう一度聞きたい」という仕様にしたくなったらどうでしょう。

例えば、
「空のまま Enter されたら、もう一度聞き直す」
という動きにしたい。

それを関数にしてみます。

def ask_non_empty_text(prompt):
    while True:
        text = input(prompt)

        if text.strip() == "":
            print("空では入力できません。もう一度入力してください。")
            continue

        return text
Python

この関数の責任は、
「空ではない文字列が入力されるまで、何度でも聞き直す」
ということです。

呼び出し側は、こう書けます。

name = ask_non_empty_text("あなたの名前を入力してください: ")
print("こんにちは,", name)
Python

ここでの深掘りポイントは、

空チェックのロジックを
呼び出し側から完全に追い出している

ということです。

呼び出し側は
「名前をもらう」ことだけを意識すればよくなります。


「副作用のある関数」と「ない関数」を意識する

画面に出す関数と、値だけ扱う関数

関数には、大きく分けて二種類あります。

画面に何かを表示したり、入力を受け取ったりする関数。
値を計算したり、判定したりするだけの関数。

例えば、これは「表示する関数」です。

def print_box(message):
    print("==========")
    print(message)
    print("==========")
Python

一方、これは「値だけ扱う関数」です。

def is_empty(text):
    return text.strip() == ""
Python

6日目で意識してほしいのは、
「この関数は画面に触るのか? それとも値だけ扱うのか?」
を自分で言えることです。

値だけ扱う関数は、
テストしやすく、壊れにくいです。

画面に触る関数は、
見た目のルールをまとめる場所になります。


小さな改善を積み重ねて「読みやすさ」を上げる

名前を“日本語の一文”で説明できるか

例えば、次の関数名を見てください。

def main():
    ...
Python

main は「アプリ全体の流れを管理する」という意味でした。

では、次の関数名ならどうでしょう。

def greet_user(name):
    print(f"{name}さん、こんにちは!")
Python

これは
「ユーザーにあいさつする」
と一文で説明できます。

6日目で意識してほしいのは、
「関数名を見て、日本語の一文がすぐ出てくるか」
ということです。

出てくるなら、その関数はいい形をしています。
出てこないなら、その関数は“やりすぎ”か“曖昧すぎ”です。


6日目のミニアプリ:少し“整えた”あいさつアプリ

昨日までの学びを、よりきれいな形にする

def print_box(message):
    print()
    print("==========")
    print(message)
    print("==========")
    print()


def ask_non_empty_text(prompt):
    while True:
        text = input(prompt)

        if text.strip() == "":
            print("空では入力できません。もう一度入力してください。")
            continue

        return text


def greet_user(name):
    print_box(f"{name}さん、こんにちは!")


def show_goal():
    print_box("今日の目標:自分の関数を“少しだけ良く書き直す”感覚をつかむ")


def main():
    print_box("関数で処理をまとめるアプリ(6日目)")

    name = ask_non_empty_text("あなたの名前を入力してください: ")

    greet_user(name)
    show_goal()


main()
Python

このコードを、日本語で説明してみます。

print_box
メッセージを枠つきで表示する。見た目のルールをまとめた関数。

ask_non_empty_text
空ではない文字列が入力されるまで、何度でも聞き直す関数。

greet_user
名前を受け取り、その人にあいさつする関数。

show_goal
今日の学習目標を表示する関数。

main
アプリ全体の流れを管理する関数。

そして、
「どこで入力しているか」「どこで見た目を決めているか」「どこでメッセージの内容を決めているか」
が、かなりはっきり分かる形になっています。


6日目のまとめ:今日つかんでほしい感覚

今日の本質は、
「関数は一度書いて終わりではなく、“何度でも書き直してよくしていくもの”」
という感覚です。

この関数、本当にこの責任でいい?
この名前で、やっていることが伝わる?
この処理、別の関数に追い出せない?

と、自分のコードにツッコミを入れられるようになると、
一気に“自分のプログラム”になっていきます。

7日目は、
この 1 週間で学んだ「関数の考え方」を
言葉で整理して、自分の中に定着させる日になります。

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