採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

関数

テクノロジ系 / L06 function — 関数設計

関数 — ハンズオン

前提: variables/ のhands-onを完了している

目標: 引数・戻り値のある関数を自力で書ける

Step 1: 基本的な関数を書く

func_basic.py を作成:

def add(a, b):
    """2つの数を足して返す"""
    return a + b

def multiply(a, b):
    """2つの数を掛けて返す"""
    return a * b

def greet(name, greeting="こんにちは"):
    """挨拶文を返す"""
    return f"{greeting}、{name}さん"

# 呼び出し
print(add(3, 5))           # 8
print(multiply(4, 7))      # 28
print(greet("田中"))        # こんにちは、田中さん
print(greet("鈴木", "おはよう"))  # おはよう、鈴木さん

実行:

python3 func_basic.py

Step 2: 戻り値のある関数を書く

func_calc.py を作成:

def tax_included(price, rate=0.1):
    """税込み価格を返す"""
    return price * (1 + rate)

def discount(price, percent):
    """割引後の価格を返す"""
    return price * (1 - percent / 100)

def summary(price):
    """商品の価格サマリーを辞書で返す"""
    return {
        "original": price,
        "tax_included": tax_included(price),
        "with_10pct_off": discount(price, 10)
    }

# 呼び出し
prices = [1000, 2000, 5000]
for p in prices:
    result = summary(p)
    print(f"元値: {result['original']}円 / 税込: {result['tax_included']:.0f}円 / 10%オフ: {result['with_10pct_off']:.0f}円")

実行:

python3 func_calc.py

Step 3: スコープを確認する

func_scope.py を作成:

counter = 0  # グローバル変数

def increment(value):
    result = value + 1  # ローカル変数
    return result

print(increment(5))   # 6
print(increment(10))  # 11

# ローカル変数は外から見えない
try:
    print(result)
except NameError as e:
    print(f"NameError: {e}")

実行して、NameError が発生することを確認する。

Step 4: 自分で関数を作る

以下の仕様で bmi_calc.py を作成して動かす:

仕様:
- bmi(weight, height) 関数を定義する
  - weight: 体重(kg)
  - height: 身長(cm)
  - BMI = weight / (height/100)^2
  - 戻り値: BMI値(小数点2桁)

- classify(bmi) 関数を定義する
  - bmi < 18.5 → "低体重"
  - 18.5 <= bmi < 25 → "普通体重"  
  - 25 <= bmi < 30 → "過体重"
  - bmi >= 30 → "肥満"

- 3人分のデータ(自分で設定)でBMIと分類を表示する

完了チェック

  • [ ] 引数・戻り値のある関数を3つ書いた
  • [ ] デフォルト引数を使った関数を書いた
  • [ ] スコープの確認でNameErrorを確認した
  • [ ] BMI計算関数を自力で書いて動作確認した

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

Q1. 以下の関数の出力は何ですか?

def greet(name, greeting="こんにちは"):
    return f"{greeting}、{name}さん"

print(greet("田中"))
print(greet("鈴木", "おはよう"))
こんにちは、田中さん
おはよう、鈴木さん

デフォルト引数 greeting="こんにちは" は、引数を省略した場合に使われる。

Q2. 以下のコードのバグを指摘して修正してください。

def double(n):
    n * 2

result = double(5)
print(result)  # None が出力される

バグ: return が書かれていないため None が返る。

修正:

def double(n):
    return n * 2

Q3. ローカル変数とグローバル変数の違いを説明してください。

ローカル変数: 関数内で定義された変数。関数の外からは見えない(アクセスできない)。

グローバル変数: 関数の外で定義された変数。関数内からも参照できる。

混同するとバグの原因になるため、基本的に関数内の変数はローカルで完結させる設計が望ましい。

Q4. キーワード引数を使って以下の関数を呼び出してください(引数の順番は逆にする)。

def create_user(name, age, department):
    return f"{name}({age}歳){department}"
result = create_user(
    department="技術部",
    age=30,
    name="田中"
)
print(result)  # 田中(30歳)技術部

キーワード引数を使うと順番に関係なく引数を指定できる。

力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。