Pythonのコードで、関数の引数の*argsと**kwargs。なぜいつも一緒なの? *アスタリスクがなんでついているの?などの疑問を先輩が教えてくれたコードを実行することで理解した話を説明します。
・Pythonの基本的なリスト、タプル、辞書、関数(def)の使い方や理解ができる
・Pythonの*args, **kwargsが理解できない
コンテンツ
*args, **kwargsの読み方と意味
そもそもの彼らの読み方ですが・・・総称して「可変長引数」と呼びます。
そして個別読みですが
- args ・・・ アーグス
- kwargs・・・ケーダブルアーグス
と読みます。
argsはarguments(アーギュメンツ)の略です。 意は「引数」です。
kwargsは、略しないで読むと keyword arguments となります。Python学者同士だと「キーワード引数」と言います。
*args, **kwargs引数名に関して
可変長の引数を受け取る関数は、仮引数名に*及び**を付けると定義できます。
この仮引数名には任意の名前を利用できますが、慣例として*args及び**kwargsとすることが多いです。
つまり**kwargsではなく、**fuga でも利用できますが慣例に沿って**kwargsと記述しておけば間違いはないでしょう。
*args, **kwargsをざっくり用語として理解
まずは用語としてなんとなく理解をしてみます。
- *args・・・複数の引数をタプルとして受け取る
- **kwargs・・・複数のキーワード引数を辞書型オブジェクトとして受け取る
と理解しておき深堀していきます。
タプル
タプルとは不変な配列を扱う型です。
リストと似ていますが、定義後に要素を変更できない点がリストとの違いです。
またリストのように [ ] カクカッコではなく() カッコを使用します。
1 2 3 |
items = ('note', 'notebook', 'sketchbook') print(items) #('note', 'notebook', 'sketchbook') print(type(items)) #<class 'tuple'> |
辞書型オブジェクト
辞書とはキーと値をセットで扱うデータ型で、他の言語ではハッシュやマップ、連想配列と呼ばれます。基本的には {key:value} のように表します。
ちなみにdictonary(意:辞書)から変数名はdicと置きます。
1 2 3 |
dic = {'Tokyo':1400, 'Osaka': 880, 'Aichi': 755} print(dic) #{'Tokyo': 1400, 'Osaka': 880, 'Aichi': 755} print(type(dic)) #<class 'dict'> |
つまり・・・
*argsと**kwargsでは上記のタプルと辞書方オブジェクトを扱えるということになります。
*args, **kwargsを実際に使用して理解
理解を進めるには、実際に関数に値を渡して操作を学ぶことです。
1 2 3 4 |
def sample_page(*args, **kwargs): print(args, kwargs) sample_page('hogehoge', 1) |
sample_pageという関数名を定義した関数に、第一引数に文字列の’hoghoge’、第二引数に数字列の1を持たせ、sample_page関数を呼び出します。
すると答えは
1 |
('hogehoge', 1) {} |
となります。つまり、タプル(args)としては受け取れますが、辞書型(kwargs)としては受け取られなかったので空のまま{}としてprintされたということです。
それでは続いて
1 2 3 4 |
def sample_page(*args, **kwargs): print(args, kwargs) sample_page(a=1, b='hoge') |
すると答えは
1 |
() {'a': 1, 'b': 'hoge'} |
となります。つまり、タプル(args)としては受け取られずに、辞書型(kwargs)としては受け取られたので、{‘a’: 1, ‘b’: ‘hoge’}としてprintされたということです。
ということで、**アスタリスクも使用して最後にまた復習をしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def sample_page(*args, **kwargs): print(args, kwargs) sample_page('hogehoge', 1 sample_page(a=1, b='hoge') t = ('hogehoge', 1) u = {'a': 1, 'b': 'hoge' } sample_page(*t) sample_page(**u) # ('hogehoge', 1) {} # () {'a': 1, 'b': 'hoge'} # ('hogehoge', 1) {} # () {'a': 1, 'b': 'hoge'} |
という結果になります。
常日頃から型を意識したコードを書くことで*args、**kwargsの理解もより早く進むと思います。
スクールを利用して本格的に学ぶ
いかがでしたでしょうか?
10人中9人が挫折すると言われるプログラミングを、ヒロヤンも実はプログラミングスクールで学習をしてきたからで、結果、今はPythonエンジニアとして働いています。
挫折率が高いプログラミングこそお金を払ってメンターを付けて、道を見失わないように環境を構築する必要があるのではないでしょうか。
これはダイエットで自分一人では痩せられないけど、トレーナーを付けて否が応でもせざるを得ない環境を作ると一緒ですね。
ヒロヤンもプログラミング勉強開始直後はあれこれ悩みましたが、悩むよりも手っ取り早くスクールに登録した方が最短ルートで勉強できるのではないかと考え、結果挫折せずに今に至っています。
今なら無料でキャリアカウンセリングを行っているTechAcademyのようなプログラミングスクールもありますのでこれを機会に是非カウンセリングだけでも受けてみてはいかがでしょうか?
上記リンク先から無料相談ができます。
またこちら(↓)ではPython専用のプログラミングスクールをまとめ紹介しています。