IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

2 lacunes dans mes bases


Sujet :

Python

  1. #1
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    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...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Points : 135
    Points
    135
    Par défaut
    Pour les fonctions lambda:
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    [attr for attr in dir(obj) if attr[0] != '_']

  3. #3
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Merci pour la syntaxe des fonction lambda,
    j'appelle une liste d'expression une structure qui commence avec:
    en pseudo-code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 43
    Points : 67
    Points
    67
    Par défaut
    Bonjour,

    Voulez-vous parler de List Comprehension ou de Generator Expression ?

  5. #5
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    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...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 43
    Points : 67
    Points
    67
    Par défaut
    Un exemple vaut souvent mieux qu'un long discourt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    ls = [ attr  for attr in dir(obj)  if attr != '_' ]
    PS: Merci à ZZelle pour l'inspiration...

  7. #7
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    list(a for a in range(10))
    Et on peut donc les utiliser également pour générer un dict, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    function(expression(el1[, el2, …]) for el1[, el2, …] in iterable [if condition1 [if condition2 …]])
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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).

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    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.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 48
    Points : 105
    Points
    105
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  11. #11
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Merci pour vos explications et exemples dont certains me dépasse, pour les fonction lambda j'ai saisie la syntaxe de base:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  12. #12
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> [el%3 for el in range(10)]
    [0, 1, 2, 0, 1, 2, 0, 1, 2, 0]
    Appeler des fonctions*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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*:


  13. #13
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    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:
    Est-ce la valeur retourner en fonction de la condition ?
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  14. #14
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Je ferais plutôt cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b = [v for u, v in a if u == 'a']
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  15. #15
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    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...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  16. #16
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Tu as une liste de tuples donc à la base on peut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  17. #17
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 725
    Points : 4 005
    Points
    4 005
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    print [ [i,j,k]  for i in range(4) for j in range(8) for k in range(3)]
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  18. #18
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    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.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  19. #19
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

    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

  20. #20
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    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*!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. j'arrive pas à insérit tous mes donnée dans ma base
    Par thecharmer dans le forum Général Java
    Réponses: 1
    Dernier message: 24/04/2008, 18h03
  2. mes _FK ne sont pas persistés dans ma base oracle
    Par mickael.guilbert dans le forum JPA
    Réponses: 4
    Dernier message: 08/02/2008, 11h01
  3. Problème de fichiers dans les dossiers de mes bases
    Par grinder59 dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 20/07/2007, 20h14
  4. [mysql] récuperer mes infos dans ma base !
    Par dekovince dans le forum Requêtes
    Réponses: 10
    Dernier message: 17/04/2007, 14h06
  5. comment liè mes image dans ma base mysql
    Par hiagro dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 12/06/2006, 10h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo