OVH Cloud OVH Cloud

mot clef yeld ?

5 réponses
Avatar
Jean-Baptiste Renard
Bonjour,

En essayant de comprendre l'excellent article
http://www.rexx.com/~dkuhlman/pyxmlfaq.html#howdomaccess
sur le XML, DOM et python.

Je n'arrive pas à comprendre le fonctionnement de cette fonction

*def walkTree(node):*
if node.nodeType == Node.ELEMENT_NODE:
yield node
for child in node.childNodes:
for n1 in walkTree(child):
yield n1

J'ai donc cherché la signification du mot clef yeld avec
http://docs.python.org/ref/yield.html , mais je n'arrive pas à comprendre
le fonctionnement de ce mot clef YELD ?

Si quelqu'un avait un début d'explication clair sur YELD, je lui en serait
indéfiniment reconnaissant.

5 réponses

Avatar
Gilles Lenfant
Bonjour,

En essayant de comprendre l'excellent article
http://www.rexx.com/~dkuhlman/pyxmlfaq.html#howdomaccess
sur le XML, DOM et python.

Je n'arrive pas à comprendre le fonctionnement de cette fonction

*def walkTree(node):*
if node.nodeType == Node.ELEMENT_NODE:
yield node
for child in node.childNodes:
for n1 in walkTree(child):
yield n1

J'ai donc cherché la signification du mot clef yeld avec
http://docs.python.org/ref/yield.html , mais je n'arrive pas à comprendre
le fonctionnement de ce mot clef YELD ?

Si quelqu'un avait un début d'explication clair sur YELD, je lui en serait
indéfiniment reconnaissant.




Un exemple plus simple pour comprendre :


l = ("y", "i", "e", "l", "d")

def foo():
for x in range(len(l)):
yield l[x]
# Ceci est équivalent...
a= foo()
for i in a:
print i
# ...à cela
a = foo()
while 1:
try:
print a.next()
except StopIteration, e:
break

Grosso-modo yield retourne un objet de type "generator" sur lequel tu
peux itérer avec une boucle for ... in ....

L'utilisation typique de cette construction est, outre le parse XML plus
concis, une fois le "yield zen" acquis, l'exploration de structures
géantes dans des fichiers ou des bases de données de façon lisible et
maintenable sans consommer beaucoup de mémoire.

En effet, utilisée de façon adéquate, la fonction foo permet de ne pas
monter en mémoire la pseudo-liste "a", mais de récupérer ses élément un
par un au fur et à mesure des itérations.

Plus d'infos sur yield...

http://docs.python.org/tut/node11.html#SECTION0011900000000000000000

Plus particulièrement les chapitres sur les iterators et generators

Quand tout ceci sera assimilé, un petit tour sur la doc du module
"itertools" de la distro standard t'en dira un peu plus.

--
Gilles

Avatar
News M Claveau /Hamster-P
Bonjour !

Ce qu'a dit Gilles Lenfant est très juste. Toutefois, d'une manière plus
simple, on peut dire que :
yield donne l'élément suivant


@-salutations
--
Michel Claveau
Avatar
Jean-Baptiste Renard
Merci a tout les deux.

Vos explications et deux heures de "TP" improvisé m'ont permi
d'en savoir plus sur yeld. Le concept est vraiment très intéressant.

Salutations pythonesques
Avatar
Hervé Cauwelier
Gilles Lenfant wrote:
l = ("y", "i", "e", "l", "d")

def foo():
for x in range(len(l)):
yield l[x]


def foo():
for x in l:
yield x

est plus joli et plus pythonesque.

--
Hervé Cauwelier
http://www.oursours.net/

Avatar
Gilles Lenfant
Gilles Lenfant wrote:

l = ("y", "i", "e", "l", "d")

def foo():
for x in range(len(l)):
yield l[x]



def foo():
for x in l:
yield x

est plus joli et plus pythonesque.



Voui, voui, le truc qu'on apprend au bout des 10 premières minutes
d'apprentissage du Python :)

C'était intentionnel pour illustrer (maladroitement je l'admets puisque
je suis incompris - snif) le fait qu'avec de telles constructions, il
était possible d'explorer des bases de données ou fichier gigantesques
dans une boucle for...in... sans cramer tout plein de mémoire.

--
Gilles