おいも貴婦人ブログ

生物系博士課程満期退学をしたAIエンジニアのブログ。

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で見たような気がします...。
初めてのPython 第3版

改めて前のコードを書き直すと

#! /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

Have a nice Python Life!!!!