17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Utiliser les generators et les genexp<br />

Bonnes pratiques et optimisation du code<br />

CHAPITRE 13<br />

Les generators offrent une manière élégante et performante de récupérer les résultats<br />

intermédiaires d’une fonction sans avoir à implémenter un système de callback.<br />

Generator infini, suite de Fibonacci<br />

>>> def fibonacci():<br />

... a, b = 0, 1<br />

... while 1:<br />

... yield b<br />

... a, b = b, a+b<br />

...<br />

>>> fib = fibonacci()<br />

>>> [fib.next() for val in range(10)]<br />

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]<br />

Cette mécanique peut être mise en place dans tous les algorithmes de génération de<br />

séquences.<br />

Les generators expressions sont quant à eux l’équivalent des list comprehensions<br />

pour les iterators et permettent des gains de mémoire.<br />

Genexp<br />

>>> def gen(sequence):<br />

... for element in sequence:<br />

... yield element + 1<br />

...<br />

>>> genexp = gen([1, 2, 3, 4])<br />

>>> list(genexp)<br />

[2, 3, 4, 5]<br />

>>> # écriture équivalente en genexp<br />

...<br />

>>> genexp = (element + 1 for element in [1, 2, 3, 4])<br />

>>> list(genexp)<br />

[2, 3, 4, 5]<br />

Préférer les fonctions d’itertools<br />

itertools, module présenté au chapitre 10, implémente des fonctions codées en C<br />

qui permettent de générer très rapidement des iterators pouvant être utilisés pour<br />

remplacer certaines primitives, comme :<br />

map() ;<br />

filter() ;<br />

reduce() ;<br />

zip().<br />

449

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!