Dans Python 3.9+ , de nouveaux opérateurs merge ( |) et update ( |=) sont proposés entre les dictionnaires. Remarque: ce ne sont pas les mêmes que les opérateurs d'ensemble mentionnés ci-dessus.
Opérations données entre deux dicts assignés d1et d2:
>>> d1 = d1 | d2 # 1>>> d1 |= d2 # 2
où d1est équivalent via:
une opération de droit de fusion assignée
une opération de fusion sur place (mise à jour); équivalent àd1.update(d2)
Exemple
Ici, nous appliquons merge ( |) et update ( |=) aux dictionnaires :
Le collections.Counterest lié à une structure de données mathématique appelée multiset (mset). Il s'agit essentiellement d'un dict de paires clé-valeur (objet, multiplicité).
Opérations données entre deux compteurs assignés c1et c2:
>>> c1 = c1 | c2 # 1>>> c1 |= c2 # 2
où c1est équivalent via:
une opération syndicale assignée
une opération syndicale en place
Une union de multisets contient les multiplicités maximales par entrée. Notez que cela ne se comporte pas de la même manière qu'entre deux ensembles ou entre deux dictionnaires réguliers.
Exemple
Ici, nous appliquons union ( |) et l'union sur place ( |=) aux compteurs :
Cette section passe brièvement en revue quelques mathématiques au niveau du bit. Dans le cas le plus simple, l'opération OR au niveau du bit compare deux bits binaires. Il retournera toujours 1sauf lorsque les deux bits le sont 0.
>>>assert1==(1|1)==(1|0)==(0|1)>>>assert0==(0|0)
Nous étendons maintenant cette idée au-delà des nombres binaires. Étant donné deux nombres entiers quelconques (sans composantes fractionnaires), nous appliquons le OU au niveau du bit et obtenons un résultat intégral:
>>> a =10>>> b =16>>> a | b26
Comment? En général, les opérations au niveau du bit suivent certaines "règles":
comparer en interne les équivalents binaires
appliquer l'opération
renvoie le résultat comme le type donné
Appliquons ces règles à nos entiers réguliers ci-dessus.
(1) Comparez les équivalents binaires, vus ici sous forme de chaînes ( 0bdésigne le binaire):
>>> bin(a)'0b1010'>>> bin(b)'0b10000'
(2) Appliquez une opération OR au niveau du bit à chaque colonne ( 0lorsque les deux sont 0, sinon 1):
0101010000-----11010
(3) Renvoie le résultat dans le type donné, par exemple base 10, décimal:
>>> int(0b11010)26
La comparaison binaire interne signifie que nous pouvons appliquer ce dernier à des entiers dans n'importe quelle base, par exemple hex et octal:
Pour être parfaitement clair, j'ajouterais à la démonstration qu'après avoir fait l'assignation régulière (x = x | y) l'id (x) a changé car c'est un nouvel objet, tandis que | = garde le même id car c'est le x d'origine qui est modifié, d'où le nom «inplace».
Florimond
1
Cela devrait être la meilleure réponse - c'est la plus exhaustive.
Nick
Dans la section des nombres, vous prétendez que la deuxième instruction effectue une opération sur place. Je pense que ce n'est pas vrai, car les ints ne sont pas mutables en Python.
Asocia
106
En Python, et dans de nombreux autres langages de programmation, se |trouve l' opération OR au niveau du bit . |=est à |tel quel, c'est- +=à +-dire une combinaison d'opération et d'affectation.
Donc var |= valuec'est court pour var = var | value.
Un cas d'utilisation courant consiste à fusionner deux ensembles:
Je lisais du code et le a |=été utilisé dans un contexte défini, et ce n'est que lorsque j'ai déconné et compris que j'ai remarqué que cette réponse était ici aussi
TallChuck
41
Il s'agit simplement d'une opération OR entre la variable courante et l'autre. Étant T=Trueet F=False, voyez la sortie graphiquement:
Cela donne une sorte d'impression déformée de l'opérateur; |est un opérateur bit à bit pour les entiers, pas spécifiquement un opérateur booléen, et pour tout autre chose que bools, il ne produira Trueni ne sortira réellement False. boolest une sous-classe de int, et pour être gentil, ils l'ont surchargée pour boolcontinuer à produire True/ Falsesorties, mais dans la plupart des cas, les opérations booléennes devraient être effectuées avec or, pas |. Les utilisations normales de |sont bitwise-or, ou set-union. De meilleurs exemples d'utilisation seraient quelque chose comme a = 0b1001; a |= 0b0010; print(bin(a))qui produit 0b1011.
ShadowRanger
9
Il effectue un OU binaire au niveau du bit des côtés gauche et droit de l'affectation, puis stocke le résultat dans la variable gauche.
c'est l'explication que je cherchais, tout le monde a parlé d'ensembles et de booléens mais personne n'a mentionné son utilisation avec des nombres.
Ankush Verma
L'exemple que vous avez donné n'est pas 32 |= 10mais plutôt 32 | 10. Juste pour clarifier cela pour les futurs lecteurs :)
sniper71
@ sniper71 quel est le résultat de 32 | = 10
Future-Jim
2
Pour donner un cas d'utilisation (après avoir passé du temps avec les autres réponses):
def process(item):return bool(item)# imagine some sort of complex processing taking place abovedef any_success(data):# return True if at least one is successful
at_least_one =Falsefor item in data:
at_least_one |= process(item)return at_least_one
>>> any_success([False,False,False])False>>> any_success([True,False,False])True>>> any_success([False,True,False])True
Fondamentalement, anysans le court-circuit: cela peut être utile si vous devez traiter chaque élément et enregistrer au moins un succès, etc.
En Python, | = (ior) fonctionne comme une opération d'union. comme si x = 5 et x | = 5, la valeur sera d'abord convertie en valeur binaire, puis l'opération d'union s'effectuera et nous obtenons la réponse 5.
|
est également utilisé comme opérateur d'union d'ensembleRéponses:
|=
effectue une opération en place + entre des paires d'objets. En particulier, entre:Dans la plupart des cas, il est lié à l'
|
opérateur. Voir les exemples ci-dessous.Ensembles
Par exemple, l'union de deux ensembles affectés
s1
ets2
partager les expressions équivalentes suivantes:où la valeur finale de
s1
est équivalente soit par:Exemple
Ici, nous appliquons OR (
|
) et OR (|=
) en place aux ensembles :Dictionnaires
Dans Python 3.9+ , de nouveaux opérateurs merge (
|
) et update (|=
) sont proposés entre les dictionnaires. Remarque: ce ne sont pas les mêmes que les opérateurs d'ensemble mentionnés ci-dessus.Opérations données entre deux dicts assignés
d1
etd2
:où
d1
est équivalent via:d1.update(d2)
Exemple
Ici, nous appliquons merge (
|
) et update (|=
) aux dictionnaires :Compteurs
Le
collections.Counter
est lié à une structure de données mathématique appelée multiset (mset). Il s'agit essentiellement d'un dict de paires clé-valeur (objet, multiplicité).Opérations données entre deux compteurs assignés
c1
etc2
:où
c1
est équivalent via:Une union de multisets contient les multiplicités maximales par entrée. Notez que cela ne se comporte pas de la même manière qu'entre deux ensembles ou entre deux dictionnaires réguliers.
Exemple
Ici, nous appliquons union (
|
) et l'union sur place (|=
) aux compteurs :Nombres
Enfin, vous pouvez faire des calculs binaires.
Opérations données entre deux numéros attribués
n1
etn2
:où
n1
est équivalent via:Exemple
Ici, nous appliquons le OR bit à bit (
|
) et le OR bit à la place (|=
) aux nombres :La revue
Cette section passe brièvement en revue quelques mathématiques au niveau du bit. Dans le cas le plus simple, l'opération OR au niveau du bit compare deux bits binaires. Il retournera toujours
1
sauf lorsque les deux bits le sont0
.Nous étendons maintenant cette idée au-delà des nombres binaires. Étant donné deux nombres entiers quelconques (sans composantes fractionnaires), nous appliquons le OU au niveau du bit et obtenons un résultat intégral:
Comment? En général, les opérations au niveau du bit suivent certaines "règles":
Appliquons ces règles à nos entiers réguliers ci-dessus.
(1) Comparez les équivalents binaires, vus ici sous forme de chaînes (
0b
désigne le binaire):(2) Appliquez une opération OR au niveau du bit à chaque colonne (
0
lorsque les deux sont0
, sinon1
):(3) Renvoie le résultat dans le type donné, par exemple base 10, décimal:
La comparaison binaire interne signifie que nous pouvons appliquer ce dernier à des entiers dans n'importe quelle base, par exemple hex et octal:
Voir également
__ior__()
méthode pour itérer des itérables dans uneMutableSet
classe de base abstraite|=
pour mettre à jour un ensemble+ L'opérateur OR au niveau du bit en place ne peut pas être appliqué aux littéraux; affecter des objets aux noms.
++ Les méthodes spéciales renvoient les mêmes opérations que leurs opérateurs correspondants.
la source
int
s ne sont pas mutables en Python.En Python, et dans de nombreux autres langages de programmation, se
|
trouve l' opération OR au niveau du bit .|=
est à|
tel quel, c'est-+=
à+
-dire une combinaison d'opération et d'affectation.Donc
var |= value
c'est court pourvar = var | value
.Un cas d'utilisation courant consiste à fusionner deux ensembles:
la source
Lorsqu'il est utilisé avec des ensembles, il effectue une opération d'union.
la source
|=
été utilisé dans un contexte défini, et ce n'est que lorsque j'ai déconné et compris que j'ai remarqué que cette réponse était ici aussiIl s'agit simplement d'une opération OR entre la variable courante et l'autre. Étant
T=True
etF=False
, voyez la sortie graphiquement:Par exemple:
la source
|
est un opérateur bit à bit pour les entiers, pas spécifiquement un opérateur booléen, et pour tout autre chose quebool
s, il ne produiraTrue
ni ne sortira réellementFalse
.bool
est une sous-classe deint
, et pour être gentil, ils l'ont surchargée pourbool
continuer à produireTrue
/False
sorties, mais dans la plupart des cas, les opérations booléennes devraient être effectuées avecor
, pas|
. Les utilisations normales de|
sont bitwise-or, ou set-union. De meilleurs exemples d'utilisation seraient quelque chose commea = 0b1001; a |= 0b0010; print(bin(a))
qui produit0b1011
.Il effectue un OU binaire au niveau du bit des côtés gauche et droit de l'affectation, puis stocke le résultat dans la variable gauche.
http://docs.python.org/reference/expressions.html#binary-bitwise-operations
la source
C'est au niveau du bit ou. Disons que nous avons
32 |= 10
, les images 32 et 10 sont binaires.Maintenant parce que | est ou, faites un bit ou sur les deux nombres
c'est-à-dire 1 ou 0 -> 1, 0 ou 0 -> 0. Continuez le long de la chaîne
Maintenant changez le binaire en décimal, 10 1010 = 42.
Pour | =, pensez des exemples connus,
x +=5
. Cela signifiex = x + 5,
donc si nous avonsx |= 5
, cela signifiex = x bitwiseor with 5
.la source
32 |= 10
mais plutôt32 | 10
. Juste pour clarifier cela pour les futurs lecteurs :)Pour donner un cas d'utilisation (après avoir passé du temps avec les autres réponses):
Fondamentalement,
any
sans le court-circuit: cela peut être utile si vous devez traiter chaque élément et enregistrer au moins un succès, etc.Voir aussi les mises en garde dans cette réponse
la source
En Python, | = (ior) fonctionne comme une opération d'union. comme si x = 5 et x | = 5, la valeur sera d'abord convertie en valeur binaire, puis l'opération d'union s'effectuera et nous obtenons la réponse 5.
la source