基礎から学ぶPython入門 90日コース | Python基礎 - Day 10:関数

Python 90日で身につけるPython
スポンサーリンク
スポンサーリンク

Day 10:関数 ― 「処理に“名前”をつけて、何度でも安全に再利用する」

Day 10では、「関数」を扱います。 関数は、「ある処理のまとまりに名前をつけて、何度でも呼び出せるようにする仕組み」です。 同じような処理を何度も書く代わりに、関数としてまとめておくことで、コードが読みやすくなり、修正もしやすくなり、バグやセキュリティ上のミスも減らせます。 ここでは、def、引数、戻り値、return、デフォルト引数、スコープをステップバイステップで見ていきます。

def ― 「関数を“定義する”ためのキーワード」

Pythonで関数を作るときは、def キーワードを使います。 基本形は次のようになります。

# 関数の基本的な定義

def greet():
    # ここが関数の中身(処理のまとまり)です
    print("こんにちは!Python入門コースへようこそ")

# 関数を呼び出す
greet()  # 関数名に()を付けると、その中身が実行されます
Python

このコードでは、greet という名前の関数を定義し、その中で print() を1回実行しています。 関数を「呼び出す」ときは、greet() のように、関数名の後ろに丸括弧 () を付けます。

ここで重要なのは、「関数の定義」と「関数の呼び出し」は別物だということです。 def greet(): は「こういう処理のまとまりがありますよ」という宣言であり、 実際に処理が動くのは greet() を呼び出したときです。

引数 ― 「関数に“外から渡す値”」

関数は、「外から値を受け取って、その値に応じた処理をする」ことができます。 この「外から渡す値」を「引数」と呼びます。

# 引数を持つ関数の例

def greet_user(name):
    # name という引数を受け取り、その値を使ってメッセージを表示します
    print(f"こんにちは、{name}さん!Python入門コースへようこそ")

# 関数を呼び出すときに、引数を渡します
greet_user("Taro")
greet_user("Hanako")
Python

このコードでは、greet_user 関数が name という引数を受け取り、 その値を使ってメッセージを作っています。

引数は、「関数にとっての入力」です。 同じ関数でも、引数の値が変われば、結果や動きが変わります。

セキュリティの観点では、「チェックしたい値」「ログに残したい値」「権限判定に使う値」などを引数として関数に渡すことで、 「入力に応じて安全な処理をする関数」を作ることができます。

# パスワードの長さをチェックする関数の例(簡易版)

def check_password_length(password):
    if len(password) < 8:
        print("パスワードが短すぎます(8文字以上にしてください)")
    else:
        print("パスワードの長さはOKです")

check_password_length("abc123")      # 短い
check_password_length("securepass")  # 十分な長さ
Python

戻り値とreturn ― 「関数から“結果”を返す」

関数は、処理をするだけでなく、「結果」を呼び出し元に返すことができます。 この「返される値」を「戻り値」と呼び、return キーワードを使って返します。

# 戻り値を持つ関数の基本

def add(a, b):
    # aとbを足した結果を返します
    result = a + b
    return result  # ここで呼び出し元に値を返します

# 関数の戻り値を変数に受け取る
sum_value = add(3, 5)
print(sum_value)  # 8
Python

ここでの流れはこうです。

  1. add(3, 5) を呼び出すと、a に3、b に5が渡されます。
  2. 関数の中で result = a + b が実行され、result に8が入ります。
  3. return result によって、8が呼び出し元に返されます。
  4. 呼び出し元では、その戻り値を sum_value に代入しています。

return は、「関数の出口」です。 return が実行されると、その時点で関数の処理は終了し、呼び出し元に値が返されます。

セキュリティ寄りの例として、「パスワードが安全かどうかを判定して、True / False を返す」関数を見てみます(あくまで簡易版です)。

# パスワードの安全性を簡易的に判定する関数の例

def is_password_safe(password):
    # 長さが8文字以上かどうかをチェックします
    if len(password) < 8:
        return False  # 安全ではないと判定してFalseを返す

    # ここに本来は文字種チェックなどを追加します
    return True  # 条件を満たしているのでTrueを返す

# 戻り値を使って分岐する
pwd = "abc123"
if is_password_safe(pwd):
    print("このパスワードは安全とみなされます(簡易チェック)")
else:
    print("このパスワードは安全ではありません(もっと強くしてください)")
Python

このように、「関数がTrue / Falseを返す」ことで、呼び出し側で条件分岐を行うことができます。

デフォルト引数 ― 「引数に“標準の値”を用意しておく」

関数の引数には、「デフォルト値(標準の値)」を設定することができます。 これにより、「よく使う値」を省略して呼び出せるようになります。

# デフォルト引数を持つ関数の例

def greet_user(name, greeting="こんにちは"):
    # greetingにデフォルト値"こんにちは"を設定しています
    print(f"{greeting}{name}さん!")

# greetingを省略した場合は、デフォルト値が使われます
greet_user("Taro")  # 「こんにちは、Taroさん!」

# greetingを指定した場合は、その値が使われます
greet_user("Hanako", "おはよう")  # 「おはよう、Hanakoさん!」
Python

ここでのポイントは、「引数に = で値を指定すると、その引数は省略可能になる」ということです。 省略された場合は、そのデフォルト値が使われます。

デフォルト引数は、「ほとんどの場合は同じ設定だが、たまに変えたい」という場面で便利です。

セキュリティ寄りのイメージとして、「最大ログイン試行回数にデフォルト値を持つ関数」を見てみます。

# ログイン試行回数をチェックする関数(デフォルト引数付き)

def is_locked(failed_count, max_failed=5):
    # max_failedにデフォルト値5を設定しています
    return failed_count >= max_failed

print(is_locked(3))        # 3回失敗 → False(ロックされない)
print(is_locked(5))        # 5回失敗 → True(ロックされる)
print(is_locked(3, 3))     # 閾値を3に変更 → True(ロックされる)
Python

ここでは、「通常は5回まで許容するが、必要に応じて閾値を変えられる」という柔軟な関数になっています。

スコープ ― 「変数が“どこから見えるか”というルール」

スコープとは、「変数がどの範囲で有効か(見えるか)」を決めるルールです。 Pythonでは、大きく分けて「グローバル変数」と「ローカル変数」があります。

グローバル変数は、「モジュール全体から見える変数」です。 ローカル変数は、「関数の中だけで有効な変数」です。

# スコープの基本

message = "グローバルメッセージ"  # グローバル変数

def show_messages():
    local_message = "ローカルメッセージ"  # この関数の中だけで有効な変数

    print(message)       # グローバル変数は関数の中からも参照できます
    print(local_message) # ローカル変数はこの関数の中でのみ参照できます

show_messages()

# 次の行はエラーになります(local_messageは関数の外からは見えません)
# print(local_message)
Python

ここでのポイントは、「関数の中で定義した変数は、その関数の外からは見えない」ということです。 これにより、「関数の内部状態」が外から勝手に書き換えられることを防げます。

セキュリティの観点では、「重要な一時情報をローカル変数として閉じ込める」「グローバルに置かないことで、意図しないアクセスを減らす」といった設計が重要です。

グローバル変数を関数の中で変更したい場合は、global キーワードを使う必要がありますが、 初心者のうちは「なるべくグローバル変数を増やさず、関数の引数と戻り値でやり取りする」スタイルをおすすめします。

# グローバル変数を変更する例(推奨は慎重に)

count = 0  # グローバル変数

def increment():
    global count  # この関数の中でグローバル変数countを使う宣言
    count += 1

increment()
increment()
print(count)  # 2
Python

このような書き方は可能ですが、グローバル変数が増えるとコードの見通しが悪くなり、 「どこで値が変わったか分からない」という状態になりやすく、バグやセキュリティ上のミスにつながりやすくなります。

Day 10のまとめと次へのつながり

Day 10では、

関数を def で定義する 引数で「外から値を受け取る」 return で「結果(戻り値)を返す」 デフォルト引数で「標準の値を用意しておく」 スコープで「変数がどこから見えるか」を意識する

という流れを学びました。

ここまで理解できると、「処理を関数としてまとめて名前をつける」という、プログラムの“構造化”が一気に進みます。 次のステップでは、複数の関数を組み合わせて、小さなモジュールや簡単なアプリケーションを作りながら、 「安全な入力チェック関数」「ログ出力関数」「権限判定関数」など、セキュリティを意識した関数設計にも踏み込んでいくことができます。

Day 10で特に重要なのは、「関数は“再利用可能な安全な部品”であり、引数と戻り値はその部品の“入口と出口”、スコープはその部品の“守備範囲”だ」という感覚です。 この感覚が身につくと、コード全体を「安全な部品の組み合わせ」として設計できるようになり、バグや脆弱性を減らしながら、より大きなプログラムへと進んでいけます。


Day 10:関数 ― 関数化した「電卓」を作ってみる

Day 10では、前半で学んだ「関数」の考え方を使って、実際に小さな「電卓プログラム」を関数化して作っていきます。 ただ計算するだけでなく、「def」「引数」「戻り値」「return」「デフォルト引数」「スコープ」を意識しながら、 “再利用しやすくて安全な部品”として電卓を設計していく流れを体験していただきます。

電卓を関数で設計するイメージ

まず、「電卓でやりたいこと」を分解してみます。

  • 足し算
  • 引き算
  • 掛け算
  • 割り算

これらをそれぞれ「関数」として作り、最後に「どの計算をするか選ぶ関数」を用意する、という構成にしてみます。 こうすることで、「計算ロジック」と「ユーザーインターフェース(入力・表示)」を分けて考えられるようになり、 後からセキュリティチェック(不正な入力の防止など)を追加しやすくなります。

def と引数・戻り値 ― 計算処理に“名前”と“入口・出口”をつける

まずは、足し算の関数から始めます。 「2つの数値を受け取って、その合計を返す」という関数です。

# 足し算をする関数
def add(a, b):
    # aとbは「引数」:外から渡される値です
    result = a + b  # 計算結果を変数resultに入れます
    return result   # 「戻り値」として呼び出し元に返します
Python

この関数のポイントは次の通りです。

  • def add(a, b): 関数名が add、引数が ab です。 「addという名前の処理のまとまりがあり、外から2つの値を受け取ります」という宣言になっています。
  • result = a + b 引数として受け取った ab を使って計算しています。
  • return result 計算結果を「戻り値」として返しています。 呼び出し側は、この戻り値を変数に受け取って使うことができます。

同じように、引き算・掛け算・割り算も関数にしてみます。

# 引き算をする関数
def subtract(a, b):
    result = a - b
    return result

# 掛け算をする関数
def multiply(a, b):
    result = a * b
    return result

# 割り算をする関数
def divide(a, b):
    # 割り算では、0で割るとエラーになるので注意が必要です
    if b == 0:
        # ここでは簡易的にメッセージを返すことにします
        return "エラー: 0で割ることはできません"
    result = a / b
    return result
Python

割り算の関数では、「0で割る」という危険な操作を防ぐために、 if b == 0: でチェックを入れています。 こうした「安全性のチェック」を関数の中に閉じ込めておくことで、 呼び出し側は安心して divide() を使えるようになります。

関数化した電卓の“メイン関数”を作る

次に、「どの計算をするか選んで、結果を表示する」関数を作ります。 ここでは、計算の種類を文字列で指定するスタイルにしてみます。

# 電卓のメイン関数
def calculator(a, b, operator):
    """
    aとbを使って、operatorで指定された計算を行います。
    operatorには '+', '-', '*', '/' のいずれかを渡します。
    """
    if operator == "+":
        return add(a, b)         # 足し算関数を呼び出す
    elif operator == "-":
        return subtract(a, b)    # 引き算関数を呼び出す
    elif operator == "*":
        return multiply(a, b)    # 掛け算関数を呼び出す
    elif operator == "/":
        return divide(a, b)      # 割り算関数を呼び出す
    else:
        # 想定外の演算子が来た場合
        return "エラー: 未対応の演算子です"
Python

この calculator() 関数は、「電卓の司令塔」のような役割を持っています。

  • 引数 ab が「計算する2つの値」
  • 引数 operator が「どの計算をするか」を表す記号
  • 中では if / elif で演算子を判定し、対応する計算関数を呼び出しています
  • 最終的に、各計算関数の戻り値をそのまま返しています

こうしておくと、呼び出し側は「どの計算関数を使うか」を意識せずに、 calculator(10, 5, "+") のように「電卓に命令する」だけで済むようになります。

デフォルト引数 ― 演算子に“標準の設定”を持たせる

次に、「演算子を省略した場合は足し算にする」というような、 “標準の設定”を持つ電卓関数を作ってみます。 ここで「デフォルト引数」が登場します。

# デフォルト引数付きの電卓関数
def calculator_default(a, b, operator="+"):
    """
    operatorを省略した場合は足し算を行います。
    """
    if operator == "+":
        return add(a, b)
    elif operator == "-":
        return subtract(a, b)
    elif operator == "*":
        return multiply(a, b)
    elif operator == "/":
        return divide(a, b)
    else:
        return "エラー: 未対応の演算子です"
Python

この関数では、operator="+": と書くことで、 演算子を省略したときのデフォルト値を "+"(足し算)にしています。

呼び出し例は次のようになります。

# デフォルト引数付き電卓の呼び出し例

result1 = calculator_default(10, 5)        # 演算子を省略 → 足し算
result2 = calculator_default(10, 5, "-")   # 引き算
result3 = calculator_default(10, 5, "*")   # 掛け算
result4 = calculator_default(10, 5, "/")   # 割り算

print(result1)  # 15
print(result2)  # 5
print(result3)  # 50
print(result4)  # 2.0
Python

デフォルト引数は、「よく使うパターンを省略できるようにする」ための仕組みです。 電卓の場合、「とりあえず足し算」が多いなら、演算子を省略したときに足し算になるようにしておくと便利です。

スコープ ― 電卓の“内部状態”をどう扱うか

次に、「スコープ(変数がどこから見えるか)」を意識してみます。 例えば、「電卓が何回使われたか」を数える機能を追加したいとします。

まず、グローバル変数でカウントする例を見てみます。

# 電卓の利用回数を数えるグローバル変数
use_count = 0  # モジュール全体から見える変数

def calculator_with_count(a, b, operator="+"):
    global use_count  # この関数の中でグローバル変数use_countを使う宣言

    use_count += 1  # 電卓が呼び出されるたびにカウントを増やす

    if operator == "+":
        return add(a, b)
    elif operator == "-":
        return subtract(a, b)
    elif operator == "*":
        return multiply(a, b)
    elif operator == "/":
        return divide(a, b)
    else:
        return "エラー: 未対応の演算子です"

# 呼び出し例
print(calculator_with_count(1, 2))      # 3
print(calculator_with_count(5, 3, "-")) # 2

print("電卓の利用回数:", use_count)   # 2
Python

ここでは、

  • use_count がグローバル変数として定義されています
  • calculator_with_count() の中で global use_count を宣言し、 関数の中からグローバル変数を更新しています

このような書き方は可能ですが、グローバル変数が増えると、 「どこで値が変わっているか分かりにくくなる」という問題が出てきます。

初心者向けには、「なるべくグローバル変数を使わず、関数の引数と戻り値でやり取りする」スタイルをおすすめします。 例えば、「利用回数を呼び出し側で管理する」形にすることもできます。

# 利用回数を呼び出し側で管理する例

def calculator_pure(a, b, operator="+"):
    # この関数はグローバル変数を触らず、純粋に計算だけを行います
    if operator == "+":
        return add(a, b)
    elif operator == "-":
        return subtract(a, b)
    elif operator == "*":
        return multiply(a, b)
    elif operator == "/":
        return divide(a, b)
    else:
        return "エラー: 未対応の演算子です"

# 呼び出し側で利用回数を管理
use_count = 0

result = calculator_pure(1, 2)
use_count += 1

result = calculator_pure(5, 3, "-")
use_count += 1

print("電卓の利用回数:", use_count)
Python

このように、「関数の中でグローバル状態をいじらない」ようにしておくと、 関数が“安全で予測しやすい部品”になり、テストやセキュリティチェックもしやすくなります。

関数化した電卓の完成例

最後に、ここまでの内容をまとめた「関数化電卓」のサンプルコードを示します。 コメント付きで、初心者の方にも読みやすい形にしています。

# 足し算の関数
def add(a, b):
    # aとbを足して結果を返します
    return a + b

# 引き算の関数
def subtract(a, b):
    # aからbを引いて結果を返します
    return a - b

# 掛け算の関数
def multiply(a, b):
    # aとbを掛けて結果を返します
    return a * b

# 割り算の関数
def divide(a, b):
    # 0で割ると危険なのでチェックします
    if b == 0:
        return "エラー: 0で割ることはできません"
    return a / b

# デフォルト引数付きの電卓関数
def calculator(a, b, operator="+"):
    """
    aとbを使って、operatorで指定された計算を行います。
    operatorには '+', '-', '*', '/' のいずれかを渡します。
    省略した場合は足し算になります。
    """
    if operator == "+":
        return add(a, b)
    elif operator == "-":
        return subtract(a, b)
    elif operator == "*":
        return multiply(a, b)
    elif operator == "/":
        return divide(a, b)
    else:
        return "エラー: 未対応の演算子です"

# 実際に使ってみる例
result1 = calculator(10, 5)        # 足し算(デフォルト)
result2 = calculator(10, 5, "-")   # 引き算
result3 = calculator(10, 5, "*")   # 掛け算
result4 = calculator(10, 5, "/")   # 割り算

print("10 + 5 =", result1)
print("10 - 5 =", result2)
print("10 * 5 =", result3)
print("10 / 5 =", result4)
Python

このサンプルでは、

  • 計算ごとに関数を分けて「責務」をはっきりさせています
  • 割り算関数の中で「0で割る」という危険な操作を防いでいます
  • 電卓関数 calculator() が「どの計算をするか」をまとめて管理しています
  • デフォルト引数で「演算子を省略したときの標準動作」を決めています

Day 10(制作編)のまとめ

Day 10の制作編では、「関数化した電卓」を通して、

  • def で処理に名前をつける
  • 引数で「外から値を受け取る」
  • return で「結果(戻り値)を返す」
  • デフォルト引数で「標準の設定」を持たせる
  • スコープを意識して「安全な部品」として関数を設計する

という流れを体験していただきました。

ここまで来ると、「関数はただの文法ではなく、“安全で再利用可能な部品”として設計するものだ」という感覚が少しずつ掴めてくるはずです。 この感覚を土台に、今後は「入力チェック関数」「ログ出力関数」「権限判定関数」など、 セキュリティを意識した関数設計にも自然と踏み込んでいけるようになります。

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