web-dev-qa-db-fra.com

TypeError: <lambda> () manque 1 argument positionnel requis: 'w'

Le code est ici

return self.activator(reduce(lambda a, b: a+b, map(lambda x, w: x*w, Zip(input_vec, self.weights)), 0.0) + self.bias)

Le code de la version python2.7 est comme lambda (x, w)

Mais maintenant, le déballage du paramètre Tuple a été supprimé, donc je ne sais pas comment le comprendre :(

7
yizhuo liu

C'est une bonne chose de faire un petit exemple en cours d'exécution qui montre le problème. Dans votre cas, ce n'est pas le cas car il nous manque certaines variables. Comme je l'ai dit dans l'autre commentaire, votre liste que vous cartographiez est constituée de tuples. Comme vous le savez déjà, vous ne pouvez plus décompresser les tuples, mais vous pouvez utiliser des indices comme vous le feriez sur un tableau. Un exemple de travail simple:

val = reduce(lambda a, b: a+b, map(lambda t: t[0]*t[1], Zip([10, 20, 30], [0.1, 0.3, 0.7])), 0.0)
print(val)

Comme vous le voyez, la fonction lambda passée à la fonction map n'a plus qu'un paramètre maintenant. Je l'ai appelé t pour préciser qu'il s'agit d'un Tuple, vous pouvez l'appeler x si vous le souhaitez. Dans le corps de la fonction, j'utilise des indices pour obtenir le premier et le deuxième élément du tuple. Si vous exécutez ce code, vous voyez qu'il fonctionne. La prochaine étape consiste donc à adapter cela à votre code:

return self.activator(reduce(lambda a, b: a+b, map(lambda t: t[0]*t[1], Zip(input_vec, self.weights)), 0.0) + self.bias)

Et cela devrait faire l'affaire.

6
Schorsch

vous ne pouvez plus déballer. Mais, vous pouvez simplement prendre Tuple tel quel et utiliser l'indexation dans la formule:

map(lambda t: t[0]*t[1], Zip(input_vec, self.weights))

utiliser map avec lambda a peu d'intérêt, l'équivalent de compréhension du générateur:

(x*w for x,w in Zip(input_vec, self.weights))    

(et déballage des travaux)

La même construction doit être répétée avec les lambda et même reduce externes, qui peuvent être complètement éliminés avec sum qui effectue des sommes des éléments:

return self.activator(sum(x*w for x,w in Zip(input_vec, self.weights)) + self.bias)

plus de lambdas, plus courts et plus clairs

2