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 :

Demande d'aide pour comprendre des syntaxes Python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Par défaut Demande d'aide pour comprendre des syntaxes Python
    Bonjour,

    Je suis actuellement en train de porter en C# le code d'une application Python et je rencontre pas mal de difficultés car je n'ai aucune connaissance en Python, excepté celles que j'ai glané sur le net au fur et à mesure, et bien sûr le code n'est pas commenté...

    Je bloque en particulier sur ces mystérieuses incantations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    small_black = [block for block in black_blocks if block not in large_black]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lowest = sorted(histogram.items(), lambda a, b: a[1]-b[1])[0][0]
    (vous pourriez aussi m'expliquer l'effet du paramètre 'L' dans la suivante aussi ? Je n'ai pas trouvé de documentation à ce sujet)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char = Image.new('L', [d+2 for d in image.size])
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    greatest_diff = (0, None)
    Pourriez-vous m'expliquer la signification de ces lignes ?

    Merci d'avance !

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    small_black = [block for block in black_blocks if block not in large_black]
    regarde du coté des listes comprehension ou mutation de liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lowest = sorted(histogram.items(), lambda a, b: a[1]-b[1])[0][0]
    sorted (je ne connais pas) semble retour un iterable dont [0][0] est le 1er element du 1er element
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char = Image.new('L', [d+2 for d in image.size])
    faut chercher dans la doc de la lib
    c'est une liste contenant un tuple
    matrice vide de taille number : [[]]*5 ==> [[],[],[],[],[]]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    greatest_diff = (0, None)
    simple tuple
    delete une entrée de la liste black_bloks

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Par défaut
    Bonsoir josmiley et merci de m'aider.

    Citation Envoyé par josmiley Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    small_black = [block for block in black_blocks if block not in large_black]
    regarde du coté des listes comprehension ou mutation de liste
    J'ai trouvé ce que c'est sur Wikipédia mais j'aurais besoin d'une explication parce que là je suis un peu largué (quoique je suis peut-être juste fatigué).

    Citation Envoyé par josmiley Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lowest = sorted(histogram.items(), lambda a, b: a[1]-b[1])[0][0]
    sorted (je ne connais pas) semble retour un iterable dont [0][0] est le 1er element du 1er element
    AH ! Je crois que j'ai compris ! D'après la documentation que j'ai trouvée, le second argument, ici "lambda a, b: a[1]-b[1]", doit correspondre à une fonction qui renvoi une valeur négative si le premier argument est plus petit que le second argument, zéro s'il est égal ou une valeur positive s'il est supérieur. Donc en fait "lambda a, b: a[1]-b[1]" se traduit par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int comparer(object[] a, object[] b)
    {
        return a[1] - b[1];
    }
    Si a[1] vaut 5 et b[1] vaut 10, la fonction retournera -5 signifiant a < b, donc la fonction "sorted" triera le contenu de "histogram" selon cette comparaison. Mais pourquoi retourner un tableau de tableaux (object[][]) ?? Dans le code la variable est déclarée comme ceci :
    Ce devrait être un tableau à une seule dimension donc la fonction devrait retourner un tableau trié à une dimension. Notez qu'il utilise des accolades et non des crochets, donc je c'est pas ce que c'est vraiment et c'est peut-être un truc complètement différent finalement...

    Citation Envoyé par josmiley Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char = Image.new('L', [d+2 for d in image.size])
    faut chercher dans la doc de la lib
    J'ai cherché sur cette documentation mais ils ne précisent pas à quoi correspond le 'L' et je ne comprend pas ce que contient vraiment le second paramètre. Si quelqu'un connaît la bibliothèque Image de Python...

    Citation Envoyé par josmiley Voir le message
    c'est une liste contenant un tuple
    matrice vide de taille number : [[]]*5 ==> [[],[],[],[],[]]
    OK.

    Citation Envoyé par josmiley Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    greatest_diff = (0, None)
    simple tuple
    En fait c'est comme un bête tableau ? Du genre "[x,y]" (éventuellement considéré comme un type d'objet différent) ?

    Citation Envoyé par josmiley Voir le message
    delete une entrée de la liste black_bloks
    Sa veut dire "black_blocks[wide] = null" ou carrément que la case est retirée du tableau ?

    En bonus track je rajoute la ligne suivante :
    -1 ?? Les index de tableaux ne commencent pas forcément à zéro ?

    Aaaaah, j'aime pas trop les serpents mais à cette allure ça va devenir chronique...

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    small_black = [block for block in black_blocks if block not in large_black]
    construit une liste avec tous les éléments de black_blocks à condition qu'ils ne soient pas dans large_black

    C'est une autre façon d'écrire la suite d'instructions suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    small_black = []
    for block in black_blocks:
        if block not in large_black:
            small_black.append(block)
    La list comprehension est plus concise, mais surtout il y a sans doute derrière une manière de construire la liste un peu différente, et au final la list comprehension est plus rapide que son équivalent multi-lignes.

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Quelques compléments.

    Python dispose de plusieurs sortes de groupement de données:

    liste: L=[1,2,3]
    tuple: T=(1,2,3)
    dictionnaire: D={'a':12, 'b':82, 'c':45}

    Contrairement à d'autres langages, ces groupements peuvent contenir n'importe quoi, être hétérogènes et même être redéfinis pendant l'exécution: L=[3,"toto",True,6.12e3,complex(5,9),('x','y'), [78,[85,7]]]. On peut donc avoir des listes de listes, des listes de tuples, des tuples de listes, etc...

    L'avantage principal de la liste c'est qu'elle est modifiable, contrairement au tuple.

    L'avantage principal du dictionnaire, c'est que les clés sont "hashées", ce qui permet de retrouver la valeur d'une clé très rapidement.

    "sorted(liste)" est effectivement une fonction de tri qui a l'avantage de renvoyer la liste triée, au contraire de liste.sort() qui trie la liste "sur place" sans rien renvoyer.

    Sa fonction lambda est effectivement une fonction de comparaison, et permet ici de trier selon la 2ème valeur de chaque élément.

    "histogram" est un dictionnaire (=accolades) composé de couples "clé:valeur", comme par exemple: {'a':12, 'b':82, 'c':45}. Par contre, "histogram.items()" convertit ce dictionnaire en liste de tuple, chaque tuple étant un couple (clé,valeur): [('a', 12), ('c', 45), ('b', 82)]. Donc, la fonction de tri sorted() trie ici cette liste selon la valeur des clés.

    Et une fois triée, cette liste de tuple fait l'objet d'une extraction avec [0][0]: lowest a donc comme valeur la clé correspondant au 1er tuple après tri.

    del black_blocks[wide]: efface de la liste black_blocks la valeur dont l'indice est wide. Par exemple, si black_blocks=[1,2,3,4,5] et wide=3, le résultat sera: black_blocks=[1,2,3,5].

    Les listes commencent toutes à l'indice 0. Par contre, quand l'indice est négatif, Python ajoute la longueur de la liste pour trouver le vrai indice positif. Ainsi, L[-1] correspond au dernier élément de la liste (indice=len(L)-1), et L[-2] à l'avant dernier (etc...): c'est très pratique. Python est très doué pour manipuler des listes.

    Tyrtamos

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    pour la question sur Image.new()
    regarde ici à la page 2 les modes sont expliqués
    http://www.google.fr/url?sa=t&source...xShWv_duv20ltg

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Le mot 'tableau' se traduit en anglais par 'array','table','roll','list'.

    Je ne me souviens pas avoir rencontré les termes 'array','table','roll' dans les docs anglaises pour désigner des structures de données Python.

    J'estime donc que l'emploi du terme 'tableau' pour désigner des structures de données Python doit être banni car cela n'apporte que de l'imprécision ou pire de la confusion.



    Par exemple, quand tu écris
    Ce devrait être un tableau à une seule dimension donc la fonction devrait retourner un tableau trié à une dimension.
    aucun Pythonien ne comprend qu'il s'agit d'un dictionnaire. On ne comprend ce dont tu parles que parce que ces lignes sont précédées de: histogram = {}


    De même,
    En fait c'est comme un bête tableau ? Du genre "[x,y]" (éventuellement considéré comme un type d'objet différent) ?
    on ne comprend pas qu'il s'agit d'un tuple.
    Un tuple (x,y) est effectivement du même genre qu'une liste [x,y] en ce sens que ces deux structures de données sont toutes deux des collections. Mais leur différence n'est pas du tout éventuelle, elle est fondamentale: une liste est mutable tandis qu'un tuple et immutable (ou immuable).



    On rencontre par contre ici ou là dans les docs anglaises les termes 'collection' ou 'sequence' ou 'container' ou 'iterable' utilisés pour désigner globalement plusieurs structures de données à la fois, dans des sens qui sont plus précis que je ne le pensais: en consultant la page suivante, on s'aperçoit que chacun de ces termes désigne une structure de données possédant une méthode précise: les containers comportent __contains__() ,etc.
    http://docs.python.org/library/collections.html









    Le terme 'array', c'est à dire 'tableau', est utilisé à profusion dans le module numpy. C'est pourquoi je parlais plus haut de confusion car en lisant ce terme, on ne sait jamais si quelqu'un veut parler à tort d'une structures de données habituelle ou s'il se place dans le cadre de numpy.

    Mais les tableaux ne sont pas le seul type de structure de données dans numpy.

    Quoiqu'il en semble d'après l'apparence visuelle des tableaux quand il sont de dimension 2, les tableaux numpy ne sont pas des matrices au sens mathématique, c'est à dire qu'il ne supportent pas les opérations caractéristiques des matrices.
    Les tableaux numpy supportent des «element-wise operations» (je ne me risque pas à traduire) tandis que les matrices supportent les opérations de l'algèbre linéaire.

    Pour combler cette différence, il y a en fait deux classes dans numpy: la classe array et la classe matrix. Les instances de la classe matrix sont exclusivement de dimension 2, elles supportent les opérations d'algèbre linéaire.
    Plus de détails ici:
    http://www.scipy.org/NumPy_for_Matlab_Users

    Comme pour le terme de 'tableau' ou 'array', on ne rencontre aussi jamais le terme de 'matrice' dans Python. Voilà pourquoi il est n'est pas moins condamnable d'employer le terme de 'matrice' que celui de 'tableau' dans le cadre de codes exclusivement Python.

    D'ailleurs s'il est possible d'écrire [[]]*5 en Python, cela n'a aucun sens correspondant en mathématique: il n'existe pas de matrice dénuée de tout élément.
    De même, si [[]]*5 est censé être une matrice, 4*[[8]] devrait en être une aussi; or en Python 4*[[8]] est [[8], [8], [8], [8]] et non pas [[32]] comme on s'y attendrait de la part d'une opération linéaire sur une matrice.




    « On ne peut perfectionner la science sans perfectionner le langage »
    Lavoisier.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Demande d'aide pour extraire des données Excel à l'aide python
    Par userinfo dans le forum Général Python
    Réponses: 5
    Dernier message: 05/01/2013, 11h45
  2. Aide pour comprendre la syntaxe d'une macro
    Par virtuadrack dans le forum C
    Réponses: 6
    Dernier message: 28/10/2009, 12h38
  3. aide pour comprendre des Script perl
    Par la_star160 dans le forum Langage
    Réponses: 2
    Dernier message: 17/07/2008, 20h40
  4. demande d'aide pour comprendre une requete SQL
    Par Halloula dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/04/2008, 18h14

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