※実行環境 python3.6
########### 基本的なargs def argsfunc(*args): return args[0] + args[1] print(argsfunc(1,2)) # print(argsfunc(dog=1, cat=2)) 引数名を与えるとargsとして認識してくれない ########### 基本的なkwargs def kwargsfunc(**kwargs): return kwargs["a"] + kwargs["b"] print(kwargsfunc(a=1,b=2)) def multifunc(*args, **kwargs): return args[0] + args[1] + kwargs["a"] print(multifunc(1,2,a=3,b=4)) ########### デフォルト引数と併用するケース def multifunc2(first, second=0, *args, **kwargs): return first + second + args[0] + kwargs["a"] print(multifunc2(1,2,3,a=4)) #>10 # print(multifunc2(1, second=2, 3, a=3)) #ダメ。変数指定して渡すのは全て後に書かないといけない def multifunc2_2(first, *args, second=0, **kwargs): print("second: {}".format(second), end="| ") return first + second + args[0] + kwargs["a"] print(multifunc2_2(1, 3, second=2, a=3)) print(multifunc2_2(1, 3, 2, a=3)) #>7 #3番目の引数はsecond=2のつもりなのにargs[1]として認識されてしまう def multifunc3(first, second=0, **kwargs): return first + second + kwargs["a"] print(multifunc3(1,2,a=3)) print(multifunc3(1,second=2,a=3)) ############ キーワードが重複するケース # 定義だけではエラーにならない。呼び出そうとするとTypeError def duplicate_kwargs(first, second=0, **kwargs): return first + second + kwargs["first"] # print(duplicate_kwargs(1,2,first=3)) # >TypeError: duplicate_kwargs() got multiple values for argument 'first' ############ 可変長引数の重複はSyntaxError # def kwargs_duplicate(**kw1, **kw2): # return kw1["a"] + kw1["b"] + kw2["a2"] ############ 可変長引数が引数の前に来るのはSyntaxError # def kwargs_head(**kw1, second=0): # return first + second + kw1["a"] ############ argsを先に使うと、後ろの変数は全て変数指定して渡さないといけなくなる def args_head(*args, first, second=0): return first + args[0] + second # print(args_head(3,1,2)) #変数名を指定しない場合全部argsとして認識されるのでfirstが無いと怒られる print(args_head(3,first=1,second=2)) #OK