キーワード引数

入門Python3 4.7.2


関数に引数を渡す時に、変数名を指定し任意の順番で引数を渡すことができます。

def foo(a,b,c):
    print(a,b,c)

foo(1,2,3)       # 通常の引数
foo(a=1,b=2,c=3) # キーワード引数
foo(b=2,a=1,c=3) # キーワード引数なら順番を変えても同じ結果になる
foo(1,b=2,c=3)   # 通常の引数とキーワードを混ぜて使うことも可能
$ py main.py
1 2 3
1 2 3
1 2 3
1 2 3

これはC#でいうところの名前付き引数と同じですね。

便利な機能なので適材適所使っていきたいと思います。

オプション引数とその注意点

入門Python3 4.7.3

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

foo(1,2)
foo(1)   # 引数の省略
$ py main.py
1 2
1 10

この用に引数を省略することができます。C#等にもありますね。

ただし一つ注意点があります。

Pythonのオプション引数は関数の実行時ではなく定義時に定義されるので例えば以下のような処理を書くと痛い目にあいます。

def foo(ary = []):
    ary.append(1)
    return ary

print(foo())
print(foo())
print(foo())
$ py main.py
[1]
[1, 1]
[1, 1, 1]

このようにfooを呼び出すたびに増えていきます。この挙動はちょっと直感に反してる気もしますね・・・。

これを実行時に初期化するには例えば以下のようにする必要があります。

def foo(ary = None):
    if ary is None: ary = [] # 毎回ここで初期化する
    ary.append(1)
    return ary

print(foo())
print(foo())
print(foo())
$ py main.py
[1]
[1]
[1]

これで想定通りに動きましたね。

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

入門Python3 4.7.4


関数を定義する時に引数の前に*をつけると引数をタプル化して受け取れるようになります。

def foo(*args):
    print(args)

foo()
foo("a","b","c")
$ py main.py
()
('a', 'b', 'c')

これはCの可変長引数のような、もしくはC#のparamsキーワードのような機能ですね。

また通常の引数と混ぜて使うことも出来ます、ただしその場合タプル化できるのは最後の変数のみです。

def foo(a,b,c,*args):
    print(a,b,c)
    print(args)

foo(1,2,3,"a","b","c")
$ py main.py
1 2 3
('a', 'b', 'c')

ちなみにタプル化する変数名はPythonの慣習的にargsと名付けるのが一般的のようです。