Python キーワード引数の辞書化

Python学習【365日チャレンジ!】52日目のマスターU(@Udemy11)です。

お米ってほんとおいしいですよね。

炊きたての御飯を食べていると、ほんと日本人で良かった〜!と幸せに感じます。
炊きたての湯気が立つご飯に卵を乗せて食べる卵かけごはんはたまりませんよね!

卵かけごはん

ただね〜、炭水化物って太るんですよね。

最近体重が増加気味なので、食べすぎに気をつけていこうと思います。

それでは、今日もPython学習をすすめていきましょう!

昨日の復習

昨日は、位置引数のタプル化を学習しました。
引数がいくつあるかわからないときやたくさん引数を指定するときは、*(アスタリスク)をつけた引数argsを指定することで、引数をタプル化してくれました。

def word_func(*args):
    for i in args:
        print(i)
 
word_func('Hello', 'Mike', 'How', 'Are', 'You')

出力結果

Hello
Mike
How
Are
You

最初の位置引数だけは固定して、残りをまとめることも可能でした。

def word_func(word, *args):
    print('word:', word)
    for i in args:
        print(i)
 
word_func('Hi', 'How', 'Are', 'You')

出力結果

word: Hi
How
Are
You

タプルの変数を指定して、タプルをアンパッキング化したあと、関数に入れてタプル化するという使い方もできました。
この使い方は、今日学習するキーワード引数を辞書化するときによく使われる使い方ということなので、今回は、復習も含めてしっかりと頭にいれるようにしましょう。

キーワード引数の辞書化

キーワード引数は、引数にキーワードを指定しますが、位置引数のタプル化同様に、たくさんあるキーワード引数をまとめることができるのが、キーワード引数の辞書化です。

辞書型は、こちらの記事で学習したように、keyとvalueという一対になった値を扱いました。

キーワードと引数を一緒に扱うには、辞書型が最も適しているというわけですね。

def dic_func(**kwargs):
    print(kwargs)
    for i, j in kwargs.items():
        print(i, j)
 	
dic_func(food='fish', drink='coffee')

出力結果

{'food': 'fish', 'drink': 'coffee'}
food fish
drink coffee

キーワード引数を辞書化する変数には【kwargs】という名前がもっとも使用されていますが、**のあとに付ける名前は何でもかいまいません。

ただ、わかりやすいように、kwargsを使ったほうがいいでしょう。

上記のコードは、最初のprint出力で**kwargsが辞書化されているか確認していますが、出力結果はきちんと辞書型で取り込まれていました。

その後、forループで、keyとvalueを変数iと変数jに代入して出力しています。

ちなみに、実行時にキーワードを指定せずに引数だけ入力した場合は、辞書化の際に、keyを取得することができないので、タイプエラーが起こります。

アンパッキングしてからの辞書化

昨日の位置引数のタプル化でも少し学習しましたが、辞書型も変数に辞書型を指定して、アンパッキングして代入した引数を再度辞書化するという使い方ができます。

位置引数のタプル化と違って、辞書型のアンパッキング&辞書化はよく使うとのことですので、きちんと憶えておきましょう!

def dic_func(**kywargs):
    for i, j in kywargs.items():
        print(i, j)
 
d = {
     'food': 'fish',
     'drink': 'coffee',
     'fruit': 'apple',
     'dessert': 'ice',
}
dic_func(**d)

出力結果

food fish
drink coffee
fruit apple
dessert ice

リストのアンパッキングからのタプル化はあまり使わないとのことでしたが、辞書型のアンパッキングからの辞書化はよく使われるようで、辞書型を改行して表記したほうがコードが見やすいという解説をされていました。

一緒に使うときは注意が必要

位置引数とタプル化、辞書化は一緒に使うことが可能です。

def ex_func(word, *args, **kwargs)
    print(word)
    print(args)
    print(kwargs)
 
ex_func('lemon', 'apple', 'orange', food='rice', drink='tea')

出力結果

lemon
('apple', 'orange')
{'food': 'rice', 'drink': 'tea'}

関数実行時に、1つ目の値が位置引数の変数wordに代入されて、2つ目、3つ目の値がタプル化されて変数argsに代入され、4つ目、5つ目のキーワードと値が辞書化されて変数kwargsに代入されて出力されています。

この順番が入れ替わるとエラーが起こってしまうので、一緒に使う際は、通常の位置引数、*一つのタプル化引数、**2つの辞書化引数の順番で記載する必要があります。

たとえば、辞書化するキーワードと値を最初に書いて、タプル化する値をあとに書くと、感覚的にはうまく実行できそうな気がしますが、エラーが起こってしまいます。

def ex_func(**kwargs, *args)
    print(args)
    print(kwargs)
 
ex_func(food='rice', drink='tea', 'lemon', 'apple', 'orange')

出力結果

  File "/private/var/mobile/Containers/Shared/AppGroup/BA3519D5-E394-4ECC-BFF6-B1876836D55A/Pythonista3/Documents/Mypython/day0402.py", line 1
    def ex_func(**kwargs, *args):
                          ^
SyntaxError: invalid syntax

こちらの関数の引数のときに学習した際の注意点と合わせて憶えておきましょう。

一つ一つの部品

メソッドや関数はプログラムを完成するための一つ一つの部品です。

部品に不良品が含まれていれば、完成品はうまく動いているように見えても、いつかは故障してしまいます。

自動車もたくさんの部品からできていますが、不良品の部品があれば、故障の原因になります。

物質として目に見えるもの同様に、プログラムもちょっとしたエラーが大きなエラーにつながるので、この一つ一つの部品の動きをしっかりと理解しておくようにしましょう。

それでは、明日もGood Python!