関数
テクノロジ系 / 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 * 2Q3. ローカル変数とグローバル変数の違いを説明してください。
ローカル変数: 関数内で定義された変数。関数の外からは見えない(アクセスできない)。
グローバル変数: 関数の外で定義された変数。関数内からも参照できる。
混同するとバグの原因になるため、基本的に関数内の変数はローカルで完結させる設計が望ましい。
Q4. キーワード引数を使って以下の関数を呼び出してください(引数の順番は逆にする)。
def create_user(name, age, department):
return f"{name}({age}歳){department}"result = create_user(
department="技術部",
age=30,
name="田中"
)
print(result) # 田中(30歳)技術部キーワード引数を使うと順番に関係なく引数を指定できる。
力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。