2015-08-31 2 views
1

Je me demandais comment j'entrer plusieurs variables dans ma fonction:Comment entrer un nombre inconnu de variables dans une fonction?

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]) 

J'ai regardé dans * args et ** kwargs mais je ne sais pas comment je mettre en œuvre ce afin que la compréhension de la liste serait également itérer sur un nombre inconnu de variables. Je ne suis pas sûr que ce soit possible, donc s'il y a des alternatives, elles seraient grandement appréciées. Je comprends comment * args et ** kwargs fonctionnent mais je ne sais pas comment implémenter une compréhension de liste qui irait sur un nombre inconnu de variables comme dans l'exemple donné je ne peux itérer que sur x, y ou x, y, z ou n nombre de listes de listes à n'importe lequel tant que je sais quel est le nombre n. Depuis que je ne sais pas n comment puis-je changer la compréhension de la liste pour gérer cela?

+1

duplication possible de [\ * args et \ * \ * kwargs?] (Http://stackoverflow.com/questions/3394835/args-and-kwargs) –

+0

Je comprends comment * args et ** kwargs ne sont pas utilisés pas comment les implémenter dans \ comprehension de liste de sorte qu'il itère sur un nombre inconnu de listes – Aaron

Répondre

3

Vous pouvez essayer cette approche:

multiplication = lambda x,y: x*y 

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

Et puis vous pouvez passer autant d'arguments que vous voulez:

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 

Vous pouvez vérifier la fonction reduce ici

Je pense que vous devra également valider que tous les éléments sont des listes et qu'ils ont la même longueur.

En outre, comme une suggestion @PauloAlmeida la variable de multiplication n'est pas nécessaire que la bibliothèque standard fournit à nous, nous pouvons l'importer comme ceci:

from operator import mul 

et nous pouvons utiliser mul au lieu de la multiplication variables qui représente la fonction lambda utilisée sur la fonction de réduction.

+0

Merci pour la réponse utile et le lien vers la colonne réduire, c'était très utile. Merci également pour les conseils sur la vérification des entrées – Aaron

+0

Au lieu de 'lambda' vous pouvez aussi faire' depuis l'opérateur import mul'. –

+0

Oui, vous avez raison @PauloAlmeida, j'y ai pensé avant d'ajouter la réponse, mais je l'ai oublié après ... Je vais l'ajouter dans la réponse. Je vous remercie!! – avenet