4
votes

Python peut-il 'et' retourner None?

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 >


3 commentaires

La liste vide est évaluée à False n'est-ce pas? Ce n'est pas un NoneType que 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à


5 Réponses :


2
votes

Le code ci-dessus signifie:

Si a (est la vérité), ET b n'est pas Aucun , alors #faire quelque chose .


0 commentaires

1
votes

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.


0 commentaires

5
votes

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")


2 commentaires

Titbit mineur, a est vrai ==> a est vrai


@NickA Ha, oui



2
votes

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
...


2 commentaires

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.



1
votes

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


1 commentaires

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».