はじめに
Python基礎構文シリーズ第4回は「関数」です。コードを再利用可能な単位にまとめる方法を学びます。
関数とは
関数は、特定の処理をまとめて名前をつけたものです。同じ処理を何度も書く代わりに、関数を呼び出すことで再利用できます。
基本的な関数定義
def greet():
print("こんにちは!")
# 関数の呼び出し
greet() # こんにちは!
greet() # こんにちは!
引数を受け取る関数
def greet(name):
print(f"こんにちは、{name}さん!")
greet("太郎") # こんにちは、太郎さん!
greet("花子") # こんにちは、花子さん!
複数の引数
def introduce(name, age):
print(f"{name}さんは{age}歳です")
introduce("太郎", 25) # 太郎さんは25歳です
戻り値のある関数
return で値を返します。
def add(a, b):
return a + b
result = add(3, 5)
print(result) # 8
# 直接使用することも可能
print(add(10, 20)) # 30
複数の戻り値
タプルで複数の値を返すことができます。
def get_min_max(numbers):
return min(numbers), max(numbers)
minimum, maximum = get_min_max([3, 1, 4, 1, 5, 9, 2, 6])
print(f"最小: {minimum}, 最大: {maximum}") # 最小: 1, 最大: 9
早期リターン
条件によって早めに関数を終了できます。
def divide(a, b):
if b == 0:
return None # ゼロ除算を防ぐ
return a / b
print(divide(10, 2)) # 5.0
print(divide(10, 0)) # None
デフォルト引数
引数にデフォルト値を設定できます。
def greet(name, greeting="こんにちは"):
print(f"{greeting}、{name}さん!")
greet("太郎") # こんにちは、太郎さん!
greet("太郎", "おはよう") # おはよう、太郎さん!
注意: デフォルト引数は、デフォルト値のない引数の後に配置する必要があります。
# OK
def func(a, b=10):
pass
# NG(エラーになる)
# def func(a=10, b):
# pass
キーワード引数
引数名を指定して渡すことができます。
def create_user(name, age, city):
return {"name": name, "age": age, "city": city}
# 位置引数
user1 = create_user("太郎", 25, "東京")
# キーワード引数(順序を変えられる)
user2 = create_user(city="大阪", name="花子", age=22)
print(user2) # {'name': '花子', 'age': 22, 'city': '大阪'}
可変長引数
*args(位置引数の可変長)
def sum_all(*args):
total = 0
for num in args:
total += num
return total
print(sum_all(1, 2, 3)) # 6
print(sum_all(1, 2, 3, 4, 5)) # 15
**kwargs(キーワード引数の可変長)
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="太郎", age=25, city="東京")
# name: 太郎
# age: 25
# city: 東京
組み合わせ
def func(a, b, *args, **kwargs):
print(f"a: {a}")
print(f"b: {b}")
print(f"args: {args}")
print(f"kwargs: {kwargs}")
func(1, 2, 3, 4, 5, x=10, y=20)
# a: 1
# b: 2
# args: (3, 4, 5)
# kwargs: {'x': 10, 'y': 20}
ラムダ式(無名関数)
1行で書ける簡単な関数です。
# 通常の関数
def double(x):
return x * 2
# ラムダ式
double = lambda x: x * 2
print(double(5)) # 10
ラムダ式の活用例
# ソートのキー関数
users = [
{"name": "太郎", "age": 25},
{"name": "花子", "age": 22},
{"name": "次郎", "age": 30},
]
# 年齢でソート
sorted_users = sorted(users, key=lambda u: u["age"])
print(sorted_users)
# filter関数と組み合わせ
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # [2, 4, 6, 8, 10]
# map関数と組み合わせ
squares = list(map(lambda x: x ** 2, numbers))
print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
型ヒント
引数と戻り値の型を明示できます(実行時には強制されません)。
def add(a: int, b: int) -> int:
return a + b
def greet(name: str) -> str:
return f"Hello, {name}!"
def get_user(id: int) -> dict | None:
# ユーザーを検索して返す
pass
ドキュメント文字列(docstring)
関数の説明を記述できます。
def calculate_area(width: float, height: float) -> float:
"""
長方形の面積を計算します。
Args:
width: 幅
height: 高さ
Returns:
面積(width * height)
"""
return width * height
# ドキュメントを確認
help(calculate_area)
スコープ(変数の有効範囲)
global_var = "グローバル変数"
def func():
local_var = "ローカル変数"
print(global_var) # アクセス可能
print(local_var) # アクセス可能
func()
print(global_var) # アクセス可能
# print(local_var) # エラー: 関数外からはアクセス不可
globalキーワード
counter = 0
def increment():
global counter # グローバル変数を変更する宣言
counter += 1
increment()
increment()
print(counter) # 2
再帰関数
関数が自分自身を呼び出す手法です。
def factorial(n):
if n <= 1:
return 1
return n * factorial(n - 1)
print(factorial(5)) # 120 (5 * 4 * 3 * 2 * 1)
# フィボナッチ数列
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
for i in range(10):
print(fibonacci(i), end=" ")
# 0 1 1 2 3 5 8 13 21 34
まとめ
def 関数名():で関数を定義returnで値を返す- デフォルト引数:
def func(a, b=10) - 可変長引数:
*args,**kwargs - ラムダ式:
lambda x: x * 2 - 型ヒント:
def func(x: int) -> int: - ドキュメント文字列でコードを説明
次回は「リストと辞書」について学びます。