note.nkmk.me

Pythonで関数を定義・呼び出し(def, return)

Date: 2018-09-06 / tags: Python

Pythonにおいて関数の定義と呼び出し(実行)を行う方法について説明する。

  • Pythonにおける関数の定義・呼び出しの基本
  • 引数の使い方
    • 位置引数: 位置で指定
    • キーワード引数: キーワードで指定
    • デフォルト引数: デフォルト値を設定、呼び出し時に省略可能
    • 可変長引数: 任意の数の引数を指定
    • リストや辞書を展開して指定
  • 戻り値(返り値)を指定: return
    • 複数の戻り値を指定

そのほか、無名関数(ラムダ式)、docstring(ドキュメンテーション文字列)、関数アノテーションについては以下の記事を参照。

スポンサーリンク

Pythonにおける関数の定義・呼び出しの基本

Pythonにおいて、関数は以下のようにdef文のブロックで定義する。

def 関数名():
    処理

呼び出すときは関数名をそのまま記述する。

関数名()

シンプルな関数の定義と呼び出しの例は以下の通り。定義した処理が実行される。

def hello():
    print('Hello')

hello()
# Hello

引数や戻り値を指定する基本形は以下の通り。

関数定義。

def 関数名(引数1, 引数2...):
    処理
    return 戻り値

呼び出し。

関数名(引数1, 引数2...)

実際の例。

def add(a, b):
    return a + b

x = add(3, 4)
print(x)
# 7

引数および戻り値についての詳細は以下で説明する。

なお、Pythonのコーディング規約PEP8ではdefブロックの前後は2行ずつ空けることが推奨されているが、サンプルコードでは便宜上1行しか空けていない。

引数の使い方

位置引数: 位置で指定

引数は関数名()のカッコ内にカンマ区切りで指定して定義する。

def print_add(a, b, c):
    print('a = ', a)
    print('b = ', b)
    print('c = ', c)
    print('a + b + c = ', a + b + c)

呼び出し時は定義した順番に値を指定する。

print_add(1, 10, 100)
# a =  1
# b =  10
# c =  100
# a + b + c =  111

呼び出し時に指定する引数が定義した引数より多かったり少なかったりするとエラー(TypeError)となる。

# print_add(1)
# TypeError: print_add() missing 2 required positional arguments: 'b' and 'c'

# print_add(1, 10, 100, 1000)
# TypeError: print_add() takes 3 positional arguments but 4 were given

キーワード引数: キーワードで指定

呼び出し時に引数名=値として値を指定することが可能。この場合は任意の順番で指定できる。

print_add(b=10, c=100, a=1)
# a =  1
# b =  10
# c =  100
# a + b + c =  111

すべての引数をキーワードで指定する必要はなく、位置で指定したあとキーワードで指定できる。ただし、キーワードで指定した以降の引数はすべてキーワードで指定しないとエラー(SyntaxError)となる。

print_add(1, c=100, b=10)
# a =  1
# b =  10
# c =  100
# a + b + c =  111

# print_add(a=1, 10, 100)
# SyntaxError: positional argument follows keyword argument

デフォルト引数: デフォルト値を設定、呼び出し時に省略可能

関数定義時に引数名=デフォルト値とすることで引数のデフォルト値を設定できる。

デフォルト値を設定しておくと呼び出し時に引数の指定を省略可能。

def print_add_default(a, b, c=100):
    print('a = ', a)
    print('b = ', b)
    print('c = ', c)
    print('a + b + c = ', a + b + c)

print_add_default(1, 10)
# a =  1
# b =  10
# c =  100
# a + b + c =  111

別の値を指定すれば当然その値が使われる。

print_add_default(1, 10, 200)
# a =  1
# b =  10
# c =  200
# a + b + c =  211

関数定義時にデフォルト引数を通常の引数(デフォルト値を指定していない引数)の前に置くとエラー(SyntaxError)になる。

# def print_add_default(a=1, b, c=100):
#     ...
# SyntaxError: non-default argument follows default argument

リストや辞書をデフォルト値とした場合は関数呼び出し時と常に同じオブジェクトが使われるので注意が必要。詳細は以下の記事を参照。

可変長引数: 任意の数の引数を指定

関数定義時に引数名に***をつけると可変長引数となり、呼び出し時に任意の数の引数を指定することができる。

慣例として*args, **kwargsという名前が使われることが多いが、***が頭についていれば他の名前でも問題ない。

*args: 複数の引数をタプルとして受け取る

*をつけると複数の引数がタプルとして受け取られる。

def func_args(*args):
    print(args)

func_args(1, 10)
# (1, 10)

func_args(1, 10, 100, 1000)
# (1, 10, 100, 1000)

**kwargs: 複数のキーワード引数を辞書として受け取る

**をつけると複数のキーワード引数が辞書として受け取られる。

def func_kwargs(**kwargs):
    print(kwargs)

func_kwargs(a=1, b=10)
# {'a': 1, 'b': 10}

func_kwargs(c=1, b=10, d=1000, a=100)
# {'c': 1, 'b': 10, 'd': 1000, 'a': 100}

位置引数との組み合わせや、*args**kwargsとの組み合わせ時は順番に注意が必要。詳細は以下の記事を参照。

リストや辞書を展開して指定

リストやタプルを展開して指定

関数呼び出し時にリストやタプルに*をつけて指定すると、要素が展開され順番に位置引数として指定される。要素数と引数の数が一致していないとエラー(TypeError)になる。

def print_add(a, b, c):
    print('a = ', a)
    print('b = ', b)
    print('c = ', c)
    print('a + b + c = ', a + b + c)

l = [1, 10, 100]

print_add(*l)
# a =  1
# b =  10
# c =  100
# a + b + c =  111

l = [1, 10]

# print_add(*l)
# TypeError: print_add() missing 1 required positional argument: 'c'

辞書を展開して指定

関数呼び出し時に辞書に**をつけて指定すると、要素のキーが引数名、値が引数の値として展開されてキーワード引数として指定される。引数名と一致するキーが無かったり、一致しないキーがあったりするとエラー(TypeError)になる。

d = {'a': 1, 'b': 10, 'c': 100}

print_add(**d)
# a =  1
# b =  10
# c =  100
# a + b + c =  111

d = {'a': 1, 'b': 10, 'x': 100}

# print_add(**d)
# TypeError: print_add() got an unexpected keyword argument 'x'

デフォルト引数や可変長引数との組み合わせ時の注意については以下の記事を参照。

戻り値(返り値)を指定: return

関数の戻り値(返り値)はreturn文で指定する。

def func_return(a, b):
    return a + b

x = func_return(3, 4)

print(x)
print(type(x))
# 7
# <class 'int'>

戻り値の型は引数および関数の処理に依存する。

x = func_return(0.3, 0.4)

print(x)
print(type(x))
# 0.7
# <class 'float'>

複数の戻り値を指定

return文のあとに複数の値をカンマ区切りで指定するとタプルが返される。

def func_return_multi(a, b):
    return a + b, a * b, a / b

x = func_return_multi(3, 4)

print(x)
print(type(x))
# (7, 12, 0.75)
# <class 'tuple'>

それぞれの値をアンパックして別々の変数に代入することも可能。

x, y, z = func_return_multi(3, 4)

print(x)
print(y)
print(z)
# 7
# 12
# 0.75

[]で囲むとタプルではなくリストが返される。

def func_return_multi_list(a, b):
    return [a + b, a * b, a / b]

x = func_return_multi_list(3, 4)

print(x)
print(type(x))
# [7, 12, 0.75]
# <class 'list'>

x, y, z = func_return_multi_list(3, 4)

print(x)
print(y)
print(z)
# 7
# 12
# 0.75
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事