Je regarde du code qui fonctionne apparemment, car personne ne s'en est plaint, mais je suis bien confus par ce qu'ils ont écrit:
if a and b is not None:
# do something
J'ai toujours pensé aux 'et' comme quelque chose qui renvoie Vrai ou Faux, je commence maintenant à douter de moi-même .. Que renverrait-il d'autre, un nombre .. Ce n'est probablement pas pythonique, mais est-ce que je manque quelque chose - comment quelqu'un peut-il écrire quelque chose comme ça? p >
5 Réponses :
Le code ci-dessus signifie:
Si a (est la vérité), ET b n'est pas Aucun , alors #faire quelque chose .
Dans ce code, vous évaluez d'abord b n'est pas None , qui est un booléen.
Et puis a est implicitement converti en booléen
(Pour une liste / dict , False si elle est vide. Pour un nombre, False si elle vaut 0 )
puis et sont évalués qui retournent toujours un booléen.
Cela signifie que si a est Vrai et b n'est pas Aucun et non ce que vous pensiez que cela signifiait, c'est-à-dire que a et b est Vrai
a = 999
b = None
if a and b is not None:
print("a is True but b is None")
else:
print("a is True and b is not None")
Titbit mineur, a est vrai ==> a est vrai
@NickA Ha, oui
Selon [Python 3]: priorité des opérateurs ( c'est moi qui souligne ):
Le tableau suivant résume la priorité des opérateurs en Python, de la priorité la plus basse (la moins contraignante) à la priorité la plus élevée (la plus contraignante) .
>>> bool(0) False >>> bool(100) True >>> bool([]) False >>> bool([0]) True >>> bool(None) False >>> bool({}) False >>> bool({1: 1}) True >>> bool(None is not None) False >>> bool(1 is not None) True >>> bool(2 and 1 is not None) True
Le fait que ne l'est pas vient après et , signifie qu'il sera évalué avant et (les deux peuvent ne pas être évalués du tout, en raison de l ' évaluation paresseuse - merci @NickA pour le commentaire), donc l'expression équivaut à (ajouter des parenthèses pour plus de clarté):
if a and (b is not None):
Aussi, selon [Python 3]: Test de la valeur de vérité :
Tout objet peut être testé pour sa valeur de vérité, pour une utilisation dans un si ou while condition ou comme opérande des opérations booléennes ci-dessous .
votre instruction if est parfaitement OK (produit un bool ). p >
Exemples (en utilisant [Python 3]: class bool ( [x] ) ):
... and Boolean AND not x Boolean NOT in, not in, is, is not, <, <=, >, >=, !=, == Comparisons, including membership tests and identity tests ...
Merci, ces deux liens sont très utiles. Je souhaite que les gens puissent simplement mettre entre crochets. Cette table de «préséance des opérateurs» est pire que ce que nous avons dû apprendre en arithmétique à l'école. Je remarque que PyCharm ne s'oppose pas si vous mettez des crochets (redondants), donc ça ne peut pas être un mauvais style, je ne sais pas si c'est bon ou mauvais.
Vous êtes les bienvenus. Eh bien, la priorité des opérateurs est dans une table pour chaque langue (y compris l'arithmétique), je ne suis pas sûr qu'il existe une manière plus conviviale pour l'utilisateur de les exprimer. Je n'ai pas vu de notes dans le PEP8 qui interdiraient les parenthèses redondantes, mais je pense qu'il serait logique de les avoir là où les choses ne sont pas claires.
C'est très certainement valable.
Lorsque nous prenons une variable à laquelle une valeur a été attribuée et exécutons l'opération ET avec une autre variable avec un nul (en python - Aucun), l'opération ET en résulte dans un Aucun . Par conséquent, le contrôle peut être effectué. Pour clarifier mon propos, veuillez vous référer ci-dessous.
print(a and b)
et
print(a and c)
aboutit à Aucun
et
a=2;c=None; b=11
if a and c is not None:
print("T")
else:
print("F")
donne une valeur non nulle - dans notre cas 11
La sortie de votre dernière déclaration était intéressante. Je pensais vraiment que «et» ne renvoyait que Vrai ou Faux, mais il semble que cela fonctionne un peu différemment, vous ne remarquez pas normalement que c'est dans une instruction «si».
La liste vide est évaluée à
Falsen'est-ce pas? Ce n'est pas unNoneTypeque j'ai pensé?Je regarde les réponses .. D'une manière ou d'une autre, je l'ai lu
si (a et b) n'est pas None:et j'ai imaginé des crochets qui ne sont peut-être pas là.@cardamom Correct, ils ne sont pas là