liste et sqrt()

Le
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) ?
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pierre Maurette
Le #26509277
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
Nicolas
Le #26509286
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.
Lulu
Le #26509302
Le 13-02-2019, Pierre Maurette
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
Lulu
Le #26509305
Le 13-02-2019, Nicolas
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.
ast
Le #26509304
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>
Publicité
Poster une réponse
Anonyme