概要
小ネタ。Python 3.0で追加された仕様です。
知ってるとちょっと楽できます。
以下のPEPです。
www.python.org
名前は、Extended Iterable Unpacking って感じのちょっとむずかしそうな
名前ですが、実際にコード見てみるとすぐ意味が分かります。
list01 = list(range(5))
first, *rest = list01
上記を実行すると
first=0
rest=[1, 2, 3, 4]
となります。つまり、「*」を付けた変数に残りがアンパックされます。
以前は、こう書いてました。
list01 = list(range(5))
first, rest = list01[0], list01[1:]
アンパックする部分は、左辺の末尾にないといけないわけではなく
str01 = 'hello world'
first, *rest, last = str01
のように記述することもできます。
この場合、ちゃんと first, last にも先頭と末尾の値が入ります。
サンプル
str01 = 'hello world'
first, *rest, last = str01
pr('first', first)
pr('rest', rest)
pr('last', last)
seq01 = list(range(10))
first, rest = seq01[0], seq01[1:]
pr('first', first)
pr('rest', rest)
first, *rest = seq01
pr('first', first)
pr('rest', rest)
it01 = [tuple('hello'), tuple('world')]
for _, *x, _ in it01:
print(x)
oneitem = [1]
first, *rest = oneitem
pr('first', first)
pr('rest', rest)
try:
noitem = []
first, *rest = noitem
pr('first', first)
pr('rest', rest)
except ValueError as e:
pr('noitem', e)
実行すると以下のようになります。
first='h'
rest=['e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l']
last='d'
first=0
rest=[1, 2, 3, 4, 5, 6, 7, 8, 9]
first=0
rest=[1, 2, 3, 4, 5, 6, 7, 8, 9]
['e', 'l', 'l']
['o', 'r', 'l']
first=1
rest=[]
noitem=ValueError('not enough values to unpack (expected at least 1, got 0)',)
ソースは、以下でも見れます。
github.com
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。