3-3

関数

関数の定義

def キーワードで関数を定義します。関数は再利用可能なコードのブロックです。

python
def greet(name):    """挨拶メッセージを返す"""    return f"こんにちは、{name}さん!"greet("太郎")    # "こんにちは、太郎さん!"greet("花子")    # "こんにちは、花子さん!"

ドキュメント文字列(docstring)

関数の直後に文字列を書くと、関数の説明(docstring)になります。

python
def add(a, b):    """2つの数の和を返す。        Args:        a: 1つ目の数        b: 2つ目の数        Returns:        a と b の和    """    return a + bhelp(add)  # docstring が表示される

引数

Pythonの関数にはさまざまな引数の渡し方があります。

関数の引数の種類位置引数f(1, 2)順番で対応🔹 必須デフォルト引数def f(x=0)省略可能🔹 任意*argsf(1, 2, 3)任意の数の引数🔹 タプルで受取**kwargsf(a=1, b=2)任意のキーワード🔹 辞書で受取

デフォルト引数

デフォルト引数を使うと、引数を省略したときの値を指定できます。

python
def power(base, exponent=2):    """base の exponent 乗を返す"""    return base ** exponentpower(3)       # 9  (3^2)power(3, 3)    # 27 (3^3)power(2, 10)   # 1024

注意: デフォルト引数は必ず非デフォルト引数の後に書きます。

キーワード引数

キーワード引数を使うと、引数名を指定して渡せます。順番を変えてもOKです。

python
def describe(name, age, city):    return f"{name}さんは{age}歳で、{city}に住んでいます。"# 通常の呼び出しdescribe("太郎", 25, "東京")# キーワード引数を使った呼び出し(順番を変えてもOK)describe(age=25, city="東京", name="太郎")# 混在も可能(位置引数を先に)describe("太郎", city="東京", age=25)

可変長引数(*args)

*args を使うと、任意の数の位置引数を受け取れます。

python
def sum_all(*args):    """全ての引数の合計を返す"""    return sum(args)sum_all(1, 2, 3)           # 6sum_all(1, 2, 3, 4, 5)     # 15sum_all()                   # 0

可変長キーワード引数(**kwargs)

**kwargs を使うと、任意の数のキーワード引数を辞書として受け取れます。

python
def print_info(**kwargs):    for key, value in kwargs.items():        print(f"{key}: {value}")print_info(name="太郎", age=25, city="東京")# name: 太郎# age: 25# city: 東京

返値

関数は return で値を返します。

複数の返値

タプルを使って複数の値を返せます。

python
def min_max(lst):    """リストの最小値と最大値をタプルで返す"""    return min(lst), max(lst)lo, hi = min_max([3, 1, 4, 1, 5, 9, 2, 6])lo   # 1hi   # 9

return なしの関数

return がない(または return だけの)関数は None を返します。

python
def say_hello(name):    print(f"Hello, {name}!")  # printするだけ    # returnなし → Noneを返すresult = say_hello("太郎")  # Hello, 太郎!print(result)               # None

変数とスコープ

ローカルスコープとグローバルスコープ

python
x = 10   # グローバル変数def foo():    x = 20   # ローカル変数(グローバルの x とは別物)    return xfoo()   # 20x       # 10(グローバルは変わらない)

global文

関数の中でグローバル変数を変更したい場合は global を使います(できれば避けるべき)。

python
count = 0def increment():    global count    count += 1increment()increment()count   # 2

関数の中の関数(クロージャ)

python
def make_adder(n):    """n を加算する関数を返す"""    def adder(x):        return x + n   # 外側のスコープの n を参照    return adderadd5 = make_adder(5)add10 = make_adder(10)add5(3)    # 8add10(3)   # 13

練習: 関数の合成

標準

2つの関数 fg を受け取り、f(g(x)) を計算する関数 compose(f, g) を定義してください。

練習: メモ化

発展

再帰的なフィボナッチ数列の計算をメモ化(結果をキャッシュ)して高速化してください。