LoginSignup
1
0

More than 1 year has passed since last update.

パック、アンパックの解説(コレ⇒*)

Last updated at Posted at 2022-05-23

「アンパックってなに?」
「a = *'abc'ってなに?」
「*a = 'abc'って、アスタリスクを付けるのが前後逆になると出力が違うの???」
となったので、
アスタリスクの意味の1つであるパック、アンパックについて解説する。
  
  

アンパックの処理
>>>a,b,c,d,e,f,g = (*"apple","banana","tomato")
>>> 
>>>
Output:a, p, p, l, e, banana, tomato

アンパックを一文で表すと、「複数の要素を持つものを分解して各変数に代入すること」である。
(また、展開とも言われている。(引数に入るアンパック(zip(* list))など))
「Q. (x+2)(x+5)
 A. x2+7x+10 」:展開
  
どういうことかというと、
a,b,c,d,e,f,g = (*"apple","banana","tomato")
と書いたら、アスタリスクが付いている"apple"が1つずつに分解される。
そして、

アンパックの代入結果
a = "a"
b = "p"
c = "p"
d = "l"
e = "e"
f = "banana"
g = "tomato"

一番最初(a,b,c,...)の変数から順番に、1つずつ分解された値が入っていく。
  
"banana"と"tomato"はアスタリスクが付いてないし特に指定もないため、余ったfとgにそのまま入って、ピッタリと全ての値が変数に収まる。
  
ちなみに、fとgを無くして、ピッタリと値が収まらないようにすると、

アンパックのエラー
>>>a,b,c,d,e = (*"apple","banana","tomato")
>>> 
>>>
ValueError: too many values to unpack

このように、Errorが出る。変数の数を出力される値の数にきっちりと合わせないといけないらしい。
  
  
  
  
  
  
  
  
  

パックの処理
>>>*a,b = ("apple","banana","tomato")
>>> 
>>>
Output:['apple', 'banana'] tomato

次に、パックとは何かを説明する。
要は、アンパックの逆である。値を括弧でまとめて変数に代入する。
  
  
*a,b = ("apple","banana","tomato")
と書いたら、アスタリスクが付いているaが、変数の数と値の数が合うように値を上手くまとめる。
そして、

パックの代入結果
a = ['apple', 'banana'] 
b = "tomato"

aには'apple'と'banana'が入って、bにもきちんと値が入るように、残った'banana'が入る。
  
ちなみに、

パックの別例
>>>*a,b,c,d = ("apple","banana","tomato")
>>>  
>>>
Output:[] apple banana tomato

変数にcとdを増やした結果、パックを指定していないb、c、dに値が入って、パックを指定したaには何も値が入らなかった。
代入の優先順位は、パックを指定していない普通の変数の方が上らしい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0