web-dev-qa-db-fra.com

Que fait | = (ior) en Python?

Google ne me laissera pas chercher | = je ne parviens donc pas à trouver la documentation pertinente. Quelqu'un sait?

65
Sean W.

En Python et dans de nombreux autres langages de programmation, | est l'opération bitwise-OR . |= est à | comme += est à +, c’est-à-dire une combinaison d’opération et d’affectation.

var |= value est l'abréviation de var = var | value

59
Daniel Stutzbach

Lorsqu'il est utilisé avec des ensembles, il effectue une opération d'union.

35
sunny

Ceci est juste une opération OR entre la variable en cours et l’autre. Étant T=True et F=False, voyez le résultat sous forme graphique:

r    s    r|=s
--------------
T    T    T
T    F    T
F    T    T
F    F    F

Par exemple:

>>> r=True
>>> r|=False
>>> r
True
>>> r=False
>>> r|=False
>>> r
False
>>> r|=True
>>> r
True
26
fedorqui

|= effectue une opération inplace, bitwise OR et exécute également union opération de Python sets

Par exemple, l'union de deux ensembles x et y partage les expressions équivalentes suivantes:

>>> x = x | y                                              # (1)
>>> x |= y                                                 # (2)
>>> x.__ior__(y)                                           # (3)

où la valeur finale de x est équivalente soit par:

  1. une opération OR affectée
  2. une opération inplace OR
  3. une opération inplace OR via une méthode spéciale

Voir aussi la section B.8 de Dive in Python 3 sur les méthodes spéciales des opérateurs Python.


Voici quelques exemples comparant OR (|) et le inplace OR (|=) appliqué aux ensembles:

>>> x = {"a", "b", "c"}
>>> y = {"d", "e", "f"}

>>> # OR, | 
>>> x | y
{'a', 'b', 'c', 'd', 'e', 'f'}
>>> x                                                      # `x` is unchanged
{'a', 'b', 'c'}

>>> # Inplace OR, |=
>>> x |= y
>>> x                                                      # `x` is reassigned
{'a', 'b', 'c', 'd', 'e', 'f'}

Voici un exemple de surcharge de la méthode __ior__() pour itérer des itérables dans une classe de base abstraite MutableSet. Voir aussi sous-classé et appliqué dans la recette OrderedSet de Raymond Hettinger (voir lignes 3 et 10 respectivement) . Voici un fil sur Python-ideas sur pourquoi utiliser |= pour mettre à jour un ensemble.

22
pylang

Il effectue une opération binaire OR binaire entre les 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

9
Brandon Rhodes

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 sera effectuée et nous obtiendrons la réponse 5.

1
aanchal.s

Pour donner un cas d'utilisation (après avoir passé du temps avec les autres réponses):

def has_some_property(item):
    fake_test_result = bool(item)
    return fake_rest_result

def lmk(data): # let_me_know_if_at_least_one_succeeds
    at_least_one = False
    for item in data:
       at_least_one |= has_some_property(item)
    return at_least_one

>>> lmk([False, False, False])
False
>>> lmk([True, False, False])
True
>>> lmk([False, True, False])
True

Voir aussi les mises en garde dans cette réponse

1
scharfmn

C'est au niveau des bits ou . Disons que nous avons 32 |= 10, les images 32 et 10 étant binaires.

32 = 10 0000
10 = 00 1010

Maintenant parce que | est ou, faites un bitwise ou sur les deux nombres

c'est-à-dire 1 ou 0 -> 1, 0 ou 0 -> 0. Continuez dans cette chaîne

10 0000 | 00 1010 = 10 1010.

Maintenant changez le binaire en décimal, 10 1010 = 42.

Pour | =, pensez aux exemples connus, x +=5. Cela signifie x = x + 5, donc si nous avons x |= 5, cela signifie x = x bitwiseor with 5.

0
memeKing