Pythonの基本!?(Unpacking Argument Lists)
Pythonを使っていて、可変長引数を受け付ける関数でも、関数に代入する時点で引数を指定しなければならない。何を言っているのかと言うとコードを見てもらうと分かりやすいと思います。例えとして、setuptools.productを使う。
setuptools.productはこんな感じ。
#! /usr/bin/env python2 from itertools import product list1=range(3) list2="ABC" list3="XYZ" for i in itertools.product(list1,list2,list3): print i
出力
(0, 'A', 'X') (0, 'A', 'Y') (0, 'A', 'Z') (0, 'B', 'X') (0, 'B', 'Y') (0, 'B', 'Z') (0, 'C', 'X') (0, 'C', 'Y') (0, 'C', 'Z') (1, 'A', 'X') (1, 'A', 'Y') (1, 'A', 'Z') (1, 'B', 'X') (1, 'B', 'Y') (1, 'B', 'Z') (1, 'C', 'X') (1, 'C', 'Y') (1, 'C', 'Z') (2, 'A', 'X') (2, 'A', 'Y') (2, 'A', 'Z') (2, 'B', 'X') (2, 'B', 'Y') (2, 'B', 'Z') (2, 'C', 'X') (2, 'C', 'Y') (2, 'C', 'Z')
list1,list2,list3を明示的に書かないといけないのです。
あるときは、list1とlist2だけ、またある時はlist1,list2,list3を使う。みたいなことしたいわけです。そこでアンパッキングーー!!!
4. More Control Flow Tools — Python 2.7.10rc1 documentation
遠い昔に、初めてのPythonで見たような気がします...。
改めて前のコードを書き直すと
#! /usr/bin/env python2 from itertools import product list1=range(3) list2="ABC" list3="XYZ" man=False if man==True: listinlist=[list1,list2,list3] else: listinlist=[list1,list2] for i in itertools.product(*listinlist): print i