web-dev-qa-db-fra.com

Comment passer une liste en tant qu'entrée d'une fonction en Python

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?

11
Arpan Das

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]
14
gtlambert

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
18
Hugh Bothwell

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]
6
Alexander

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

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.

3
Tobias Kienzler

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().

2
richardlaborde

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,]
0
user2255757