On me dit de
Ecrivez une fonction, square (a), qui prend un tableau, a, de nombres et retourne un tableau contenant chacune des valeurs d'un carré.
Au début, j'avais
def square(a):
for i in a: print i**2
Mais cela ne fonctionne pas puisque je suis en train d’imprimer et que je ne reviens pas comme on me l’avait demandé…
def square(a):
for i in a: return i**2
Mais cela ne fait que quadriller le dernier numéro de mon tableau. Comment puis-je le faire cocher toute la liste?
Vous pouvez utiliser une compréhension de liste:
def square(list):
return [i ** 2 for i in list]
Ou vous pourriez map
le:
def square(list):
return map(lambda x: x ** 2, list)
Ou vous pouvez utiliser un générateur. Il ne renverra pas de liste, mais vous pouvez quand même le parcourir et, comme vous n'avez pas à allouer une nouvelle liste complète, il est peut-être plus économe en espace que les autres options:
def square(list):
for i in list:
yield i ** 2
Ou vous pouvez faire la vieille boucle for
- ennuyeuse, bien que ce ne soit pas aussi idiomatique que certains programmeurs Python préféreraient:
def square(list):
ret = []
for i in list:
ret.append(i ** 2)
return ret
Utiliser une liste de compréhension (c'est le chemin à suivre en pur Python):
>>> l = [1, 2, 3, 4]
>>> [i**2 for i in l]
[1, 4, 9, 16]
Ou numpy (un module bien établi):
>>> numpy.array([1, 2, 3, 4])**2
array([ 1, 4, 9, 16])
Dans numpy
, les opérations mathématiques sur les tableaux sont exécutées élément par élément. C'est pourquoi vous pouvez **2
un tableau entier ici.
D'autres solutions possibles seraient basées sur map
-, mais dans ce cas, je choisirais vraiment la liste de compréhension. C'est Pythonic :) et une solution basée sur map
qui nécessite lambda
s est plus lente que LC .
import numpy as np
a = [2 ,3, 4]
np.square(a)
Utilisez numpy.
import numpy as np
b = list(np.array(a)**2)
def square(a):
squares = []
for i in a:
squares.append(i**2)
return squares
def square(a):
squares = []
for i in a:
squares.append(i**2)
return squares
alors comment ferais-je le carré de nombres de 1 à 20 en utilisant la fonction ci-dessus
tu peux faire
square_list =[i**2 for i in start_list]
qui retourne
[25, 9, 1, 4, 16]
ou, si la liste a déjà des valeurs
square_list.extend([i**2 for i in start_list])
qui retourne
[25, 9, 1, 4, 16]
Note : vous ne voulez pas faire
square_list.append([i**2 for i in start_list])
comme il retourne une liste dans une liste:
[[25, 9, 1, 4, 16]]
Une solution de carte supplémentaire:
def square(a):
return map(pow, a, [2]*len(a))