liste et sqrt()

5 réponses
Avatar
Lulu
Bonjour,

>>> from math import *
>>> liste=[0,1,2,3,4,5,6]
>>> print(liste)
[0, 1, 2, 3, 4, 5, 6]
>>> print(sqrt(x) for x in liste)
<generator object <genexpr> at 0x7faab1a75a40>
>>>

Pour ça ne marche pas (python3.6) ?

5 réponses

Avatar
Pierre Maurette
Lulu :
Bonjour,
from math import *
liste=[0,1,2,3,4,5,6]
print(liste)



[0, 1, 2, 3, 4, 5, 6]
print(sqrt(x) for x in liste) <generator object <genexpr> at
0x7faab1a75a40>



Pour ça ne marche pas (python3.6) ?

print([sqrt(x) for x in liste])
--
Pierre Maurette
Avatar
Nicolas
Le 13/02/2019 à 04:12, Lulu a écrit :
Bonjour,
from math import *
liste=[0,1,2,3,4,5,6]
print(liste)



[0, 1, 2, 3, 4, 5, 6]
print(sqrt(x) for x in liste)



<generator object <genexpr> at 0x7faab1a75a40>



Pour ça ne marche pas (python3.6) ?

Comme la sortie stdout le dit, l'expression "x for x in y" est un
générateur.
Si on encadre cette expression par des crochets, on crée une liste dont
le contenu est extrait du générateur.
Les 2 codes suivants sont équivalents fonctionnellement :
1)
gen = (sqrt(x) for x in liste)
for el in gen :
print(el)
2)
lst = [sqrt(x) for x in liste]
for el in lst :
print(el)
La grosse différence est que le code 2, crée une nouvelle liste en
mémoire alors que le cas 1 utilise la liste d'origine.
Au niveau occupation mémoire, avec de petites listes, c'est sans grande
importance. Mais avec de grandes listes, le cas 1 est préférable.
Attention : Avec le cas 1, si la liste d'origine est modifiée, le
générateur verra sa sortie modifiée. Avec le cas 2, la nouvelle liste
est indépendante de la première.
Avatar
Lulu
Le 13-02-2019, Pierre Maurette a écrit :
Lulu :
from math import *
liste=[0,1,2,3,4,5,6]
print(liste)



[0, 1, 2, 3, 4, 5, 6]
print(sqrt(x) for x in liste) <generator object <genexpr> at
0x7faab1a75a40>



Pour ça ne marche pas (python3.6) ?

print([sqrt(x) for x in liste])

Arf...
Je n'avais même pas vu que je ne créais pas une liste.
Sans doute les joies de l'oubli de paranthèses et de crochets du
débutant ;-)
Merci
Avatar
Lulu
Le 13-02-2019, Nicolas a écrit :
Le 13/02/2019 à 04:12, Lulu a écrit :
from math import *
liste=[0,1,2,3,4,5,6]
print(liste)



[0, 1, 2, 3, 4, 5, 6]
print(sqrt(x) for x in liste)



<generator object <genexpr> at 0x7faab1a75a40>



Pour ça ne marche pas (python3.6) ?

Comme la sortie stdout le dit, l'expression "x for x in y" est un
générateur.

Ah ?
Il va donc falloir que j'apprenne ce qu'est un générateur...
Si on encadre cette expression par des crochets, on crée une liste dont
le contenu est extrait du générateur.

Oui, je croyais bien créer une nouvelle liste, sans voir que j'avais
oublié les crochets.
Les 2 codes suivants sont équivalents fonctionnellement :
1)
gen = (sqrt(x) for x in liste)
for el in gen :
print(el)
2)
lst = [sqrt(x) for x in liste]
for el in lst :
print(el)
La grosse différence est que le code 2, crée une nouvelle liste en
mémoire alors que le cas 1 utilise la liste d'origine.
Au niveau occupation mémoire, avec de petites listes, c'est sans grande
importance. Mais avec de grandes listes, le cas 1 est préférable.
Attention : Avec le cas 1, si la liste d'origine est modifiée, le
générateur verra sa sortie modifiée. Avec le cas 2, la nouvelle liste
est indépendante de la première.

Merci pour ces conseils.
Avatar
ast
Le 13/02/2019 à 04:12, Lulu a écrit :
Bonjour,
from math import *
liste=[0,1,2,3,4,5,6]
print(liste)



[0, 1, 2, 3, 4, 5, 6]
print(sqrt(x) for x in liste)



<generator object <genexpr> at 0x7faab1a75a40>



Pour ça ne marche pas (python3.6) ?

g = (sqrt(x) for x in liste)
l = [sqrt(x) for x in liste]
g est un générateur
l est une liste
Les éléments d'un générateur ne sont pas précalculés
et mis en mémoire comme pour une liste mais ils sont
fournis au fur et à mesure qu'on les demande.
Lorsque l'on passe en argument un générateur à une fonction
ou à une méthode qui attend un itérable, on peut supprimer
un niveau de parenthèses.
ex:
"-".join((str(i) for i in liste)) équivalent à:
"-".join(str(i) for i in liste)



'0-1-2-3-4-5-6'
pareil pour ton print
print(sqrt(x) for x in liste) équivalent à:
print((sqrt(x) for x in liste))
print(g)
<generator object <genexpr> at 0x7faab1a75a40>