Pythonの関数の引数の挙動について調べてみた

Pythonの関数の引数の挙動が奇妙だったので、調べてみた。
今日久々にPHPやったら、幾度となく変数の$を書き忘れた。
 

デフォルト値

PHPとかと同じでデフォルト値を指定出来る。

def funcA(a=None):

 

キーワード引数

関数を実行する時の引数に「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'}