Pythonの関数の引数の挙動が奇妙だったので、調べてみた。
今日久々にPHPやったら、幾度となく変数の$を書き忘れた。
キーワード引数
関数を実行する時の引数に「xxx=」がつくのを「キーワード引数」という。
関数を定義した際につけた引数名と同じ所に代入される。
funcA(a='arg1')
引数をタプルで受け取る
引数にアスタリスクをつけて指定すると、その引数がタプルで受け取れる。
引数はなしでもいい。
可変変数として重宝するらしい。
2つ目以降の引数として定義する事も出来る。
def funcB(*args):
引数をマップで受け取る
引数にアスタリスクを2つつけて指定すると、その引数がマップで受け取れる。
引数はなしでもいい。
可変変数として重宝するらしい。
2つ目以降の引数として定義する事も出来る。
def funcC(**args):
引数を全部受け取る
タプルもマップも。
def funcD(*args1, **args2):
ソース
凝縮した。
#!/usr/local/bin/python # set encoding=utf-8 def funcA(a, b=None, c=None, d=None): print 'a=%s, b=%s, c=%s, d=%s' % (a, b, c, d) def funcB(*args): print args def funcC(**args): print args def funcD(*args1, **args2): print args1 print args2 if __name__=='__main__': print '# funcA' funcA('arg1', 'arg2', 'arg3', 'arg4') funcA('arg1', 'arg2') funcA('arg1', c='arg2') funcA(d='arg1', a='arg2', c='arg3') # 同じ引数を2度定義出来ない 非キーワード引数は通常通り先頭から設定されていく # TypeError: funcA() got multiple values for keyword argument 'a' #funcA('arg1', a='arg2') # キーワード引数を1回でも指定したらそれ以降全部キーワード引数じゃないとだめ # SyntaxError: non-keyword arg after keyword arg #funcA(a='arg1', 'arg2') # 必要な引数が足らない # TypeError: funcA() takes at least 1 non-keyword argument (0 given) #funcA(b='arg1', c='arg2') print '# funcB' funcB('arg1', 'arg2', 'arg3') print '# funcC' funcC(a='arg1', b='arg2', c='arg3') print '# funcD' funcD() funcD('arg1', 'arg2', a='arg3', b='arg4')
実行結果
$ python args.py # funcA a=arg1, b=arg2, c=arg3, d=arg4 a=arg1, b=arg2, c=None, d=None a=arg1, b=None, c=arg2, d=None a=arg2, b=None, c=arg3, d=arg1 # funcB ('arg1', 'arg2', 'arg3') # funcC {'a': 'arg1', 'c': 'arg3', 'b': 'arg2'} # funcD () {} ('arg1', 'arg2') {'a': 'arg3', 'b': 'arg4'}