On parle de compréhension de liste, mais on peut faire des tuples, pas de dictionnaire (il me semble).
Version imprimable
On parle de compréhension de liste, mais on peut faire des tuples, pas de dictionnaire (il me semble).
OK merci :)
Ou plutôt :
Et que penses-tu du code suivant ? Si ça c'est pas ultra puissant :Code:
1
2 nums = map(lambda x: x*2, range(1,5))
Code:
1
2
3
4
5
6
7
8
9
10 from functools import * def list_mod(n): return partial(filter, lambda x: x % n == 0) f = list_mod(2) print f(range(100)) f = list_mod(3) print f(range(100))
Amusez-vous à faire aussi court, simple et lisible sans utiliser de programmation fonctionnelle (filter & partial) !Citation:
Envoyé par Matthieu Brucher
Ben zut alors, avec les listes on peut pas ! C'est bête !
Et un joli dico des caractères ASCII ! Un !Code:
1
2
3
4
5
6 from pprint import * l = range(32, 127) d = dict(zip(map(chr, l), map(lambda i: "0x%02x" % i, l))) pprint(d)
Ton exemple doit passer par zip pour fonctionner. Avec les compréhensions de list, on fait la même chose sans le zip.
La question était de savoir si on peut passer directement par un dictionnaire, la réponse est "non" avec les deux solutions.
Quant à ton premier problème, il utilise des fonctions supplémentaires, je peux très bien faire de même (et encore, sans fonction supplémentaire...)
Essaie juste de ne pas être autant acide dans tes réponses.
Sans partial et sans filter:
Comment ça avec les listes, on peut pas?Code:
1
2
3
4
5
6
7
8 def list_mod(n): return lambda x: [e for e in x if e % n == 0] f = list_mod(2) print f(range(100)) f = list_mod(3) print f(range(100))
et je trouve cette version plus lisible!Code:
1
2
3
4
5 from pprint import pprint liste = range(32, 127) d = dict( [(chr(n), "0x%02x" % n) for n in liste] ) pprint(d)
Thierry
J'allais sortir le premier exemple, j'y avais pensé en allant au boulot ;)
Plusieurs intérêts à cette méthode :
- plus court
- pas d'importation sauvage
et auun inconvénient supplémentaire :)
Perso je suis plus dev .net que python et j ai eu l'agreable surprise de voir que le nouveau C# 3 s'etait pas mal inspiré de python et a ajouter des fonction "lambda", quel agréable surprise ... :D
et la maintenant je vois que dans python 3 il vont retirer lambda ...8O
Je ne comprend pas vraiment c pourtant hyper pratique et élégant ...:?
Ca ne sera pas enlevé, il me semble. En revanche, ce n'est pas non plus super super utile, ça dépend des cas.
Tu as un peu triché, tu as utilisé "lambda" et "dict()".Citation:
Envoyé par Thierry Chappuis
Ce ne sont donc pas une solution purement à base de comprehension list.
Bon d'accord, je cherche la petite bête. :dehors:
Où ais-je triché? Tu avais avancé qu'il n'était pas possible d'écrire un code aussi concis que le tiens sans utiliser partial() ni filter(). Je n'ai utilisé aucune de ces deux fonctions.
En ce qui concerne dict(), je ne vois pas comment tu veux construire un dictionnaire à partir de listes en te passant de cette fonction. Mais bon, l'utilisation de cette fonction n'a rien à voir avec le débat map/filter vs compréhensions de listes.
Thierry
Ok ok, tout ça est super intéressant.
Bon j'ai encore pas mal de boulot je pense avant d'arriver à tout piger, à tout utiliser et à avoir votre niveau, mais c'est pas grave.
Merci pour tous ces renseignements.
Je viens de faire des recherche ... en fait ça fait des années que guido voulait enlever lambda mais pour ne pas casser la compatibilité il ne l'a pas fait sur la branche 2.x mais il disait qu'il allait le faire sur la 3.x
Finalement il y a un peu moins d un an il a dit qu'il le garderait car il n'a pas trouver d'alternative au moins aussi efficace bien qu'il n'aime pas trop le systeme.
bon bin c cool :)
Pour en savoir plus sur ce débat: http://www.artima.com/weblogs/viewpost.jsp?thread=98196. lambda, filter et map feront finalement bien partie de Python 3.0. Seule la fonction reduce() sera écartée.
Thierry
Je ne connaissais pas la fonction lambda. Je viens de lire un sujet posté par GuiGui sur la FAQ et je commence à comprendre l'utilité de celle-ci, notamment la possibilité de modifier facilement la valeur d'un Label par divers Button (l'exemple quoi...).
Par contre y a-t-il une utilisation de lambda qui pourrai permettre d'associer plusieurs fonctions à un seul Button.
Aujourd'hui, la seule façon que j'ai trouvé c'est d'appeler une fonction qui appelle toute les autres.
Le pricnipa de l'instruction lambda, c'est de créer une fonction rapidement qui ne fait qu'une seule chose.
C'est la même chose que :Code:f = lambda x: [e for e in x if e % n == 0]
Rien de plus.Code:
1
2 def f(x): return [e for e in x if e % n == 0]
Arf :
NB : je vais changer de profession, je vais me lancer dans la pub.Citation:
Envoyé par Anonyme