11
votes

Comment «et» et «ou» fonctionne lorsqu'il est combiné dans une déclaration?

Pour une raison quelconque, cette fonction m'a confondu:

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


2 commentaires

@ Répondeurs, voir ma mise à jour ultérieure de 1 minute. Désolé.


Rappelez-vous simplement que les déclarations 'et' et 'ou' ou 'ou' renvoient la dernière expression à évaluer. :)


7 Réponses :


8
votes

et renvoie le bon opérande si la gauche est vraie. ou renvoie le bon opérande si la gauche est fausse. Sinon, ils retournent tous les deux l'opérande gauche. Ils sont dit coalesce .


1 commentaires

Ah, merci Ignacio. Je ne sais pas comment j'ai eu jusqu'à présent dans Python sans comprendre cela. C'est la première fois que je l'ai déjà vu utilisé comme ça. +1



31
votes

C'est un idiome de vieille ish; Insertion de parenthèses pour montrer la priorité, xxx

x et y renvoie y si x est trancheuse, x si x est falsifié; a ou b , vice versa, renvoie A si c'est truc, sinon B .

donc si == "443" est vrai, cela renvoie le RHS du et , à savoir "https: //" . Sinon, le et est faux, donc le ou est en jeu et renvoie `" http: // ", son rhs.

dans le python moderne, une meilleure façon de traduire cet idiome ancien ISH est le suivant: xxx


4 commentaires

@Alex +1 Merci pour l'explication approfondie. Ils ont apparemment fait pour que je ne puisse pas accepter une réponse pendant 10 minutes :( mais bonne réponse.


@orokusaki, merci, et je suis sûr que vous pourrez l'accepter plus tard ;-).


+1 Pour mentionner l'opérateur ternaire de Python, beaucoup plus facile à lire / comprendre IMHO


J'ai appris il y a longtemps pour utiliser des parenthèses pour rendre l'interprète / compilateur faire ce que i veulent que le code fasse, plutôt que d'être à la merci de la priorité. Cela aide à documenter le code pour moi et tout qui le maintient après que je sache. Je considère que cela faisait partie du codage de manière défensive.



2
votes

Ceci est un piratage laid non recommandé. Cela fonctionne en raison du comportement de court-circuit de et et ou et qu'ils renvoient celui de leurs arguments plutôt qu'une valeur booléenne. L'utilisation de cette technique donne un risque d'introduire des bogues difficiles à trouver, alors ne l'utilisez pas dans le nouveau code.

Voici un exemple de la manière dont le et / ou idiome peut donner un résultat inattendu : xxx

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


1 commentaires

@Mark C'est la version que je connais et je n'ai jamais vu la version dans mon poteau avant aujourd'hui. +1



1
votes

Vous voudrez peut-être lire sur le "et / ou la truc" de Python dans cet article Nature de et et à Python . C'est un peu comme le iif () dans vba ou vb, ou ?: dans les langages de style C.


1 commentaires

@Abel merci. Je viens de le lire, article intéressant. J'ai utilisé le retourner A ou B syntaxe beaucoup mais pour une raison quelconque, cet extrait ne jive pas.



0
votes

Cette construction fonctionne car il "se déroule" au code suivant:

a et b -> xxx

A ou B -> xxx


0 commentaires


0
votes

Avec toutes les bonnes réponses, j'ai trouvé ces déclarations m'aidez-moi à me souvenir de cela mieux et à convaincre comment mon cerveau fonctionne (et espérons-le pour d'autres là-bas):

  • "et" renvoie le premier faux élément (par exemple, aucun, "", [], (), {}, 0) ou le dernier élément si aucun (pas de faux trouvé) < / li>

  • "ou" renvoie le premier véritable élément ou le dernier élément (par exemple non true trouvé) **

    en résumé :

    • Ils renvoient tous le premier élément qui décide du résultat de la déclaration. (Dans le pire des cas, le dernier élément de la séquence)

      Remarque Cette règle s'applique également à une chaîne tout "et" ou toutes "instruction" ou "


0 commentaires