Une très bête question "and" comme "or"?

Une très bête question "and" comme "or"? - Python - Programmation

Marsh Posté le 08-09-2015 à 22:08:14    

Bonjour,
 
très bête question, j'ai honte mais je ne comprends pas pourquoi python fait la différence entre
 
        if X in Z and Y in Z  
        if X and Y in Z
 
 
Dasn le premier cas, il va chercher toute les occurences de 'Z' qui remplissent les deux critères (x et y), dans l'autre il va lister toutes les occurences qui contiennet x ou y dans z => le and est interprêté comme un "or"
 
Moi pas comprendre :-/
 
merci d'avance :hello:


---------------
"La chance de voir une biche" Archlinux :: http://www.archlinux.org/ ::
Reply

Marsh Posté le 08-09-2015 à 22:08:14   

Reply

Marsh Posté le 08-09-2015 à 22:56:57    

Ca serait pas une question de priorité des opérateurs du genre :
if (x in z) and (y in z)
if (x) and (y in z)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 09-09-2015 à 11:02:40    

rufo a écrit :

Ca serait pas une question de priorité des opérateurs du genre :
if (x in z) and (y in z)
if (x) and (y in z)


Correct. La première expression vérifie que x est dans z et y est dans z, la seconde vérifie que x (est "truthy" ), et que y est dans z (mais pas que x est dans z).

 

Nota bene: (x and y) in z ne va pas non plus vérifier que `x in z and y in z`, c'est pas comme ça que ça marche (si `x` est truthy ça va vérifier que `x in z`, sinon ça va vérifier que `y in z`, mais jamais les deux)

Message cité 1 fois
Message édité par masklinn le 09-09-2015 à 11:03:39

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 09-09-2015 à 22:24:24    

La première expression "if X in Z and Y in Z" est une expression booléenne.
 
Dans un monde, où la deuxième expression "if X and Y in Z" serait équivalente à la première expression, il s'agirait de la représentation d'une expression ensembliste.
 
Les opérateurs or et and sont opérateurs booléens, on ne peut pas les utiliser comme des opérateurs ensemblistes. Et donc la deuxième expression se comporte comme une expression booléenne. (Les posts ci-dessus expliquent très bien comment est interprété cette expression donc je ne vais pas revenir dessus.)
 
Pour écrire des expressions ensemblistes, il faudrait que le langage puisse utiliser des opérateurs ensemblistes qui serait probablement nommé union et intersect ce qui donnerait probablement un truc du genre "if (X union Y) in Z". Ou que le langage soit capable : soit de distinguer à la volée les 2 types d'expressions pour y appliquer les bons opérateurs, soit d'avoir des marqueurs implictes à cet usage du genre "ifensemblist X and Y in Z".
 
in est un opérateur ensembliste, il s'agit d'un include.
 
edit: apparemment, python a une syntaxe ensembliste : https://docs.python.org/2/library/stdtypes.html#set
Et donc il suffit d'utiliser union (|) à la place de and et utiliser issuperset pour vérifier si l'ensemble complet est inclus dans l'autre.
 
Un truc du genre "if (x|y).issuperset(z)".

Message cité 1 fois
Message édité par czh le 09-09-2015 à 23:16:35
Reply

Marsh Posté le 10-09-2015 à 17:26:59    

rufo a écrit :

Ca serait pas une question de priorité des opérateurs du genre :
if (x in z) and (y in z)
if (x) and (y in z)


masklinn a écrit :


Correct. La première expression vérifie que x est dans z et y est dans z, la seconde vérifie que x (est "truthy";), et que y est dans z (mais pas que x est dans z).
 
Nota bene: (x and y) in z ne va pas non plus vérifier que `x in z and y in z`, c'est pas comme ça que ça marche (si `x` est truthy ça va vérifier que `x in z`, sinon ça va vérifier que `y in z`, mais jamais les deux)


czh a écrit :

La première expression "if X in Z and Y in Z" est une expression booléenne.
 
Dans un monde, où la deuxième expression "if X and Y in Z" serait équivalente à la première expression, il s'agirait de la représentation d'une expression ensembliste.
 
Les opérateurs or et and sont opérateurs booléens, on ne peut pas les utiliser comme des opérateurs ensemblistes. Et donc la deuxième expression se comporte comme une expression booléenne. (Les posts ci-dessus expliquent très bien comment est interprété cette expression donc je ne vais pas revenir dessus.)
 
Pour écrire des expressions ensemblistes, il faudrait que le langage puisse utiliser des opérateurs ensemblistes qui serait probablement nommé union et intersect ce qui donnerait probablement un truc du genre "if (X union Y) in Z". Ou que le langage soit capable : soit de distinguer à la volée les 2 types d'expressions pour y appliquer les bons opérateurs, soit d'avoir des marqueurs implictes à cet usage du genre "ifensemblist X and Y in Z".
 
in est un opérateur ensembliste, il s'agit d'un include.
 
edit: apparemment, python a une syntaxe ensembliste : https://docs.python.org/2/library/stdtypes.html#set
Et donc il suffit d'utiliser union (|) à la place de and et utiliser issuperset pour vérifier si l'ensemble complet est inclus dans l'autre.
 
Un truc du genre "if (x|y).issuperset(z)".


merci à tous les trois pour ces réponses claires, et mention spéciale à czh pour explication fondamentale :-)
J'ai appris un truc important.
:hello:


---------------
"La chance de voir une biche" Archlinux :: http://www.archlinux.org/ ::
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed