Comment faire « et » et « ou » travail lorsqu'ils sont combinés dans une déclaration?

StackOverflow https://stackoverflow.com/questions/2579959

Question

Pour une raison quelconque cette fonction me confondre:

def protocol(port):
    return port == "443" and "https://" or "http://"

Quelqu'un peut-il expliquer l'ordre de ce qui se passe dans les coulisses pour faire ce travail comme il le fait.

je l'ai compris que jusqu'à ce que je l'ai essayé:

Soit A)

def protocol(port):
    if port == "443":
        if bool("https://"):
            return True
    elif bool("http://"):
        return True
    return False

Ou B)

def protocol(port):
    if port == "443":
        return True + "https://"
    else:
        return True + "http://"

Est-ce une sorte de cas particulier en Python, ou suis-je complètement malentendu comment fonctionnent les déclarations?

Était-ce utile?

La solution

Il est un idiome ancien ish; insérer entre parenthèses pour montrer la priorité,

(port == "443" and "https://") or "http://"

retourne x and y y si x est truish, x si x est falsish; a or b, vice-versa, retourne a si elle est truish, sinon b.

Donc, si port == "443" est vrai, cela renvoie la partie droite de la and, à savoir "https://". Dans le cas contraire, le and est faux, de sorte que le or obtient en jeu et retourne ` "http: //"., son RHS

En Python moderne, une meilleure façon de le faire traduire cet idiome ancien ish est:

"https://" if port == "443" else "http://"

Autres conseils

and retourne l'opérande de droite si la gauche est vrai. or retourne l'opérande de droite si la gauche est fausse. Sinon, ils renvoient toutes les deux l'opérande gauche. Ils sont dits soudent .

C and X or Y est le début de longue date tentative par les utilisateurs Python proxy pour C ? X : Y

Pour la plupart, il fonctionne, sauf si X est False - ce qui a conduit à de nombreux bugs dans le code Python, dans le Python FAQ , vous trouverez être (C and [X] or [Y])[0] la solution la plus correcte, car une liste avec un seul élément, quelle que soit sa valeur booléenne évaluée, est True toujours! Par exemple: [None] est True mais None est pas. L'exemple de l'OP ci-dessus fonctionne parce que la chaîne représentant X est pas vide.

Cependant, tout cela a changé en Python 2.5, lorsque l'opérateur ternaire ou conditionnelle a été ajouté à la langue, vous permettant d'utiliser le X if C else Y plus propre comme indiqué dans d'autres postes ici. Si vous voyez le code en utilisant l'ancien format, il est parce que l'utilisateur a été un programmeur Python de longue date qui n'a pas adopté la nouvelle syntaxe encore, ils ont coupé-n-coller autre ancien code ou leur employeur utilise toujours 2.4.x ( ou les versions antérieures), etc.

Ceci est un bidouille horrible qui n'est pas recommandé. Il fonctionne en raison du comportement court-circuit de and et or et qu'ils reviennent l'un de leurs arguments plutôt que d'une valeur booléenne. En utilisant cette technique donne un risque d'introduction difficiles à trouver des bogues, il ne faut pas l'utiliser dans le nouveau code.

Voici un exemple de la façon dont l'idiome and/or peut donner un résultat inattendu:

>>> foo = 'foobar'
>>> bar = 'foobar'
>>> x = 0
>>> y = 1
>>> (foo == bar) and x or y   # Will this return the value of x if (foo == bar)?
1

Préférez plutôt la notation plus récente:

return "https://" if port == "443" else "http://"

Vous pouvez lire sur le « et / ou trick » de Python dans cet article Le Peculiar nature de et et Ou en Python . Il est un peu comme le IIF() en VBA ou VB, ou ?: dans les langues de style C.

Cette construction fonctionne parce qu'il se déroule "au code suivant:

a et b ->

if a:
  return b
else:
  return a

a ou b ->

if a:
  return a
else:
  return b

Avec toutes les bonnes réponses, je trouve ces déclarations me souviens aider mieux et en forme comment mon cerveau (et je l'espère pour pour un peu plus là-bas):

  • « et » renvoie le premier élément False (par exemple, None « », [], (), {}, 0) ou le dernier élément si aucun (par exemple pas de faux trouvé)

  • « ou » retourne le premier élément Vrai ou le dernier élément (par exemple pas vrai trouvé) **

En résumé :

  • ils reviennent tout le premier élément qui décide de l'issue de la déclaration. (Dans le pire des cas, le dernier élément de la séquence)

Notez que cette règle s'applique également à une chaîne tout « et » ou tout « ou » déclaration

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top