Précédent   Forum des professionnels en informatique > Autres langages > Python & Zope > Général Python
Général Python Forum d'entraide sur les fondamentaux du langage Python, syntaxe, POO, bibliothèque standard, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2012, 20h03   #1
Membre confirmé
 
Avatar de Luke spywoker
 
Homme
Etudiant informatique autodidacte
Inscription : juin 2010
Messages : 452
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Etudiant informatique autodidacte

Informations forums :
Inscription : juin 2010
Messages : 452
Points : 278
Points : 278
Par défaut 2 lacunes dans mes bases

Salut les pythons,
Je suis un python connaissant les bases du langage et ayant développer plusieurs applications qui fonctionnent (2000 lignes >) et j'ai donc développer un style et j'ai une petite expérience du python.

Mais je n'arrive pas combler 2 lacunes dans mes bases du langage:
-je n'arrive pas a mémoriser les syntaxes de car je ne les comprend pas:
--1) des fonction lambda.
--2) des listes d'expressions
A chaque fois que je dois utiliser ces notions je suis obliger de me plonger dans la doc après plusieurs échec des tests dans l'interpréteur.

Je sais qu'une fonction lambda est une fonction définis directement pour etre utiliser directement.
Je sais qu'une liste d'expression renvoie une liste en fonction de sa syntaxe.

Si il existe un Python a l'esprit didactique qui peut m'aider sa serai sympa, peut-etre sous forme de mémos écrit en pseudo-code.

Merci pour vos réponses et pour vos contribution a ma culture cybernétique.
Bon python a vous.
__________________
Pour faire tes armes:
Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
Et sois toujours bien armé avant de te lancer.
Le hasard ne sourit qu'aux gens préparés...
Blog: http://3dcyberspace.unblog.fr/
Site: Sanctuaire cybernétique
Luke spywoker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 21h28   #2
Membre habitué
 
Inscription : avril 2007
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 89
Points : 106
Points : 106
Pour les fonctions lambda:
est équivalent à
Code :
1
2
def f(a,b):
    return a+b
Plus généralement ce qui est entre lambda et ":" définit les arguments de la lambda fonction et ce qui est après définit l'expression retournée par la lambda fonction:

équivalent à
Code :
1
2
def f(...):
    return ***
Après si tu as du mal avec les lambda fonctions, tu peux utiliser des fonctions tout simplement.

Pour les listes d'expressions:
Je ne sais pas de quoi tu parles, ce qui suit c'est ce que tu appelles une liste d'expression ?
Code :
[attr for attr in dir(obj) if attr[0] != '_']
ZZelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 08h53   #3
Membre confirmé
 
Avatar de Luke spywoker
 
Homme
Etudiant informatique autodidacte
Inscription : juin 2010
Messages : 452
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Etudiant informatique autodidacte

Informations forums :
Inscription : juin 2010
Messages : 452
Points : 278
Points : 278
Merci pour la syntaxe des fonction lambda,
j'appelle une liste d'expression une structure qui commence avec:
en pseudo-code:
Code :
v for v in liste if v opérateur *
par exemple(je sais pas si c'est juste comme syntaxe).
J'ai ces lacunes car dans le livre qui m'a servi a apprendre les syntaxes de ces deux structure n'était que présent que sous forme d'exemple sans formulation syntaxique pure.
Merci pour votre aide.
PS: c'est aussi peut-etre du a l'interpréteur que j'utilise...?
__________________
Pour faire tes armes:
Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
Et sois toujours bien armé avant de te lancer.
Le hasard ne sourit qu'aux gens préparés...
Blog: http://3dcyberspace.unblog.fr/
Site: Sanctuaire cybernétique
Luke spywoker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 09h26   #4
Membre du Club
 
Inscription : juin 2011
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 35
Points : 50
Points : 50
Bonjour,

Voulez-vous parler de List Comprehension ou de Generator Expression ?
PsycoPy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 17h06   #5
Membre confirmé
 
Avatar de Luke spywoker
 
Homme
Etudiant informatique autodidacte
Inscription : juin 2010
Messages : 452
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Etudiant informatique autodidacte

Informations forums :
Inscription : juin 2010
Messages : 452
Points : 278
Points : 278
Salut,
c'est de List Comprehension dont je parlais.
__________________
Pour faire tes armes:
Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
Et sois toujours bien armé avant de te lancer.
Le hasard ne sourit qu'aux gens préparés...
Blog: http://3dcyberspace.unblog.fr/
Site: Sanctuaire cybernétique
Luke spywoker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 17h27   #6
Membre du Club
 
Inscription : juin 2011
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 35
Points : 50
Points : 50
Un exemple vaut souvent mieux qu'un long discourt :

Code :
1
2
3
4
ls = list()
for attr in dir(obj):
    if attr != '_':
        ls.append(attr)
Et voici l'équivalant avec une list comprehension :

Code :
ls = [ attr  for attr in dir(obj)  if attr != '_' ]
PS: Merci à ZZelle pour l'inspiration...
PsycoPy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 17h49   #7
Membre chevronné
 
Homme Bastien Montagne
Diverses et multiples
Inscription : mai 2008
Messages : 492
Détails du profil
Informations personnelles :
Nom : Homme Bastien Montagne
Localisation : France

Informations professionnelles :
Activité : Diverses et multiples

Informations forums :
Inscription : mai 2008
Messages : 492
Points : 768
Points : 768
En fait, les list comprehensions (ou dict…, ou tuple…, ou set…, maintenant, en py3) ne sont qu’un raccourcis de generator expressions…
est équivalent à…
Code :
list(a for a in range(10))
Et on peut donc les utiliser également pour générer un dict, par exemple:
Code :
{k: v for k, v in (('a', 1), ('b', 2), ('c', 3))}
Les exemples donnés ci-dessus n’ont évidemment pas grand intérêt, mais cette construction permet des conversions ou sélections d’iterables quelconques, relativement complexes, en une seule ligne. Leur expression abstraite est*:
Code :
expression(el1[, el2, …]) for el1[, el2, …] in iterable [if condition1 [if condition2 …]]
expression peut être toute expression python, appel d’une fonction, définition d’une liste/tuple/…, opérateurs comme l’addition/multiplication/etc.

for el1[, el2, …] in iterable est exactement la même chose qu’une boucle for classique*!

[if condition1 [if condition2 …]] sont un ou plusieurs tests – si l’un d’entre eux renvoie False, le ou les éléments en cours sont ignorés, et on passe direct aux suivants.

En forme développée, cela donne, pour une liste comprehension*:

Code :
1
2
3
4
5
6
7
8
lst = []
for el1[, el2, …] in iterable:
    [if condition1:
        continue
    [if condition2:
        continue
    ]]
    lst.append(expression(el1[, el2, …]))
De façon plus générale, une generator expression peut se “développer” comme cela:
Code :
function(expression(el1[, el2, …]) for el1[, el2, …] in iterable [if condition1 [if condition2 …]])
Code :
1
2
3
4
5
6
7
8
9
def gen(iterable):
    for el1[, el2, …] in iterable:
        [if condition1:
            continue
        [if condition2:
            continue
        ]]
        yield expression(el1[, el2, …]))
function(gen(iterable))
Je ne sais pas si c’est suffisamment clair… De toute façon, il en est de ces expressions comme des regex et de beaucoup d’autre chose – la meilleure façon de les comprendre, c’est de les utiliser (en commençant par des cas simples, évidemment).
__________________
Incantation : Méchant forum, arrête de transformer toutes mes espaces insécables en astérisques
mont29 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/02/2012, 21h28   #8
Modérateur
 
Inscription : juin 2008
Messages : 2 677
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 2 677
Points : 3 173
Points : 3 173
Salut,
Pensez aussi à lire les PEPs:Ils permettent de remettre les choses dans un contexte et décrivent les cas d'utilisation les plus courants.
- W
__________________
Architectures Post-Modernes
wiztricks est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 22h33   #9
Candidat au titre de Membre du Club
 
Serge
Inscription : février 2012
Messages : 12
Détails du profil
Informations personnelles :
Nom : Serge
Localisation : France

Informations forums :
Inscription : février 2012
Messages : 12
Points : 14
Points : 14
Bonjour.

Alors, j'apporte une petite précision sur les lambdas. Au départ, j'ai eu du mal à saisir le concept. M'en servir, oui, mais leur utilité, je ne comprenais pas.
Jusqu'au jour où j'ai commencé à comprendre la POO de python, et que tout est objet, y compris les fonctions.

Un exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
>>> def myFunction(x):
...     return x*x
... 
>>> f = myFunction
>>> l = lambda x: x*x
>>> f
<function myFunction at 0xb723f144>
>>> l
<function <lambda> at 0xb723f33c>
>>> f(64)
4096
>>> l(64)
4096
>>> dir(l)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
>>> dir(f)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
Ça peut paraître idiot, ou un truc de base pour n'importe quel programmeur, mais quand j'ai compris cela, j'ai ENFIN commencé à comprendre un peu mieux la POO "hors des classes de base".
Bon, après, on utilise (relativement) rarement les lambdas. Mais c'est toujours mieux de comprendre à quoi ça sert.

Edit : j'ai l'impression en me relisant de parler du seigneur des anneaux...
Sekigo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 03h21   #10
Membre Expert
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 435
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 435
Points : 2 416
Points : 2 416
Bonjour,

Petit complément pour la "list comprehension" (quel nom bizarre...): on peut utiliser plusieurs boucles 'for' à la suite, qui fonctionneront comme des boucles imbriquées:

Code :
1
2
print [ [i,j,k]  for i in range(4) for j in range(8) for k in range(3)]
[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], [0, 1, 1], [0, 1, 2], [0, 2, 0], [0, 2, 1], [0, 2, 2], [0, 3, 0], [0, 3, 1], [0, 3, 2], [0, 4, 0], [0, 4, 1], [0, 4, 2], [0, 5, 0], [0, 5, 1], [0, 5, 2], [0, 6, 0], [0, 6, 1], [0, 6, 2], [0, 7, 0], [0, 7, 1], [0, 7, 2], [1, 0, 0], [1, 0, 1], [1, 0, 2], [1, 1, 0], [1, 1, 1], [1, 1, 2], [1, 2, 0], [1, 2, 1], [1, 2, 2], [1, 3, 0], [1, 3, 1], [1, 3, 2], [1, 4, 0], [1, 4, 1], [1, 4, 2], [1, 5, 0], [1, 5, 1], [1, 5, 2], [1, 6, 0], [1, 6, 1], [1, 6, 2], [1, 7, 0], [1, 7, 1], [1, 7, 2], [2, 0, 0], [2, 0, 1], [2, 0, 2], [2, 1, 0], [2, 1, 1], [2, 1, 2], [2, 2, 0], [2, 2, 1], [2, 2, 2], [2, 3, 0], [2, 3, 1], [2, 3, 2], [2, 4, 0], [2, 4, 1], [2, 4, 2], [2, 5, 0], [2, 5, 1], [2, 5, 2], [2, 6, 0], [2, 6, 1], [2, 6, 2], [2, 7, 0], [2, 7, 1], [2, 7, 2], [3, 0, 0], [3, 0, 1], [3, 0, 2], [3, 1, 0], [3, 1, 1], [3, 1, 2], [3, 2, 0], [3, 2, 1], [3, 2, 2], [3, 3, 0], [3, 3, 1], [3, 3, 2], [3, 4, 0], [3, 4, 1], [3, 4, 2], [3, 5, 0], [3, 5, 1], [3, 5, 2], [3, 6, 0], [3, 6, 1], [3, 6, 2], [3, 7, 0], [3, 7, 1], [3, 7, 2]]
Ce qui donnera le même résultat que:

Code :
1
2
3
4
5
6
7
8
def toto():
    L = []
    for i in range(4):
        for j in range(8):
            for k in range(3):
               L.append([i,j,k])
    return L
print toto()
Et, puisqu'on parle sur ce fil de la "list comprehension" et de "lambda", il est quelquefois intéressant d'utiliser les 2 en même temps:

Code :
1
2
toto = lambda im, jm, km: [[i,j,k]  for i in range(im) for j in range(jm) for k in range(km)]
print toto(4,8,3)
Ce qui donne encore le même résultat que précédemment.
__________________
Tant que les ordinateurs ne trouvent pas eux-mêmes les prises de courant, nous avons des chances de maitriser la situation
Mes recettes python et linux: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 14h37   #11
Membre confirmé
 
Avatar de Luke spywoker
 
Homme
Etudiant informatique autodidacte
Inscription : juin 2010
Messages : 452
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Etudiant informatique autodidacte

Informations forums :
Inscription : juin 2010
Messages : 452
Points : 278
Points : 278
Merci pour vos explications et exemples dont certains me dépasse, pour les fonction lambda j'ai saisie la syntaxe de base:
Code :
lambda a b : return a+b
Mais pour les listes de compréhension un truc me dérange dans l'insertion de la syntaxe dans les circuits de ma mémoire:
C'est une boucle coupler avec une structure conditionnelle qui renvoie une liste mais dans cette boucle pourquoi ajouter une variable devant la boucle...?
Faut-il quelle soit la meme que celle dans la boucle ?
Est-ce la valeur retourner en fonction de la condition ?

PS: j'ai déja utilser une liste de compréhension dans un de mes programmmes pour extraire un fichier image, conditionnellement, d'un os.listdir() afin d'avoir le résultat dans une liste directement pour pouvoir directement l'utilser avec avec PIL et Tkinter (la référence a l'objet image doit etre contenus dans un conteneur pour sa pérénité dans l'espace de nom).

Merci pour vos réponses.
__________________
Pour faire tes armes:
Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
Et sois toujours bien armé avant de te lancer.
Le hasard ne sourit qu'aux gens préparés...
Blog: http://3dcyberspace.unblog.fr/
Site: Sanctuaire cybernétique
Luke spywoker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 14h55   #12
Membre chevronné
 
Homme Bastien Montagne
Diverses et multiples
Inscription : mai 2008
Messages : 492
Détails du profil
Informations personnelles :
Nom : Homme Bastien Montagne
Localisation : France

Informations professionnelles :
Activité : Diverses et multiples

Informations forums :
Inscription : mai 2008
Messages : 492
Points : 768
Points : 768
On n’“ajoute” pas une variable devant la boucle, on indique à python que faire de ce que la boucle génère. Le cas le plus simple est de l’utiliser tel quel*:

Code :
1
2
>>> [el for el in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Mais tu peux faire des opérations :

Code :
1
2
>>> [el%3 for el in range(10)]
[0, 1, 2, 0, 1, 2, 0, 1, 2, 0]
Appeler des fonctions*:

Code :
1
2
>>> [chr(el) for el in range(48, 58)]
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
etc.

À propos des lambda*:
1) N’oublie pas les virgules séparant les paramètres*!
2) Ne pas utiliser return*! Il est implicite, dans une lambda*:

__________________
Incantation : Méchant forum, arrête de transformer toutes mes espaces insécables en astérisques
mont29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 16h00   #13
Membre confirmé
 
Avatar de Luke spywoker
 
Homme
Etudiant informatique autodidacte
Inscription : juin 2010
Messages : 452
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Etudiant informatique autodidacte

Informations forums :
Inscription : juin 2010
Messages : 452
Points : 278
Points : 278
Merci cette fois le flux nerveux de la syntaxe des liste d'expression circule dans les méandres de ma mémoire j'ai fait un test qui comme toi a confirmer la supposition que j'ai faite et le test aussi:
Citation:
Est-ce la valeur retourner en fonction de la condition ?
par:
Code :
1
2
3
4
5
 
a=[('a',1),('b',2),('c',3)]
b=[ v[1] for v in a if v[0] == 'a']
b
[1]
Merci a tous ceux qui ont participer a combler ces lacunes maintenant je crois avoir les bases bien acquis sans lacune aucune.
__________________
Pour faire tes armes:
Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
Et sois toujours bien armé avant de te lancer.
Le hasard ne sourit qu'aux gens préparés...
Blog: http://3dcyberspace.unblog.fr/
Site: Sanctuaire cybernétique
Luke spywoker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 20h22   #14
Membre émérite
 
Avatar de fred1599
 
Inscription : juillet 2006
Messages : 975
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 975
Points : 981
Points : 981
Je ferais plutôt cela

Code :
b = [v for u, v in a if u == 'a']
__________________
Linux ubuntu 8.04 Aspire 5611ZWLMi Intel Core Duo 1,6 GHz
fred1599 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 20h49   #15
Membre confirmé
 
Avatar de Luke spywoker
 
Homme
Etudiant informatique autodidacte
Inscription : juin 2010
Messages : 452
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Etudiant informatique autodidacte

Informations forums :
Inscription : juin 2010
Messages : 452
Points : 278
Points : 278
Je ne savais pas qu'on pouvait donner les éléments des éléments afin itérer dessus a la boucle...?
Je pensais que for devrait itérer sur les tuples mais pas leurs contenus, est-ce-que la boucle analyse le (ici les) paramètre(s) qui lui sont passer...???
Peut tu expliquer la mécanique.
Car normalement en itérant sur la variable a, v devrai prendre la valeur du tuple...??? et comme tu lui donne 2 paramètres je ne vois pas comment, celle-çi qui est censé parcourir la variable a, peut accéder a son sous-contenus automatiquement.
J'aurai fait une double itération pour itérer sur le contenu du tuple ou donner l'indice comme je l'ai fait.
Je me coucherai vraiment moins bete ce soir.
__________________
Pour faire tes armes:
Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
Et sois toujours bien armé avant de te lancer.
Le hasard ne sourit qu'aux gens préparés...
Blog: http://3dcyberspace.unblog.fr/
Site: Sanctuaire cybernétique
Luke spywoker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 21h07   #16
Membre émérite
 
Avatar de fred1599
 
Inscription : juillet 2006
Messages : 975
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 975
Points : 981
Points : 981
Tu as une liste de tuples donc à la base on peut faire

Code :
1
2
3
4
5
6
7
8
9
10
11
>>> a=[('a',1),('b',2),('c',3)]
>>> u, v = a[0]
>>> u
'a'
>>> v
1
>>> for u, v in a:
...     if u == 'a':
...         print v
... 
1
__________________
Linux ubuntu 8.04 Aspire 5611ZWLMi Intel Core Duo 1,6 GHz
fred1599 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 22h14   #17
Expert Confirmé
 
Homme Patrice
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Patrice
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien Help Desk, maintenance, réseau, système et +
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2006
Messages : 2 032
Points : 2 600
Points : 2 600
Bonsoir,

Petit quizz par rapport à ceci (désolé tyrtamos, c'est l'exemple le plus complet pour un cut/paste...):

Citation:
Envoyé par tyrtamos Voir le message
Code :
print [ [i,j,k]  for i in range(4) for j in range(8) for k in range(3)]
...
Code :
1
2
3
4
5
6
7
8
def toto():
    L = []
    for i in range(4):
        for j in range(8):
            for k in range(3):
               L.append([i,j,k])
    return L
print toto()
...
Code :
1
2
toto = lambda im, jm, km: [[i,j,k]  for i in range(im) for j in range(jm) for k in range(km)]
print toto(4,8,3)
Ce qui donne encore le même résultat que précédemment.
Si le résultat est le même le plus lisible n'est il pas préférable ? (import this/pep's)

Pour la performance ? Difficile de faire plus rapide que for/in (et in en général pour le code) pour une itération.
A la limite une closure ?

Bref, il existe des limites aux (object)compréhensions et autres lambda: La lecture du code (quand jeune padawan relira son code plus tard, les cheveux il s'arracheras et sa pythonnerie il regretteras).

Votre avis ?

@+
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 23h37   #18
Membre émérite
 
Avatar de fred1599
 
Inscription : juillet 2006
Messages : 975
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 975
Points : 981
Points : 981
Citation:
Bref, il existe des limites aux (object)compréhensions et autres lambda: La lecture du code
Je ne trouve pas que c'est un frein à la compréhension d'un code. Quand je lis les codes sur le net, beaucoup utilise les lists comprehensions, et ça ne me gêne pas en soi.

Bref, à partir du moment où t'en as bouffé, lire ou écrire vient strictement au même, mais j'avoue très certainement que l'expérience à ce niveau paie.
__________________
Linux ubuntu 8.04 Aspire 5611ZWLMi Intel Core Duo 1,6 GHz
fred1599 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 23h51   #19
Membre Expert
 
Homme
Inscription : mars 2007
Messages : 772
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : mars 2007
Messages : 772
Points : 1 040
Points : 1 040
Bonsoir,

Citation:
Envoyé par PauseKawa Voir le message
Si le résultat est le même le plus lisible n'est il pas préférable ? (import this/pep's)
Je suis d'accord, mais lequel est le plus lisible ?
Je suppose que tu trouves le 3ème code moins lisible que les autres, mais il fait "un peu plus" que les autres; il crée une fonction paramétrée. Ce serait inutilement complexe de l'écrire ainsi si la fonction n'était appelée qu'une seule fois, mais sinon c'est utile.
Bien sûr on peut aussi l'écrire:
Code :
1
2
def toto(im, jm, km):
    return [[i,j,k]  for i in range(im) for j in range(jm) for k in range(km)]
Mais est-ce vraiment moins lisible avec lambda ?

Citation:
Bref, il existe des limites aux (object)compréhensions et autres lambda: La lecture du code (quand jeune padawan relira son code plus tard, les cheveux il s'arracheras et sa pythonnerie il regretteras).
Pour ma part, je trouve que les compréhensions augmentent la lisibilité (en règle générale). Le seul cas où j'évite de les utiliser, c'est avec des effets de bord, par exemple un print() dans une compréhension (ce qui est possible en Python 3), je n'aime pas...

Pour les lambda c'est moins le cas, mais elles ont leur place, par exemple pour préciser l'argument key avec la méthode sort ou pour certains callbacks avec tkinter par exemple.

Et ces constructions ne sont pas nécessaires pour écrire un code illisible
dividee est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 00h03   #20
Membre chevronné
 
Homme Bastien Montagne
Diverses et multiples
Inscription : mai 2008
Messages : 492
Détails du profil
Informations personnelles :
Nom : Homme Bastien Montagne
Localisation : France

Informations professionnelles :
Activité : Diverses et multiples

Informations forums :
Inscription : mai 2008
Messages : 492
Points : 768
Points : 768
Certes, utiliser ce genre de fonctionnalités “avancées” n’est pas indispensable, et “complique” la lecture pour quelqu’un de moins expérimenté/habitué…

Mais sans même parler de performances, rien que le fait d’utiliser quatre ou cinq lignes de moins, moi, quand je travaille sur de gros fichiers, ça me parle…

Et à choisir, je préfère encore largement une list comprehension, même complexe, à (par exemple) ce truc de l’initialisation par défaut des paramètres optionnels de fonction (qui fait qu’on se retrouve avec le même objet à chaque appel de la fonction…) –*ça c’est un truc vraiment vicieux, à la (re)lecture d’un code… Et pourtant, ça peut être diablement pratique, parfois*!
__________________
Incantation : Méchant forum, arrête de transformer toutes mes espaces insécables en astérisques
mont29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h52.


 
 
 
 
Partenaires

Hébergement Web