関数を使用するメリット
- モジュール化と構造化: コードを論理的な単位に分割し、可読性と保守性を向上させる
- コード再利用: 同じ処理を繰り返し記述する必要がなくなる
- 抽象化とカプセル化: 内部実装を隠蔽し、「何をするか」に集中できる
- パラメータ化: 異なる入力に対応できる柔軟性
- テスト容易性: 入力と出力に焦点を当てた単体テストが可能
奇数判定関数の実例
def check_odd(number):
if number % 2 != 0:
print(f"{number} は奇数です")
return True
for i in range(10):
if not check_odd(i):
print(f"{i} は偶数です")
関数定義の基本構造
基本構文
def 関数名(引数):
処理内容
スコープ規則
Pythonの変数探索順序(LEGBルール):
- L: Local(関数内スコープ)
- E: Enclosed(外側の関数スコープ)
- G: Global(モジュールスコープ)
- B: Built-in(組み込みスコープ)
可変長引数の扱い
def process_data(*args, **kwargs):
print("位置引数:", args)
print("キーワード引数:", kwargs)
process_data(1, 2, 3, name="Alice", age=25)
ラムダ式の活用
# 数値リストのソート例
numbers = [3, 1, 4, 2]
sorted_numbers = sorted(numbers, key=lambda x: x % 2)
print(sorted_numbers)
クロージャの実装
def power_generator(exponent):
def inner(base):
return base ** exponent
return inner
square = power_generator(2)
cube = power_generator(3)
print(square(5)) # 25
print(cube(5)) # 125
ジェネレータ関数
def fibonacci_sequence(limit):
a, b = 0, 1
while a < limit:
yield a
a, b = b, a + b
for num in fibonacci_sequence(100):
print(num)
高階関数の応用
map関数の使用例
temperatures = [('東京', 25), ('大阪', 28), ('札幌', 20)]
celsius_to_f = lambda data: (data[0], (9/5)*data[1] + 32)
converted = list(map(celsius_to_f, temperatures))
print(converted)
filter関数の使用例
scores = [75, 82, 58, 91, 64, 53]
passing_scores = list(filter(lambda x: x >= 60, scores))
print(passing_scores)
reduce関数の使用例
from functools import reduce
product = reduce(lambda x, y: x * y, range(1, 6))
print(product) # 120 (5の階乗)