2015-08-31 59 views
1

我不知道我怎么会进入多个变量到我的功能:如何将未知数量的变量输入到函数中?

def Dot_Product(Vector1,Vector2): 
    return sum([x*y for x,y in zip(Vector1,Vector2)]) 

print Dot_Product([1,2,1],[1,1,1]) 

我已经调查*指定参数和** kwargs,但我不知道我将如何实现这一点,以便列表解析也将遍历超过未知数量的变量。我不确定它是否有可能,如果有其他选择,他们将不胜感激。 我理解* args和** kwargs是如何工作的,但是我不确定如何实现一个列表理解,它将迭代未知数量的变量,如示例中给出的,我只能遍历x,y或x,y,z或者n个列表中的任何一个,只要我知道n是多少。既然我不知道,我怎么能改变列表理解来处理呢?

+1

可能重复的[\ * args和\ * \ * kwargs?](http://stackoverflow.com/questions/3394835/args-and-kwargs) –

+0

我明白如何使用* args和** kwargs而不是如何在\列表理解中实现它们,以便遍历未知数量的列表 – Aaron

回答

3

你可以试试这个方法:

multiplication = lambda x,y: x*y 

def dot_product(*args): 
    return sum([reduce(multiplication, arg) for arg in zip(*args)]) 

然后你就可以,只要你想传递尽可能多的参数:

In [5]: print dot_product([1,2,1], [1,1,1]) 
4 

In [6]: print dot_product([1,2,1], [1,1,1], [1,1,1]) 
4 

您可以检查这里的reduce功能

我想你还需要验证所有项目都是列表并且它们具有相同的长度。

而且,因为不需要乘积变量通过@PauloAlmeida建议作为标准库提供给我们,我们可以这样导入:

from operator import mul 

,然后我们可以使用mul代替乘法表示reduce函数上使用的lambda函数的变量。

+0

感谢您提供有用的答案和指向reduce列的链接,这非常有帮助。另外感谢您检查输入的提示 – Aaron

+0

而不是'lambda',你也可以通过操作员导入mul来完成。 –

+0

是的,你是对的@PauloAlmeida,我在添加答案之前想过它,但是我之后忘了它......我将它添加到答案中。谢谢!! – avenet