web-dev-qa-db-fra.com

Python "si X == Y et Z" syntaxe

Est ce que ca:

if key == "name" and item:

signifie la même chose que ceci:

if key == "name" and if key == "item":

Si c'est le cas, je suis totalement confus à propos de exemple 5.14 dans Dive Into Python . Comment la clé peut-elle être égale à la fois à "nom" et à l'élément? D'autre part, "and item" demande-t-il simplement si l'élément existe en tant que variable?

13
bsamek

if key == "name" and item: signifie if (key == "name") and (item evaluates to True)

Gardez à l'esprit que (item evaluates to True) est possible de plusieurs manières. Par exemple, if (key == "name") and [] sera évalué à False

33
Manoj Govindan

Manoj l'a bien expliqué. Voici quelques notes complémentaires.

Le pseudocode

if key == "name" or if key == "item":

devrait être de cette façon:

if key == "name" or key == "item":

Un idiome intéressant à faire est:

if key in ("name", "item"):

mais il est plus utile pour de très grandes conditions où vous voulez juste savoir si une valeur est égale à une autre valeur d'une liste.

9
brandizzi

Non, vous devez répéter l'expression. Il évalue deux conditions distinctes et vérifie si les deux sont vraies -

  1. x == y
  2. z

Consultez la documentation Python pour obtenir une liste de ce qui est considéré comme faux en Python

(Cependant, il est intéressant de noter que, contrairement aux autres langues, les suivantes:

if 3 < x < 6

est équivalent à

if x > 3 and x < 6

)

4
froadie

Si, hypothétiquement, vous vouliez

if key == "name" and if key == item:

tu pourrais faire ça

if key == "name" == item:
3
Dave Aaron Smith

D'autres ont expliqué comment l'expression dont vous parlez est évaluée. Une chose importante à savoir est que si le premier opérande de l'opérateur "and" est évalué à false, le second n'est jamais évalué, car le résultat de "and" est toujours false si un opérande est false et si vous connaissez le premier. l'opérande est faux, alors l'ensemble "et" est faux et vous n'avez pas à évaluer le second. Cela s'appelle "court-circuiter" et s'applique à "ou" ainsi qu'à "et" (sauf que "ou" est toujours vrai quand l'un des opérandes est vrai, donc le deuxième opérande est évalué seulement quand le premier est faux).

Vous devez également savoir que le résultat de l'opération "et" complète correspond à la valeur du dernier opérande évalué. Etant donné que les éléments autres que les constantes littérales Vrai et Faux sont considérés comme étant vrais ou faux logiquement, ce fait (combiné à un court-circuit) peut remplacer le "si" dans certaines situations, et vous le verrez parfois utilisé de cette façon. . 

Par exemple, "x ou y" est évalué à x si x est vrai, mais à y si x est faux. Parfois, cela est utilisé pour fournir des valeurs par défaut pour les valeurs manquantes:

name = raw_input("Enter your name: ") or "dude"
print "Hello, %s!" % name

Si vous n'entrez rien à l'invite, appuyez simplement sur Entrée. La valeur renvoyée par raw_input est la chaîne vide, "", qui est considérée comme fausse. Comme la branche gauche du "ou" est fausse, elle ne court-circuite pas et la branche droite est évaluée. Le résultat du "ou" est donc "mec". Si vous entrez une valeur à l'invite, la branche droite ne sera jamais évaluée, en raison d'un court-circuit. La valeur du "ou" est donc celle que vous avez entrée.

Beaucoup de gens considèrent que le fait d'abuser des opérateurs booléens de cette façon est médiocre maintenant que Python a "x si y d'autre z", mais cette utilisation me semble assez lisible. (Mais c'est à peu près le seul!) "La valeur est ceci, ou celle si c'est vide." Comparez-le à ce qui suit:

name = raw_input("Enter your name: ")
name = name if name else "dude"
print "Hello, %s!" % name
1
kindall

@Victor Neo: De plus, vous n'avez pas besoin de booléen séparé:

for happy in (False, "Peter", '', "Susan" , []):
    print(happy + ' is happy.' if happy else 'Everybody is bored.')

Si l'instruction est préférable à l'utilisation de or et and avec des non-booléens, qui émulent l'effet avant que value if condition else value ne soit disponible en Python.

0
Tony Veijalainen

Si vous regardez le code par exemple 5.14:

def __setitem__(self, key, item):         
    if key == "name" and item:            
        self.__parse(item)                
    FileInfo.__setitem__(self, key, item)

item est une variable, similaire à la clé.

Il peut être utilisé dans l'instruction if s'il évalue soit true ou false.

par exemple.

happy = True
name = "Peter"
if name == "Peter" and happy:
    print name + " is happy!"
0
Victor Neo