J'ai rencontré l'opérateur caret en python aujourd'hui et je l'ai essayé, j'ai obtenu le résultat suivant:
>>> 8^3
11
>>> 8^4
12
>>> 8^1
9
>>> 8^0
8
>>> 7^1
6
>>> 7^2
5
>>> 7^7
0
>>> 7^8
15
>>> 9^1
8
>>> 16^1
17
>>> 15^1
14
>>>
Il semble être basé sur 8, donc je suppose une sorte d'opération d'octet? Je n'arrive pas à trouver grand chose à propos de ces sites de recherche à part qu'il se comporte étrangement pour les flotteurs, est-ce que quelqu'un a un lien vers ce que fait cet opérateur ou pouvez-vous l'expliquer ici?
help('^')
**
l'opérateur d'exponentiation.help('^')
ne fait rien dans mon Python 2.6.1 (version Apple). @ S.Lott: voulez-vous dire ceci ( docs.python.org/reference/… ) quand vous dites "complètement couvert" ?. Semble un peu rare pour quelqu'un qui ne connaît pas le concept ...Réponses:
C'est un XOR au niveau du bit (OU exclusif).
Il en résulte vrai si un (et un seul) des opérandes (est évalué à) vrai.
Démontrer:
Pour expliquer l'un de vos propres exemples:
Pensez-y de cette façon:
la source
1
dans le même bit pour le préciser1 xor 1 = 0
.0bX
où X est votre binaire.0b0001
,0b0010
Etc. Alors,0b1101 ^ 0b1110
voulez - vous donner0b0011
(ou 3).Il invoque la méthode
__xor__()
ou__rxor__()
de l'objet si nécessaire, ce qui pour les types entiers effectue un ou exclusif au niveau du bit.la source
C'est un peu exclusif - ou. Les opérateurs binaires au niveau du bit sont documentés au chapitre 5 du Guide de référence du langage Python .
la source
De manière générale, le symbole
^
est une version infixe des méthodes__xor__
ou__rxor__
. Quels que soient les types de données placés à droite et à gauche du symbole, ils doivent implémenter cette fonction de manière compatible. Pour les entiers, c'est l'XOR
opération courante , mais par exemple, il n'y a pas de définition intégrée de la fonction pour le typefloat
avec typeint
:Une chose intéressante à propos de Python est que vous pouvez remplacer ce comportement dans une classe de votre choix. Par exemple, dans certaines langues, le
^
symbole signifie exponentiation. Vous pouvez le faire de cette façon, à titre d'exemple:Ensuite, quelque chose comme ça fonctionnera, et maintenant, pour les instances de
Foo
seulement , le^
symbole signifiera l'exponentiation.la source
+
opérateur aussi?+
symbole est capable de faire un type d'action pourlist
(concaténation) tout en faisant un autre type d'action (addition mathématique) pour les types numériques. Dans ce cas, vous remplaceriez les méthodes__add__
ou__radd__
de votre classe.__r*__
version de ceux-ci (comme__rxor__
ou__radd__
) sera invoquée à partir de l'argument apparaissant sur le côté droit du symbole infixe, et seulement si l'appel à la fonction pour le symbole de gauche ne fonctionne pas. Vous pouvez penser à cela commetry: left_hand_symbol.__xor__(right_hand_symbol); except: right_hand_symbol.__rxor__(left_hand_symbol)
, maisxor
peut être remplacé par l'un des opérateurs d'infixe disponibles dans le modèle de données Python .int
concaténation avec des chaînes? mec, python est bien complexe que je ne le pensais(CompositionA | CompositionB) // CompositionC
et cela signifierait simplement "Jouez la composition A suivie de la composition B, en même temps, jouez également la composition C en même temps en parallèle". Parlez d'un beau morceau de code!Lorsque vous utilisez l'
^
opérateur, derrière les rideaux, la méthode__xor__
est appelée.a^b
équivaut àa.__xor__(b)
.Également,
a ^= b
équivaut àa = a.__ixor__(b)
(où__xor__
est utilisé comme solution de secours lorsque__ixor__
est implicitement appelé via using^=
mais n'existe pas).En principe, ce que
__xor__
fait dépend entièrement de sa mise en œuvre. Les cas d'utilisation courants en Python sont:Démo:
Démo:
Explication:
la source