Python入門|関数の作り方をやさしく解説
同じ処理を何度も書くのは非効率で、修正が必要になったとき全箇所を直さなければなりません。Pythonの「関数」を使えば、処理をひとまとめにして名前を付け、何度でも呼び出せます。この記事では、関数の基本的な作り方から実践的な使い方まで解説します。
関数とは何か
関数とは、特定の処理をひとまとめにして名前を付けたものです。一度定義すれば何度でも呼び出せるため、コードの重複を減らし、プログラムを整理できます。
関数を使うメリット
関数を使うことで、次のようなメリットがあります。
- 同じコードを何度も書かなくて済む
- 処理に名前が付くため、コードの意味がわかりやすくなる
- 修正が必要になったとき、関数の中身だけ直せばよい
Pythonの組み込み関数
実は、すでに関数を使ったことがあるはずです。print() や len() はPythonにあらかじめ用意された「組み込み関数」です。
# 組み込み関数の例
print("こんにちは") # 画面に文字を表示する関数
print(len([1, 2, 3])) # リストの要素数を返す関数 → 3
print(max(10, 20, 30)) # 最大値を返す関数 → 30
print(sum([1, 2, 3])) # 合計を返す関数 → 6
関数の定義と呼び出し
自分で関数を作るには def キーワードを使います。
基本的な書き方
def greet():
print("こんにちは!")
print("今日もがんばりましょう。")
# 関数の呼び出し
greet()
実行結果:
こんにちは!
今日もがんばりましょう。
def 関数名(): の後に、インデント(字下げ)したブロックの中に処理を書きます。関数は「定義しただけ」では実行されず、関数名() と書いて呼び出したときに初めて実行されます。
関数を複数回呼び出す
def print_separator():
print("=" * 30)
print_separator()
print("お知らせ")
print_separator()
print("明日は10時集合です。")
print_separator()
実行結果:
==============================
お知らせ
==============================
明日は10時集合です。
==============================
このように、何度でも呼び出して同じ処理を実行できます。
引数の使い方
関数に「引数」を設定すると、呼び出すたびに異なるデータを渡して処理できます。
引数を1つ受け取る関数
def greet(name):
print(f"{name}さん、こんにちは!")
greet("田中") # 田中さん、こんにちは!
greet("佐藤") # 佐藤さん、こんにちは!
複数の引数を受け取る関数
def introduce(name, age, city):
print(f"名前: {name}")
print(f"年齢: {age}歳")
print(f"出身: {city}")
introduce("田中太郎", 25, "東京")
実行結果:
名前: 田中太郎
年齢: 25歳
出身: 東京
キーワード引数
引数名を指定して値を渡すこともできます。順番を気にしなくてよいので、引数が多い関数で便利です。
def create_profile(name, age, city):
return f"{name}({age}歳・{city})"
# キーワード引数で順番を入れ替えて呼び出し
result = create_profile(city="大阪", name="鈴木花子", age=30)
print(result) # 鈴木花子(30歳・大阪)
戻り値(return)
関数の処理結果を呼び出し元に返すには、return を使います。
returnの基本
def add(a, b):
return a + b
result = add(10, 20)
print(result) # 30
# 戻り値を直接使うこともできる
print(add(3, 7)) # 10
複数の値を返す
Pythonでは、複数の値をまとめて返すことができます。
def calc_stats(numbers):
total = sum(numbers)
average = total / len(numbers)
maximum = max(numbers)
minimum = min(numbers)
return total, average, maximum, minimum
scores = [85, 92, 78, 95, 88]
total, avg, high, low = calc_stats(scores)
print(f"合計: {total}") # 合計: 438
print(f"平均: {avg}") # 平均: 87.6
print(f"最高: {high}") # 最高: 95
print(f"最低: {low}") # 最低: 78
条件によって異なる値を返す
def evaluate_score(score):
if score >= 90:
return "優"
elif score >= 70:
return "良"
elif score >= 50:
return "可"
else:
return "不可"
print(evaluate_score(92)) # 優
print(evaluate_score(75)) # 良
print(evaluate_score(40)) # 不可
デフォルト引数
引数にデフォルト値を設定しておくと、呼び出し時にその引数を省略できます。
デフォルト引数の基本
def greet(name, greeting="こんにちは"):
print(f"{greeting}、{name}さん!")
greet("田中") # こんにちは、田中さん!
greet("佐藤", "おはようございます") # おはようございます、佐藤さん!
実践例: 消費税計算
def calc_price(price, tax_rate=0.10):
tax = int(price * tax_rate)
total = price + tax
return total
# 標準税率(10%)
print(calc_price(1000)) # 1100
# 軽減税率(8%)
print(calc_price(1000, 0.08)) # 1080
デフォルト引数は、関数定義の引数リストで「デフォルト値なしの引数」より後に置く必要があります。
# OK
def func(a, b, c=10):
pass
# NG: デフォルト引数の後にデフォルトなしの引数は置けない
# def func(a, b=10, c):
# pass
可変長引数
引数の数が事前にわからない場合は、可変長引数を使います。
*argsで複数の引数を受け取る
*args を使うと、任意の数の引数をタプルとして受け取れます。
def calc_total(*prices):
total = sum(prices)
print(f"合計: {total:,}円({len(prices)}点)")
return total
calc_total(500, 800, 1200) # 合計: 2,500円(3点)
calc_total(100, 200, 300, 400) # 合計: 1,000円(4点)
**kwargsでキーワード引数を受け取る
**kwargs を使うと、任意の数のキーワード引数を辞書として受け取れます。
def create_user(name, **details):
user = {"name": name}
user.update(details)
return user
user1 = create_user("田中", age=25, city="東京")
print(user1) # {'name': '田中', 'age': 25, 'city': '東京'}
user2 = create_user("佐藤", age=30, city="大阪", hobby="読書")
print(user2) # {'name': '佐藤', 'age': 30, 'city': '大阪', 'hobby': '読書'}
実践例: ToDoリスト管理
ここまでの知識を使って、簡単なToDoリスト管理の関数を作ってみましょう。
ToDoリストの機能を関数化
def add_task(todo_list, task, priority="普通"):
todo_list.append({"task": task, "priority": priority, "done": False})
print(f"追加: {task}(優先度: {priority})")
def complete_task(todo_list, index):
if 0 <= index < len(todo_list):
todo_list[index]["done"] = True
print(f"完了: {todo_list[index]['task']}")
else:
print("無効なタスク番号です。")
def show_tasks(todo_list):
if not todo_list:
print("タスクはありません。")
return
print("--- ToDoリスト ---")
for i, item in enumerate(todo_list):
status = "[済]" if item["done"] else "[未]"
print(f" {i}: {status} {item['task']}({item['priority']})")
# 使ってみる
todos = []
add_task(todos, "買い物に行く", "高")
add_task(todos, "レポートを書く")
add_task(todos, "部屋の掃除")
show_tasks(todos)
complete_task(todos, 0)
show_tasks(todos)
実行結果:
追加: 買い物に行く(優先度: 高)
追加: レポートを書く(優先度: 普通)
追加: 部屋の掃除(優先度: 普通)
--- ToDoリスト ---
0: [未] 買い物に行く(高)
1: [未] レポートを書く(普通)
2: [未] 部屋の掃除(普通)
完了: 買い物に行く
--- ToDoリスト ---
0: [済] 買い物に行く(高)
1: [未] レポートを書く(普通)
2: [未] 部屋の掃除(普通)
よくある間違いと注意点
間違い1: returnを忘れる
# NG: returnがないためNoneが返る
def add_wrong(a, b):
result = a + b # 計算するだけで返していない
print(add_wrong(1, 2)) # None
# OK: returnで結果を返す
def add_correct(a, b):
return a + b
print(add_correct(1, 2)) # 3
間違い2: デフォルト引数にリストを使う
# NG: リストがすべての呼び出しで共有されてしまう
# def add_item_wrong(item, items=[]):
# items.append(item)
# return items
# OK: Noneをデフォルトにして関数内でリストを作る
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
print(add_item("A")) # ['A']
print(add_item("B")) # ['B'](前回の'A'は含まれない)
間違い3: 関数内の変数を外から参照する
def calculate():
result = 100 # この変数は関数内だけで有効
calculate()
# print(result) # NameError: name 'result' is not defined
# OK: 戻り値で受け取る
def calculate():
result = 100
return result
value = calculate()
print(value) # 100
まとめ
この記事では、Pythonにおける関数の基本を解説しました。
defで関数を定義し、関数名()で呼び出す- 引数を使って、呼び出しごとに異なるデータを渡せる
returnで処理結果を呼び出し元に返す- デフォルト引数を設定すると、省略時にデフォルト値が使われる
*argsと**kwargsで可変長の引数を受け取れる
関数を活用すると、コードが整理され、修正や機能追加がしやすくなります。まずは繰り返し使う処理を関数にまとめるところから始めてみてください。