Pythonのdefで関数を作る方法: 引数(位置引数、キーワード引数、デフォルト引数)や関数の返り値について

258, 2021-05-27

目次

Pythonのdefで関数を作る方法

Pythonではdefというキーワードを使うと関数を作ることができます。
この記事ではdefを使って関数を作る方法を解説します。

結論から言うとdefを使った関数は↓のように作ります。

def func(a, b):
    return a * b

result = func(2, 3)
print(result)
# 6

defを使った関数について、具体的に↓を見ていきます。

  • defによる関数の定義方法

  • 関数の必要性

  • 関数の引数とは?

  • 関数の位置引数

  • 関数のキーワード引数

  • 関数のデフォルト引数

  • 関数の可変長位置引数

  • 関数の可変長キーワード引数

  • 関数の位置専用引数

  • 関数のキーワード専用引数

  • 関数の返り値

  • 関数の複数の返り値

defによる関数の定義方法

Pythonではdefキーワードを使うと関数を定義できます。
↓のように定義します。

def 関数名(引数):
    処理内容

関数名には英数字アンダーバーのほか日本語も使えます。
helloworldという関数を定義する場合、コードにすると↓のようになります。

def helloworld():
    print('Hello, World!')

定義した関数はそのスコープ内で呼び出すことができます。
↓はhelloworld関数を呼び出している所です。

helloworld()
# Hello, World!

関数の必要性

ところでなぜ関数は必要とされるのでしょうか?
コードを書いていると、コードの量が増えていきます。
書きっぱなしにしていると管理が出来なくなるので、コードを関数と言う単位で分割します。
そのため関数が必要とされています。

関数でコードを分割すれば、再利用性が高まり、管理もしやすくなります。
関数を上手く使うことでソフトウェアの品質を上げることが可能です。
C言語などはクラスが無くメソッドもありませんが、関数はあります。
そしてC言語はいろいろなソフトウェアを生み出しています。
それも関数のパワーと言えます。

関数は力持ち

関数の引数とは?

関数の引数(ひきすう)とは関数の外部から関数の内部に渡せる入力のことを言います。
関数の引数はカッコの中に複数書くことができます。

def func(a, b):
    return a * b

↑の場合、カッコの中に書かれたabが関数の引数です。
引数とはただの変数です。
関数内ではこの引数にアクセスすることができます。

専門的な用語ではこの関数の定義側の引数のことを仮引数(かりひきすう)と言います。
いっぽう関数の呼び出し側に指定する引数のことを実引数(じつひきすう)と言います。

result = func(2, 3)
print(result)
# 6

関数を呼び出す時にカッコをつけますが、このカッコの中に値を指定することで関数内の引数にデータを渡すことができます。
↑は引数a2という値、引数b3という値を渡しています。

関数の位置引数

関数の引数には、引数の渡し方によって呼び方が変わるものがあります。
その1つが位置引数です。

def func(a, b):
    print(a, b)

func(1, 2)
# 1 2

↑の場合、括弧の中に書かれたabが引数です。
この引数に、関数の呼び出し時にそれぞれ12を渡すと、関数に引数を渡すことができます。
このとき12を位置引数と呼びます。

位置引数はキーワード引数と区別されて使われます。
位置引数もキーワード引数も分類的には実引数の一種になります。

関数のキーワード引数

関数の呼び出し時の引数に=でキーと値を指定すると、それはキーワード引数になります。
キーには引数名、値には引数の値を指定します。

キー = 値
def func(a, b):
    print(a, b)

func(a=10, b=20)
# 10 20

↑のコードの場合、abが関数の引数です。
関数の呼び出し時にa=10b=20と指定していますが、これがキーワード引数になります。
これはa10を代入し、bには20を代入するという意味になります。

キーワード引数は呼び出し側の引数の順番が違っていても機能します。
キーワードで引数に値を指定しているので、順番が違っていてもPythonが正しく処理できるからです。

func(b=20, a=10)
# 10 20

関数のデフォルト引数

関数の定義側の引数(仮引数)にはデフォルト引数を指定することができます。
デフォルト引数は↓のように指定します。

引数名 = デフォルト値
def func(a=1, b=2):
    print(a, b)

func()
# 1 2

func(10)
# 10 2

func(10, 20)
# 10 20

デフォルト値を指定している引数は値を指定されなかった場合はそのデフォルト値を使います。
↑の場合func()という呼び出しでは実引数は何も指定していませんが、aには1, bには2というデフォルト値が使われます。
func(10)ではa10を指定していますが、bは指定していないのでデフォルト値の2が使われます。

デフォルト引数以降に普通の引数を定義することはできません。
たとえば↓のような定義はエラーになります。

def func(a=10, b):
    print(a, b)

#        def func(a=10, b):
#             ^
# SyntaxError: non-default argument follows default argument

関数の可変長位置引数

可変長の引数を取りたい場合は引数に*を1つ付けます。

def func(*args):
    print(args)

func(1)
# (1,)

func(1, 2)
# (1, 2)

func(1, 2, 3)
# (1, 2, 3)

↑の場合、引数argsはタプルになります。
関数呼び出し側の位置引数に応じてタプルの中身も変化します。

関数の可変長キーワード引数

可変長のキーワード引数を取りたい場合は引数に**を1つ付けます。

def func(**kwargs):
    print(kwargs)

func(a=1, b=2)
# {'a': 1, 'b': 2}

↑の場合、kwargsは辞書になります。
関数の呼び出し時にキーワード引数を指定した場合、辞書の中身が変化します。

関数の位置専用引数

関数の定義側の引数(仮引数)に/を書くと、これ以前の引数が位置専用引数になります。

def func(a, b, /, c):
    print(a, b, c)

func(1, 2, 3)
# 1 2 3

func(1, 2, c=3)
# 1 2 3

try:
    func(a=1, b=2, c=3)
except TypeError as e:
    print(e)
    # func() got some positional-only arguments passed as keyword arguments: 'a, b'

位置専用引数とはつまり、関数の呼び出し側の引数(実引数)の指定が、位置引数のみになるということです。
↑の場合、a=1, b=2とキーワード引数で指定すると、例外TypeErrorが発生します。

関数のキーワード専用引数

関数の定義側の引数(仮引数)に*を書くと、これ以降の引数がキーワード専用引数になります。

def func(a, b, *, c):
    print(a, b, c)

func(1, 2, c=3)
# 1 2 3

func(a=1, b=2, c=3)
# 1 2 3

try:
    func(1, 2, 3)
except TypeError as e:
    print(e)
    # func() takes 2 positional arguments but 3 were given

キーワード専用引数とは、関数の呼び出し側の引数(実引数)の指定がキーワードのみになるということです。
↑の場合func()の第3引数(c)に位置引数を指定すると例外TypeErrorが送出されます。

関数の返り値

関数内でreturnを書くと、その関数を終了させるのと同時に関数の呼び出し側に値を返すことができます。

def func():
    return 1

print(func())
# 1

↑の場合、return 11returnで関数の呼び出し側に返される値です。
returnを書かない場合は常にNoneが返されます。

def func():
    pass

print(func())
# None

関数の複数の返り値

returnには複数の値を指定することができます。

def func():
    return 1, 2

print(func())
# (1, 2)

a, b = func()
print(a, b)
# 1 2

複数の値を返す関数を単一の変数で受けると、それはタプルになります。
タプルなのでa, b = func()のように複数の変数に展開することができます。

おわりに

今回はPythonのdefを使って関数を定義する方法を見てみました。
defは機能が多いのでゆっくりマイペースに覚えるのが吉かもしれません。

機能が多くて覚えるの大変

使ってると覚えちゃうけどね

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。