Comment passer une liste en entrée d'une fonction en Python
Je suis à l'aide de Python, et j'ai une fonction qui prend une liste en argument. Par exemple, je suis en utilisant la syntaxe suivante,
def square(x,result= []):
for y in x:
result.append=math.pow(y,2.0)
return result
print(square([1,2,3]))
et la sortie est [1]
seulement où je suis censé obtenir [1,4,9]
.
Ce que je fais mal?
source d'informationauteur Arpan Das
Vous devez vous connecter pour publier un commentaire.
Vous êtes actuellement en renvoyant une valeur de votre fonction dans la première itération de votre
for
boucle. De ce fait, la deuxième et la troisième itération de votrefor
boucle de jamais avoir lieu. Vous avez besoin de déplacer votrereturn
énoncé à l'extérieur de la boucle, comme suit:Sortie
Pourquoi pas à côté complètement le problème?
Edit: Le premier problème, comme plusieurs personnes l'ont souligné, c'est que vous êtes de court-circuit de votre
for
boucle. Votrereturn
devrait venir après la boucle, pas.Le problème suivant est de votre utilisation de
list.append
- vous besoin de l'appeler, de ne pas lui attribuer, c'est à direresult.append(y*y)
.result.append = y*y
mais remplace la méthode avec une valeur numérique, probablement de lancer une erreur la prochaine fois que vous essayez d'appeler.Une fois que vous corriger cela, vous trouverez une autre, moins évidente erreur se produit si vous appelez votre fonction à plusieurs reprises:
Parce que vous passez une mutable élément (une liste) en tant que par défaut, toute autre utilisation de cet élément par défaut pointe vers la même liste originale.
Au lieu de cela, essayez de
Nous utilisons même
result
? Vous pouvez utiliser une liste de compréhension pour générer votre résultat qui vous revenir ensuite. Je ne suis pas sûr de savoir pourquoi vous avez passéresult
comme une variable dans la fonction, car il n'est pas utilisé.Aussi, après avoir
return result
à l'intérieur de votre boucle signifie que la fonction renvoie la valeur de la première itération, elle retourne le carré du premier nombre de la liste.Vous devriez retourner à l'extérieur de la boucle for. Sinon, il va s'arrêter après la première itération.
Vous pourriez être intéressé par l'utilisation
rendement
de cette façon, vous pouvez soit appeler
qui ne génère pas de l'ensemble de la liste de cases à la fois, mais plutôt un élément par itération, ou de l'utilisation
list(square(x))
pour obtenir la liste complète sur demande.C'est une occasion amusante à utiliser un peu plus de style fonctionnel:
Il utilise le
map
fonction qui prend une liste et une fonction, et retourne une nouvelle liste où cette fonction a été appliqué individuellement à chaque membre de la liste. Dans ce cas, il applique lamath.pow(x,2)
fonction à chaque membre de la liste, où chaque nombre est x.Avis que
map(lambda x:(math.pow(x,2)), [1,2,3])
retourne un objet iterable, ce qui est vraiment pratique, mais si vous avez besoin d'obtenir une liste de juste envelopper l'ensemble de la déclaration danslist()
.votre code n'a pas de sens n'importe où. erreur de syntaxe à la fin manque le crochet de fermeture de l'impression, le retour d'appel à l'intérieur de la boucle for signifiant qu'il n'exécute qu'une fois, et le résultat.append est une fonction, pas un constructeur sp le bon appel est
la seule chose qui n'est pas un problème est le passage de la liste qui est de votre question, la fonction est de recevoir l'ensemble de la liste si vous ne
hors