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 :

Comment Python analyse l'instructon "n < i < p" ? [Python 3.X]


Sujet :

Python

  1. #1
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 691
    Points : 30 988
    Points
    30 988
    Billets dans le blog
    1
    Par défaut Comment Python analyse l'instructon "n < i < p" ?
    Bonjour à tous

    J'essaye de comprendre comment Python analyse l'instruction "n < i < p", qui fonctionne et qui indique si i est compris entre "n" et "p".

    En effet, j'ai beau me creuser la tête, je n'arrive pas à réaliser comment il fait la traduction.

    Prenons un exemple plus concret: print(2 < i < 6) qui affichera "vrai" pour i valant 3, 4 et 5 et "faux" pour toutes les autres valeurs. Si on fait une analogie avec le C, cette instruction est possible mais là je sais ce qui se passe. Elle est alors exécutée séquentiellement (évaluation "2 < i" qui renverra 1 ou 0 selon que le test est vrai ou n'est pas vrai ; puis ce résultat "1" ou "0" sera évalué par rapport à "6" ce qui renverra alors toujours vrai) et donc en C c'est clair que cette instruction ne produit pas le résultat intuitivement attendu. Et Python est écrit en C.

    Je remarque toutefois que je peux "forcer" les choses si j'écris print((2 < i) < 6) ce qui fait alors retomber Python dans le comportement décrit ci-dessus (ce qui montre en plus que cet opérateur "<" n'est pas associatif). Mais comment Python analyse alors le truc ? Y a-t-il un analyseur spécifiquement conçu pour ce type d'instruction ? Admettons. Mais que se passe-t-il alors si on étend (style 2 < i < 6 < 8) ???

    Merci à tous.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #2
    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,

    C'est juste de la syntaxe.
    1 < 2 < 3 équivaut à écrire 1 < 2 and 2 < 3.
    Pour le vérifier, il suffit d'écrire une fonction simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> def f(n):
    ...     return 1 < n < 2
    ...
    et de lire le pseudo-code avec dis.dis.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 691
    Points : 30 988
    Points
    30 988
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    C'est juste de la syntaxe.
    1 < 2 < 3 équivaut à écrire 1 < 2 and 2 < 3.
    Merci d'avoir répondu. Mais est-ce que tu veux dire que c'est juste une transpo et qu'une instruction style expr1 < expr2 < expr3 est retranscrite en interne en expr1 < expr2 and expr2 < expr3 ?

    Citation Envoyé par wiztricks Voir le message
    Pour le vérifier, il suffit d'écrire une fonction simple:et de lire le pseudo-code avec dis.dis.
    J'ai tenté ça sur 2 codes
    code 1
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def f(n):
    	return 1 < n < 5
     
    import dis
    dis.dis(f)

    code2
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def f(n):
    	return 1 < n and n < 5
     
    import dis
    dis.dis(f)

    Et voici ce que ça donne
    Code 1:
    6 0 LOAD_CONST 1 (1)
    2 LOAD_FAST 0 (n)
    4 DUP_TOP
    6 ROT_THREE
    8 COMPARE_OP 0 (<)
    10 JUMP_IF_FALSE_OR_POP 18
    12 LOAD_CONST 2 (5)
    14 COMPARE_OP 0 (<)
    16 RETURN_VALUE
    >> 18 ROT_TWO
    20 POP_TOP
    22 RETURN_VALUE
    Code 2:
    6 0 LOAD_CONST 1 (1)
    2 LOAD_FAST 0 (n)
    4 COMPARE_OP 0 (<)
    6 JUMP_IF_FALSE_OR_POP 14
    8 LOAD_FAST 0 (n)
    10 LOAD_CONST 2 (5)
    12 COMPARE_OP 0 (<)
    >> 14 RETURN_VALUE
    Ca ne me semble pas trop identique (mais j'ai peut-être mal utilisé cette librairie que je ne connais pas). En tout cas, l'écriture classique semble plus courte (plus efficace alors ?)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    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,

    La différence est l'implémentation de la chose décrite ici:
    Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z, except that y is evaluated only once (but in both cases z is not evaluated at all when x < y is found to be false).
    Et en gros, çà veut simplifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    n = f(x)
    1 < n and n < 3
    par 1 < f(x) < 3.
    Dans les deux cas, f n'est appelée qu'une seule fois.

    Pour le reste, "plus de pseudo-code" ne veut pas toujours dire moins rapide: il faut tester et arbitrer en fonction de la probabilité d'avoir à effectuer les 2 tests.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 691
    Points : 30 988
    Points
    30 988
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et en gros, çà veut simplifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    n = f(x)
    1 < n and n < 3
    par 1 < f(x) < 3.
    Dans les deux cas, f n'est appelée qu'une seule fois.
    Super, merci
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/12/2011, 16h00
  2. [Algo] + [Python] Analyse d'une formule
    Par WAKAKA dans le forum Général Python
    Réponses: 10
    Dernier message: 12/11/2011, 20h50
  3. JS:Redirector-H [Trj] - comment l'analyser
    Par keaton7 dans le forum Sécurité
    Réponses: 4
    Dernier message: 03/05/2009, 10h37
  4. [FAQ] Comment coder/dé-coder en Quote-Printable
    Par Delbeke dans le forum Vos contributions VB6
    Réponses: 0
    Dernier message: 30/07/2008, 10h48
  5. [File] comment python gere les encodage?
    Par anthyme dans le forum Général Python
    Réponses: 3
    Dernier message: 03/10/2006, 20h39

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