基礎

Pythonの関数|defで処理をまとめて再利用する

関数とは、一連の処理をまとめて名前を付けたものです。同じ処理を何度も書く代わりに、関数として定義しておけば、必要なときに呼び出すだけで使えます。コードの再利用性と可読性が大幅に向上します。

この記事では、関数の定義方法から、引数・戻り値、デフォルト引数、可変長引数まで詳しく解説します。

基本的な使い方

defキーワードで関数を定義します。関数名の後に括弧とコロンを書き、インデントされたブロックに処理を記述します。

Python
# 関数の定義
def greet():
    print("こんにちは!")
    print("Pythonの世界へようこそ!")

# 関数の呼び出し
greet()
greet()  # 何度でも呼び出せる
実行結果
こんにちは!
Pythonの世界へようこそ!
こんにちは!
Pythonの世界へようこそ!

引数(パラメータ)

関数に値を渡すには、引数(ひきすう)を使います。関数を呼び出す際に渡す値を「引数」、関数定義側で受け取る変数を「パラメータ」と呼びます。

Python
# 引数を受け取る関数
def greet(name):
    print(f"こんにちは、{name}さん!")

greet("太郎")
greet("花子")

# 複数の引数
def add(a, b):
    print(f"{a} + {b} = {a + b}")

add(3, 5)
add(10, 20)
実行結果
こんにちは、太郎さん!
こんにちは、花子さん!
3 + 5 = 8
10 + 20 = 30

戻り値(return)

return文を使うと、関数の処理結果を呼び出し元に返すことができます。

Python
# 戻り値のある関数
def calculate_tax(price, tax_rate=0.10):
    tax = int(price * tax_rate)
    total = price + tax
    return total

# 戻り値を変数で受け取る
result = calculate_tax(1000)
print(f"税込価格: {result}円")

# 複数の値を返す
def min_max(numbers):
    return min(numbers), max(numbers)

low, high = min_max([3, 1, 4, 1, 5, 9])
print(f"最小: {low}, 最大: {high}")
実行結果
税込価格: 1100円
最小: 1, 最大: 9

デフォルト引数

引数にデフォルト値を設定すると、呼び出し時に省略できます。

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

greet("太郎")                    # デフォルト値を使用
greet("花子", "おはようございます")  # 値を指定

# キーワード引数
def create_user(name, age, city="東京"):
    print(f"{name}({age}歳) - {city}")

create_user("太郎", 25)
create_user(age=30, name="花子", city="大阪")
実行結果
こんにちは、太郎さん!
おはようございます、花子さん!
太郎(25歳) - 東京
花子(30歳) - 大阪

可変長引数

*argsで任意の数の位置引数、**kwargsで任意の数のキーワード引数を受け取れます。

Python
# *args: 任意の数の引数をタプルで受け取る
def total(*args):
    return sum(args)

print(total(1, 2, 3))
print(total(10, 20, 30, 40, 50))

# **kwargs: キーワード引数を辞書で受け取る
def show_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

show_info(name="太郎", age=25, city="東京")
実行結果
6
150
name: 太郎
age: 25
city: 東京
関数設計のコツ

関数は「1つの関数に1つの責務」が原則です。関数名は動詞で始め(calculate_tax, get_user)、何をする関数かが一目でわかるようにしましょう。引数が多すぎる場合は、関数を分割することを検討してください。

デフォルト引数にミュータブルオブジェクトを使わない

def func(items=[]) のようにリストをデフォルト値にすると、呼び出しのたびに同じリストが共有されて予期しない動作になります。代わりに def func(items=None) として関数内で if items is None: items = [] としましょう。

まとめ

  • defキーワードで関数を定義し、処理をまとめて再利用できる
  • 引数で関数に値を渡し、returnで結果を返す
  • デフォルト引数で呼び出し時の引数を省略できる
  • *args, **kwargsで可変長引数を受け取れる
  • 関数名は動詞で始め、1つの関数に1つの責務を持たせる