gratifiant > comp.lang.* > comp.lang.python

Lulu (13/02/2019, 05h12)
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) ?
Pierre Maurette (13/02/2019, 07h41)
Lulu :
> Bonjour,
> [0, 1, 2, 3, 4, 5, 6]
> Pour ça ne marche pas (python3.6) ?


print([sqrt(x) for x in liste])
Nicolas (13/02/2019, 09h45)
Le 13/02/2019 à 04:12, Lulu a écrit :
> Bonjour,
> [0, 1, 2, 3, 4, 5, 6]
> <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 (13/02/2019, 14h36)
Le 13-02-2019, Pierre Maurette <maurette.pierre> a écrit :
> Lulu :


> 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 (13/02/2019, 14h45)
Le 13-02-2019, Nicolas <nicolasp> a écrit :
> Le 13/02/2019 à 04:12, Lulu a écrit :


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

[..]
> 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 (13/02/2019, 14h46)
Le 13/02/2019 à 04:12, Lulu a écrit :
> Bonjour,
> [0, 1, 2, 3, 4, 5, 6]
> <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>
Discussions similaires