便利なキーワード引数他、関数定義

先日のエントリで書いていたcsvjsonに変換するプログラムでもよく理解しないまま使っていたのですがPythonの関数にはキーワード引数というのがあり、とても便利です。
キーワード引数は呼び出し時に使うもので定義は普通に行います。

def test(x = 2, y = 3, z = 5): #デフォルト値をつけて関数定義
  return (x + y) * z

print test() #25

print test(3,5,7) #56

呼び出し時に実引数がどの仮引数に対応するかを書いて呼び出すのがキーワード引数です。関数のデフォルト値の書き方と似ていますがデフォルト値が設定されているかどうかとは関係ありません。

def test(x = 2, y = 3, z = 5):
  return (x + y) * z

print test(z = 7) #35 x,yはデフォルト値が使われる

print test(z = 3, y = 2 , x = 11) #39 キーワード引数は引数の順番を自由に指定できる

これは引数の順番を覚えておかなくていいので便利です。これがライブラリの使い勝手を向上させていますね。注意点としては次のようにキーワード引数の後に普通の引数を書くことはできません。

#まちがい
print test(y = 5, 7)

どの引数を指定しているのかが分からないので当然といえば当然ですね。
普通の引数の後にキーワード引数が来るのは大丈夫です。

print test(5, z = 7) #56

関数の引数の数を可変にするには*を付けた引数を使います。この引数はリストになっています。

def test2(*args):
  total = 0
  for i in args:
    total += i
    
  return total

print test2(1,2,3,4,5,6,7,8,9) #45

print test2(5,7,1) #13

**を付けた引数は可変数のキーワード引数を辞書として受け取ります。

def test3(**args):
  for key in args.keys():
    print key , args[key]
    
test3(a = 5, b = "abc" , xyz = 7)
#a 5
#xyz 7
#b abc

これらを組み合わせて使う場合は関数定義時に、通常の引数→*引数→**引数の順番に書かなければなりません。

def test4(x = 5,*args,**argsDict):
  for i in args:
    x += i
  
  for key in argsDict.keys():
    x += argsDict[key]
    
  return x

print test4(100,1,2,3,4,5,6,7,8,9,a = 1000,b = 2000) #3145

組み合わせが多くなると複雑になりすぎますね(^_^;)