知っておきたいPythonの関数引数の付け方と使い方

Pythonの関数を呼び出す際に渡される引数は、様々な付け方と使い方があります。それらを知っておくと多種多様の関数やメソッドを作ることができます。

はじめに

ここではPython3の引数について掲載します。

これからPythonを勉強し始める人やPythonで何かを作ろうとしている人もPython3を用いることが多いかと思います。

Pythonの高機能な引数の使い方を知って役立ててください。

関数の引数

関数を呼び出す際、丸括弧の中に入れる数値や文字列のデータを引数といいます。

データとして変数を引数に入れて関数を呼び出すこともできます。

どのような種類のデータを引数として渡すかは定義された関数ごとに決められます。

その引数がいくつあるのかも関数ごとに決められます。

引数が複数ある場合、関数を定義する際に引数をカンマ区切りで複数指定します。

参考:公式サイト

Pythonはその引数が2種類あります。

キーワード引数

関数を呼び出す際に引数として渡す値の前に識別子が付いたものや、「**」に続けた辞書型の値として渡す引数です。

キーワード引数は呼び出す際に引数の順序を入れ替えて指定することができます。

例:
func(a=3, b=5)
func(**{'a':3, 'b':5})

関数で「**」に続けた値を定義した場合は、その引数は可変引数となり関数を呼び出す際に任意の個数の引数で呼び出すことができます。関数内でその引数は辞書型の変数となります。

例:
def func(**keywords):
    for kw in keywords:
        print(kw, ":", keywords[kw])
func(a=1, b=2, c=3, d=4)

参考:公式サイト

位置引数

キーワード引数以外の引数です。引数が複数ある場合は先頭が位置引数となります。「*」に続けたリスト、タプル、辞書を値として渡すことができます。(引数の数だけの文字列を渡すこともできます)

位置引数は呼び出す際に関数で定義された引数の順序どおり渡されます。

例:
func(3, 5)
func(*(3, 5))

関数で「*」に続けた値を定義した場合は、その引数は可変引数となり呼び出す際に任意の個数の引数で呼び出すことができます。関数内でその引数はタプル型の変数となります。

例:
def func(*arguments):
    for arg in arguments:
        print(arg)
func(1, 2, 3, 4)

引数の付け方と使い方

以下に引数の例文を用いて引数の付け方と使い方を記述します。

def kansu1(a):
    print(a)

kansu1(88)
kansu1(a=77)
#kansu1() # この場合はエラーとなる。引数aに初期値が設定「def kansu1(a=66):」されていればエラーにならない。

# 引数が複数ある場合は先頭が位置引数となる。
def kansu2(a, b):
    print(a + b)

kansu2(40, 60)
kansu2(40, b=60)
kansu2(a=40, b=60)
kansu2(b=40, a=60)
kansu2(*(40, 61))
kansu2(*[40, 62])
kansu2(*"えび")
kansu2(**{'a':40, 'b':63})
#kansu2(40) # この場合は2つ目の引数が無いエラーとなる。
#kansu2(a=40, 60) # この場合は2つ目の引数が位置引数として渡されているのでエラーとなる。
#kansu2() # この場合はエラーとなる。引数aに初期値が設定されていればエラーにならない。

def kansu3(a, b=11):
    print(a, b)

kansu3(33,22)
kansu3(33,b=22)
kansu3(33)
#kansu3() # この場合はエラーとなる。引数aに初期値が設定されていればエラーにならない。

# 可変引数
def kansu4(*args):
    print(args)

kansu4()
kansu4(55)
kansu4(22, 66)
#kansu4(args=33) # argsはキーワードではないのでエラーとなる。

def kansu44(*args):
    for arg in args:
        print(arg)
kansu44(1, 2, 3, 4)

def kansu5(*args, a):
    print(args, a)

kansu5(a=18)
kansu5(11, 22, a=18)
#kansu5(18) # この場合引数aが分からないエラーとなる。2つ目以降の引数はキーワード引数でなければならない。

def kansu6(**keywords):
    for kw in keywords:
        print(kw, ":", keywords[kw])
kansu6(a=1, b=2, c=3, d=4)

# 引数が「*」以降は、キーワード引数でしか呼べなくなる。
def kansu7(*, a=77):
    print(a)

kansu7(a=99)
#kansu7(99) # この場合キーワード引数でしか呼べなくなるのでエラーとなる。

def kansu77(a, b, *, c=77, d=88):
    print(a, b, c, d)

kansu77(11, 22, c=33)
#kansu77(11, 22, 33) # 3つ目の引数はキーワード引数でしか呼べなくなるのでエラーとなる。

「*」に続く辞書型や「」に続くタプル型の引数は、2つ以上定義することはできません。

def func(**keyowrds1, **keywords2): # エラーとなります。
def func(*arguments1, *arguments2): # エラーとなります。

使用例

公式サイトにあるような使用例を少し修正してまとめて掲載します。

例1

def func(hp, status="正常", action="移動", job="戦士"):
    print("キャラクターの行動は", action, "です。")
    print("現在の体力は", hp, "なので、", action, "できるか確認ください。")
    print("職業は、", job)
    print("状態は、", status)

func(1000)
print("-" * 5)
func("少し")
print("-" * 5)
func(hp=1000)
print("-" * 5)
func(hp=10000, action='回復')
print("-" * 5)
func(action="休憩", hp=999)
print("-" * 5)
func("満タン", "強化", "戦闘")
print("-" * 5)
func("半分", status="弱体")

#func() # 引数hpは必須となるのでエラーとなる。
#func(99, hp=100) # 第1引数が引数hpとなるのでエラーとなる。
#func(hp=10, '戦闘不能') # 
キャラクターの行動は 移動 です。
現在の体力は 1000 なので、 移動 できるか確認ください。
職業は、 戦士
状態は、 正常
-----
キャラクターの行動は 移動 です。
現在の体力は 少し なので、 移動 できるか確認ください。
職業は、 戦士
状態は、 正常
-----
キャラクターの行動は 移動 です。
現在の体力は 1000 なので、 移動 できるか確認ください。
職業は、 戦士
状態は、 正常
-----
キャラクターの行動は 回復 です。
現在の体力は 10000 なので、 回復 できるか確認ください。
職業は、 戦士
状態は、 正常
-----
キャラクターの行動は 休憩 です。
現在の体力は 999 なので、 休憩 できるか確認ください。
職業は、 戦士
状態は、 正常
-----
キャラクターの行動は 戦闘 です。
現在の体力は 満タン なので、 戦闘 できるか確認ください。
職業は、 戦士
状態は、 強化
-----
キャラクターの行動は 移動 です。
現在の体力は 半分 なので、 移動 できるか確認ください。
職業は、 戦士
状態は、 弱体

例2

def intro(name, *arguments, **keywords):
    print("あなたは", name, "さんを知っていますか?")
    print(name, "さんは、メジャーで大活躍している選手です。")
    for arg in arguments:
        print(arg)
    print("-" * 40)
    for kw in keywords:
        print(kw, ":", keywords[kw])

intro("大谷",
    "彼はピッチャーもバッターもできます。",
    "そして、どちらも成績がとてもいいです!",
    team="エンジェルス",
    position="TWO-WAY(二刀流)",
    years="24歳")
あなたは 大谷 さんを知っていますか?
大谷 さんは、メジャーで大活躍している選手です。
彼はピッチャーもバッターもできます。
そして、どちらも成績がとてもいいです!
----------------------------------------
team : エンジェルス
position : TWO-WAY(二刀流)
years : 24歳

例3

def ask(prompt, retries=4, reminder='Please try again!'):
    while True:
        ok = input(prompt)
        if ok in ('y', 'yes', 'yeah'):
            return True
        if ok in ('n', 'no', 'none'):
            return False
        retries = retries - 1
        if retries < 0:
            raise ValueError('invalid user response')
        print(reminder)

if ask('Do you really want to quit?'):
    print('Normal END')
else:
    print('Lets Do It Again!!')
Do you really want to quit?y
Normal END