我正在尝试重新创建itertools.product
。
我知道如何为这个任务创建循环,例如:
arr1 = [1, 2, 3]
arr2 = [5, 6, 7]
arr_out = []
for i in arr1:
for i1 in arr2:
final = i, i1
arr_out.append(final)
print(arr_out)
输出:
[(1, 5), (1, 6), (1, 7), (2, 5), (2, 6), (2, 7), (3, 5), (3, 6), (3, 7)]
但我想知道如何从kwargs
创建一个函数。我尝试这样做:
arr1 = [1, 2, 3]
arr2 = [5, 6, 7]
def my_cool_product(**kwargs):
arr_out = []
for i in kwargs[0].items():
for i1 in kwargs[1].items():
final = i, i1
arr_out.append(final)
print(my_cool_product(arr1, arr2))
但是行不通。
输出:
TypeError: my_cool_product() takes 0 positional arguments but 2 were given
我不知道如何在嵌套循环中调用每个后续kwarg
。我希望得到与第一个示例相同的输出。
目标是不需要导入任何模块,比如itertools
,换句话说,从头开始。
**kwargs
不适合您提议的功能。
如注释中所链接的,**kwargs
用于可变关键字参数函数。在您的示例中,您正在查找任意数量的未命名列表。
假设只有两个数组你想要得到它们的乘积,就像你在例子函数中暗示的那样:
def my_cool_product(**kwargs):
arr_out = []
for i in kwargs["array1"]:
for i1 in kwargs["array2"]:
final = i, i1
arr_out.append(final)
return arr_out
你可以这样使用:
>>> my_cool_product(array1=[1,2,3], array2=[4,5,6])
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
但是由于名称array1
和array2
没有意义,因此首选使用*args
:
def my_cool_product(*args):
arr_out = []
for i in args[0]:
for i1 in args[1]:
final = i, i1
arr_out.append(final)
return arr_out
>>> my_cool_product([1,2,3], [4,5,6])
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
为了进一步支持任意数量的列表,请参阅重复的问题,以便了解*args
和**kwargs
的区别。