関数の定義
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の関数にはさまざまな引数の渡し方があります。
デフォルト引数
デフォルト引数を使うと、引数を省略したときの値を指定できます。
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 # 9return なしの関数
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つの関数 f と g を受け取り、f(g(x)) を計算する関数 compose(f, g) を定義してください。
練習: メモ化
再帰的なフィボナッチ数列の計算をメモ化(結果をキャッシュ)して高速化してください。