Python入門【関数の定義方法】

こんにちは、ミナトです。

本連載の中でもいくつかのPythonの組み込み関数を利用してきました。しかし、「独自の関数を定義したい」という場合もあるでしょう。

Python入門

2021年6月18日

このような場合はdef文を利用してあなたのオリジナル関数を定義することができます。

関数を定義しておくことで、プログラムを開発する際に頻繁に実行される共通の処理を部品として用意しておいて、後から呼び出すことでより効率的にプログラミングできます。

今回はPythonにおける関数の定義方法をご紹介します。

オリジナルの関数を定義するにはどうすればいいの?
Pythonではdef文で関数が定義できるで!

defはdefinitionの略で定義するという意味やで!

今回は関数の定義方法について分かりやすく解説するな😆

以下のような方を対象としています
  • Pythonで独自の関数を定義したい
  • Pythonで関数の使い方を知りたい
  • Pythonでプログラミングを学びたい

関数の定義方法

関数の定義の基本

事前に関数を定義しておくことで、プログラムを開発する際に、頻繁に実行される共通の処理を部品として用意して後から何度も再利用できるようになります。

関数を定義はdef文を利用して以下のように記述します。

関数の定義

def 関数名():
 実行する処理ブロック

また関数を呼び出すときは、以下のように関数名()として呼び出します。
関数の呼び出しは関数の定義より後に記述する必要があります。

# 関数の定義
def func1():
    print('処理を実行します')


# 関数の呼び出し
func1()


## 出力
処理を実行します

戻り値の使い方

関数が処理した結果を呼び出しもとに戻すにはreturnを利用します。
また、この返される値を戻り値または返り値と呼びます。

戻り値の定義

def 関数名():
 実行する処理ブロック
 return 戻り値

def func1():
    r = 1 + 1
    return r


r = func1()
print(r)

## 出力
2

引数の使い方

関数を呼び出す際に呼び出し元から値を渡すことができます。この値のことを引数と呼びます。引数は任意の数、定義できます。

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

引数の定義

def 関数名(引数1, 引数2 ・・・):
 実行する処理ブロック
 return 戻り値

以下の例では引数1(arg1)に10を引数2(arg2)に5を渡して実行しています。結果的にarg1とarg2が足し合わされ15が戻り値として呼び出しもとに返されます。

def func1(arg1, arg2):
    r = arg1 + arg2
    return r


r = func1(10, 5)
print(r)

## 出力
15

また、引数に渡しているarg1、arg2はローカル変数といい関数内でのみ利用でいる変数です。
関数の外で呼び出そうとするとエラーとなります。

NameError: name 'arg1' is not defined

キーワード引数の使い方

位置で指定すると引数の順番を間違えたりすることがあると思います。そのような場合、引数にキーワードを用いることで分かりやすく実行することもできます。

キーワード引数を用いて実行した場合、以下のように引数の順番が定義と異なっても正しく実行されます。

def func1(main, drink, dessert):
   print(f'メイン:{main}')
   print(f'ドリンク:{drink}')
   print(f'デザート:{dessert}')


print('**位置引数**')
func1('ステーキ', 'ワイン', 'ケーキ')
print('**キーワード引数**')
func1(drink='ワイン', main='ステーキ', dessert='ワイン')

## 出力
**位置引数**
メイン:ステーキ
ドリンク:ワイン
デザート:ケーキ
**キーワード引数**
メイン:ステーキ
ドリンク:ワイン
デザート:ワイン

また位置引数(通常の引数)とキーワード引数を混ぜて呼び出すことも可能です。

func1('焼肉', drink='ビール', dessert='杏仁豆腐')

しかし、キーワード引数の後に位置引数を利用することはできません。
位置引数とキーワード引数を混ぜて使う場合は順序に気をつけてください。

func1(main='焼肉', 'ビール', 'アイス')

## 出力
SyntaxError: positional argument follows keyword argument

デフォルト引数の使い方

事前に引数の初期値をセットしておくことができます。この引数をデフォルト引数と呼びます。
引数をセットしなかった場合、デフォルト引数が利用されます。

def func1(main='ステーキ', drink='赤ワイン', dessert='本日のケーキ'):
   print(f'メイン:{main}')
   print(f'ドリンク:{drink}')
   print(f'デザート:{dessert}')


func1()


## 出力
メイン:ステーキ
ドリンク:赤ワイン
デザート:本日のケーキ

引数を渡した場合は、渡した引数で上書きされます。

func1('真鯛のポワレ', drink='ビール')


## 出力
メイン:真鯛のポワレ
ドリンク:ビール
デザート:本日のケーキ

可変長引数の使い方

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

引数の数を固定したくない場合に利用することができます。

可変長引数をタプルとして受け取る

引数名に*をつけた場合は、関数内で引数をタプルとして受け取ることができます。

可変長引数の定義

def 関数名(引数, *可変長引数):
 実行する処理ブロック

以下の例では可変長引数として定義したwordsをループ処理で出力しています。

def func1(*words):
    print(type(words))
    for w in words:
       print(w)


func1('Hello!', 'Taro', 'Jiro')


## 出力
<class 'tuple'>
Hello!
Taro
Jiro

また、通常の引数と組み合わせて利用することも可能です。

def func1(word, *words):
    print(word)
    print('** 可変長引数 **')
    for w in words:
       print(w)


func1('Hello!', 'Taro', 'Jiro')


## 出力
Hello!
** 可変長引数 **
Taro
Jiro

可変長引数をディクショナリ(辞書)として受け取る

引数名に**をつけた場合は、関数内で引数をディクショナリとして受け取ることができます。

可変長引数の定義

def 関数名(引数, **可変長引数):
 実行する処理ブロック

以下の例では可変長引数として定義したkwargsをループ処理で出力しています。

def func1(**kwargs):
    for k, v in kwargs.items():
        print(k, v)


func1(main='ステーキ', drink='ビール', dessert='ケーキ')


## 出力
main ステーキ
drink ビール
dessert ケーキ

また、通常の引数やタプルの可変長引数と組み合わせて利用することも可能です。

可変長引数の定義

def 関数名(引数, *可変長引数, **可変長引数):
 実行する処理ブロック

def func1(arg, *args, **kwargs):
    print(arg)

    for i in args:
        print(i)

    for k, v in kwargs.items():
        print(k, v)


func1('山田は', 'レストランで', '以下の食事をしました。', main='ステーキ', drink='ビール', dessert='ケーキ')

## 出力
山田は
レストランで
以下の食事をしました。
main ステーキ
drink ビール
dessert ケーキ

まとめ

関数を定義することで再利用性が高まり、効率的にプログラムを開発できます。
以下Pythonの関数定義の特徴です。

関数定義の特徴
  • 関数の定義にはdef文を使う
  • 関数には任意の数の引数を定義することができる。
  • returnで戻り値を定義し、呼び出しもとにデータを返すことができる
  • 変数名に*または**をつけることで可変長引数として利用できる

関数を定義しておくことで、プログラムを開発する際に頻繁に実行される共通の処理を部品として用意しておいて、後から呼び出すことでより効率的にプログラミングできます。

関数の定義方法はしっかり覚えておきましょう。

最後まで読んでいただき、ありがとうございます。

この記事が、「面白いな」、「勉強になったな」という方は、ぜひ、SNSでシェアしていただけると嬉しいです。