J'utilise Python et j'ai une fonction qui prend une liste comme argument. Par exemple, j'utilise 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]
uniquement là où je suis censé obtenir [1,4,9]
.
Qu'est-ce que je fais mal?
Vous retournez actuellement une valeur de votre fonction dans la première itération de votre boucle for
. De ce fait, les deuxième et troisième itérations de votre boucle for
n'ont jamais lieu. Vous devez déplacer votre instruction return
en dehors de la boucle comme suit:
import math
def square(x):
result = []
for y in x:
result.append(math.pow(y,2.0))
return result
print(square([1,2,3]))
Sortie
[1.0, 4.0, 9.0]
Pourquoi ne pas contourner le problème complètement?
def square(vals):
return [v*v for v in vals]
Edit: / Comme plusieurs personnes l’ont souligné, le premier problème est que vous court-circuitez votre boucle for
. Votre return
devrait venir après la boucle, pas en elle.
Le problème suivant est votre utilisation de list.append
- vous devez l’appeler et non l’assigner, c’est-à-dire result.append(y*y)
. result.append = y*y
remplace à la place la méthode par une valeur numérique, en générant probablement une erreur lors de la prochaine tentative d'appel.
Une fois que vous aurez résolu ce problème, vous constaterez qu'une autre erreur moins évidente se produit si vous appelez votre fonction à plusieurs reprises:
print(square([1,2,3]) # => [1, 4, 9]
print(square([1,2,3]) # => [1, 4, 9, 1, 4, 9]
Comme vous transmettez par défaut un élément modifiable (une liste), toute utilisation ultérieure de cet élément par défaut renvoie à à la même liste d'origine.
Au lieu de cela, essayez
def square(vals, result=None):
if result is None:
result = []
result.extend(v*v for v in vals)
return result
Nous utilisons même result
? Vous pouvez utiliser une compréhension de liste pour générer votre résultat que vous retournerez ensuite. Je ne suis pas sûr de savoir pourquoi vous avez passé result
en tant que variable dans la fonction, car elle n'est pas utilisée.
De plus, avoir return result
dans votre boucle signifie que la fonction retourne la valeur lors de la première itération, elle renvoie donc simplement le carré du premier nombre de la liste.
import math
def square(x):
return [math.pow(y, 2) for y in x]
>>> print(square([1,2,3]))
[1.0, 4.0, 9.0]
Vous devriez revenir en dehors de la boucle. Sinon, il s'arrêtera après la première itération.
def square(x):
result=[]
for y in x:
result.append(math.pow(y,2.0)) # add to list after calculation
return result
print(square([1,2,3])
Vous pourriez être intéressé par l’utilisation de yield
def square(x):
for y in x:
yield math.pow(y, 2.0)
de cette façon, vous pouvez appeler
for sq in square(x):
...
qui ne générera pas la liste complète des carrés à la fois, mais un élément par itération, ou utilisera list(square(x))
pour obtenir la liste complète à la demande.
C'est une occasion amusante d'utiliser un style légèrement plus fonctionnel:
import math
map(lambda x:(math.pow(x,2)), [1,2,3])
Cela utilise la fonction map
, qui prend une liste et une fonction et renvoie une nouvelle liste dans laquelle cette fonction a été appliquée individuellement à chaque membre de la liste. Dans ce cas, il applique la fonction math.pow(x,2)
à chaque membre de la liste, où chaque nombre est x.
Notez que map(lambda x:(math.pow(x,2)), [1,2,3])
retourne un itérable, ce qui est très pratique, mais si vous avez besoin d’obtenir une liste, retournez simplement la déclaration entière dans list()
.
votre code n'a de sens nulle part. erreur de syntaxe à la fin manquant le crochet de fermeture pour l’impression, retourne l’appel dans la boucle for, ce qui signifie qu’elle ne s’exécute qu’une seule fois, et result.append est une fonction et non un constructeur.
result.append(math.pow(y,2))
la seule chose qui ne soit pas un problème est le passage de la liste qui est votre question, la fonction reçoit toute la liste si vous le faites
def f(a):
print a
f([1,2,3])
en dehors
[1,2,3,]