我似乎无法解开如何解包(*)以及itertools.product()如何使用下面的示例。
RCPT TO:<forward-path> [ SP <rcpt-parameters> ] <CRLF>
输出:
for x in product(["ghi","abc"]):
print(x)
使用*
('ghi',)
('abc',)
输出:
for x in product(*["ghi","abc"]):
print(x)
这个输出是如何产生的?我知道product()通常会根据“重复”的数量生成组合。至于上面,重复默认为1.为什么没有生成(&#39; a&#39;&#39; g&#39;)?
我猜('g', 'a')
('g', 'b')
('g', 'c')
('h', 'a')
('h', 'b')
('h', 'c')
('i', 'a')
('i', 'b')
('i', 'c')
实际产生的*["ghi","abc"]
函数是什么?我的意思是我看到结果是什么,但我似乎无法得到它是如何工作的。
答案 0 :(得分:2)
当您将参数解包为product
时,它与手动输入列表中的每个元素作为参数相同。那就是:
product(*[a, b]) == product(a, b)
所以你真正做的是将列表中的每个字符串传递给product()
。 Python就是在幕后为你做这件事。
('a', 'g')
未出现在结果中的原因仅仅是因为产品如何运作。 The official documentation of product does a good job of explaining how exactly it works:
输入迭代的笛卡尔积。
大致相当于生成器表达式中的嵌套for循环。例如,
product(A, B)
返回与((x,y) for x in A for y in B)
相同的内容。嵌套循环像里程表一样循环,最右边的元素在每次迭代时前进。此模式创建了一个字典顺序,以便在输入的可迭代内容进行排序时,产品元组按排序顺序发出。
要计算iterable与其自身的乘积,请使用可选的 repeat 关键字参数指定重复次数。例如,
product(A, repeat=4)
表示与product(A, A, A, A)
相同。此函数大致等同于以下代码,但实际实现不会在内存中构建中间结果:
def product(*args, repeat=1): # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 pools = [tuple(pool) for pool in args] * repeat result = [[]] for pool in pools: result = [x+[y] for x in result for y in pool] for prod in result: yield tuple(prod)