【Python】関数とはなんぞや?【defの使い方】

Python

この記事では、Pythonの関数について解説します。関数とは「処理をまとめて何度でも呼び出せるようにしたもの」です。なんども同じような処理をしたい場合は、関数に処理をまとめてしまった方が効率的です。

関数の基本的な使い方

関数の定義方法

Pythonの関数は、以下のようにdefを使って定義します。

def 関数名():
    なんらかの処理
関数の命名規則
  • 関数名には英小文字を使う
  • 単語のつなぎ目は_(アンダーバー)で区切る(get_data()みたいな感じ)
  • 予約語や組み込み関数と名前が被らないように注意する

関数の呼び出し

関数名の後に()を付けて記述することで、その関数を呼び出すことができます。

関数名()

変数に代入する

関数は変数に代入できます。その際は()を付けずに関数を呼び出します。

変数 = 関数名

変数に代入された関数は実行することもできます。

変数 = 関数名

変数()  # 代入された関数の実行

サンプル

以下のコードでは、func関数を定義して2通りのパターンで呼び出しています。

# func関数の定義
def func():
    print(1 + 2)


# func関数の呼び出し
func()

# f変数にfunc関数を代入
f = func
# f変数に代入されたfunc関数の呼び出し
f()

実行結果

3
3

呼び出し時に値を受け取る(引数)

引数を定義することで、呼び出し時に値を受け取ることができます。受け取った値は関数内で使用することができます。

定義方法

引数は以下のように定義します。

def 関数名(引数名):
    なんらかの処理

引数はいくつでも定義できます。

def 関数名(引数名1, 引数名2, ..., 引数名N):
    なんらかの処理

呼び出し方法

引数が定義された関数は、以下のように呼び出します。

関数名(引数に渡す値)

引数がいくつか定義されている場合は、以下のように呼び出します。

関数名(値1, 値2, ..., 値N)

サンプル

以下のコードでは、引数で受け取った値の和を出力しています。

def add(x, y):
    print(x + y)


add(1, 2)
add(351, 7842)

実行結果

3
8193

引数に初期値を定義する

引数に初期値を定義することができます。初期値を定義することで、関数呼び出し時に、その引数を省略することができます。

定義方法

以下のように定義します。

def 関数名(引数名=初期値):
    何かしらの処理

初期値を定義した引数は、通常の引数の前には定義することができません。以下のように定義するとエラーが発生します。

def 関数名(引数名=初期値, 通常の引数):
    何かしらの処理

サンプル

以下のコードは、add関数のy引数に初期値を定義しています。

# y引数に初期値2を定義
def add(x, y=2):
    print(x + y)


# y引数の省略
add(1)

# もちろん値を渡すことも可能
add(1, 5)

実行結果

3
6

引数を指定して値を渡す(キーワード呼び出し)

関数呼び出し時に、引数名を指定して値を渡すことで、特定の引数に値を渡すことができます。

使い方

呼び出し時に引数名を指定して値を渡します。

関数名(引数名=値)

サンプル

以下のコードでは、呼び出し時にy引数にのみ値を渡しています。

def add(x=1, y=2):
    print(x + y)


add(y=10)

実行結果

11

呼び出し元に値を返す(戻り値・返り値)

戻り値を定義することで、呼び出し元に値を返すことができます。

定義方法

戻り値はreturnを使って定義します。

def 関数名():
    return 返す値

returnはいくつでも記述可能です。if文で処理が分岐した時などに使います。

def 関数名():
    if 条件式:
        return Trueの時に返す値
    else:
        return Falseの時に返す値

関数は値を返したら終了する

関数はreturnが処理されたらそこで終了します。なのでreturnを記述する場所には注意しましょう。

def 関数名():
    print('関数開始')
    return
    print('関数終了')  # このprint関数は処理されません

サンプル

関数に戻り値を定義して、呼び出し元で受け取ってみます。

# 戻り値を返す関数
def add(x, y):
    return x + y

# result変数にadd関数の戻り値を代入
result = add(1, 2)
print(result)

# 関数にそのまま渡すこともできる
print(add(13, 54))

実行結果

3
67

複数の値を返す

1つのreturnで複数の値を返すことができます。

使い方

以下のように定義することで、複数の値をタプルとして返すことができます。

def 関数名():
    return 値1, 値2, ..., 値N

リストとして返したい場合は[]を使います。

def 関数名():
    return [値1, 値2, ..., 値N]

受け取り方法

普通に受け取ることでタプルとして受け取れます。

変数名 = 関数名()

アンパックして受け取ることもできます。アンパックして受け取るには、返される要素分の変数を用意して代入します。

変数1, 変数2 = 関数名()  # 返される要素が2つの場合
変数1, 変数2, 変数3 = 関数名()  # 返される要素が3つの場合

サンプル

関数で複数の値を返して、受け取った値を出力してみます。

# 複数の値を返す関数
def func():
    return 1, 2, 3


# タプルとして受け取る
nums = func()
print(nums)

# アンパックして受け取る
n1, n2, n3 = func()
print(n1, n2, n3)

実行結果

(1, 2, 3)
1 2 3

可変長引数

可変長引数を使うことで、1つの引数に複数のデータを渡すことができます。可変長引数には「タプルで受け取る方法」と「辞書として受け取る方法」があります。

タプルとして受け取る(*args)

引数名の前に*(アスタリスク)を付けることで、1つの引数で複数のデータを受け取る事ができ、関数内でタプルとして使うことができます。

定義方法

以下のように定義します。タプルな可変長引数にはargsという引数名がよく使われますが構文的な意味はありません。

def 関数名(*引数名):
    何かしらの処理

呼び出し方法

普通に複数の値を渡すだけで関数内でタプルとして扱えます。

関数名(値1, 値2, ..., 値N)

キーワード呼び出し

関数に可変長引数と通常の引数が定義されている場合、うまく引数を引き渡せない場合があります。例えば、通常の引数の前に可変長引数を定義した場合です。

def func(*args, arg):
    pass

# 全て可変長引数が受け取ってしまう
func(1, 2, 3, 4)

このような場合は、キーワード呼び出しをすることで正常に引き渡すことができます。

def func(*args, arg):
    pass

# args = 1, 2, 3  arg = 4 
func(1, 2, 3, arg=4)

サンプル

試しにタプルな可変長引数を受け取ってみて、関数内で使ってみましょう!

def func(*args):
    print(args)
    print(type(args))
    for arg in args:
        print(arg)


func(1, 2, 3)

実行結果

(1, 2, 3)
<class 'tuple'>
1
2
3

辞書として受け取る(**kwargs)

引数名の前に*(アスタリスク)を2つ付けることで、1つの引数で複数のデータを受け取り、関数内で辞書として使うことができます。

タプルな可変長引数と違い、必ず最後に定義しなければなりません。

定義方法

以下のように定義します。辞書な可変長引数にはkwargsという引数名がよく使われますが構文的な意味はありません。

def 関数名(**kwargs):
    何かしらの処理

呼び出し方法

以下のようにキーワード呼び出しすることで、辞書な可変長引数にkeyとvalueを引き渡すことができます。keyに数値を指定することはできません。

関数名(key1=value1, key2=value2, ..., keyN=valueN)

サンプル

試しに辞書な可変長引数を受け取ってみて、関数内で使ってみましょう!

def func(**kwargs):
    print(kwargs)
    print(type(kwargs))
    for key, value in kwargs.items():
        print(key, value)


func(one=1, two=2, three=3)

実行結果

{'one': 1, 'two': 2, 'three': 3}
<class 'dict'>
one 1
two 2
three 3

型アノテーション

引数と戻り値に型を指定することができます。ただし、指定した型と異なる型の値が渡されたとしても、エラーを発生させるような強制力はありません。

定義方法

引数の型アノテーションは、引数名と型名を:で区切って記述します。

def 関数名(引数名: 型名):
    何かしらの処理

# 引数に初期値が定義されている場合
def 関数名(引数名: 型名=初期値):
    何かしらの処理

戻り値の型アノテーションは->を使って記述します。

def 関数名() -> 型名:
    何かしらの処理

サンプル

試しに型アノテーションを定義した関数を使ってみましょう!

def func(val: int) -> float:
    return val / 2


print(func(187))

実行結果

93.5

使っているエディタによっては、型アノテーションで定義した型を、関数呼び出し時に表示してくれたりします。

※ Visual Studio Codeを使っています

キーワード呼び出しの強制

引数として*(アスタリスク)を定義することで、それ以降の引数にキーワード呼び出しを強制することができます。

定義方法

以下のように定義します。

def 関数名(引数名1, *, 引数名2):
    何かしらの処理

この場合、引数2は必ずキーワード呼び出しする必要があります。

サンプル

試しにキーワード呼び出しを強制してみます。

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


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

func(1, b=2, 3)  # エラー
func(1, 2, c=2)  # エラー
func(1, 2, 3)    # エラー

まとめ

この記事では、Pythonの関数について解説しました。

とても覚えることが多かったと思いますが、関数はどのプログラミング言語にとっても大事な概念となっています。少しずつで良いので身につけていきましょう!

今回のおさらい

以下の関数は、今回の記事の内容をほぼ全て盛り込んだ関数です。どこに何が使われているか確認しておさらいしてみてください。

def func(*args, arg: int=1, **kwargs) -> str: 
    print(args)
    print(arg)
    print(kwargs)
    return '戻り値1', '戻り値2'

val1, val2 = func(1, 2, 3, key1='value1', key2='value2')

print(val1, val2)

実行結果

(1, 2, 3)
1
{'key1': 'value1', 'key2': 'value2'}
戻り値1 戻り値2

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ

タイトルとURLをコピーしました