Python'da | = (ior) ne yapar?


112

Google arama yapmama izin vermiyor, |=bu yüzden ilgili belgeleri bulmakta sorun yaşıyorum. Bilen var mı?


5
Sanırım aşağıdaki sunny cevabında olduğu gibi, bunun |aynı zamanda set sendika operatörü olarak kullanıldığını
belirtmek yerinde olacaktır

10
2019'da Google arama yapmanıza izin verecek` | = `! :-)
rbennell

Yanıtlar:


46

|=nesne çiftleri arasında yerinde + işlem yapar . Özellikle şunlar arasında:

Çoğu durumda, |operatörle ilgilidir. Aşağıdaki örneklere bakın.

Setleri

Örneğin, atanan iki kümenin birleşimi s1ve s2aşağıdaki eşdeğer ifadeleri paylaşın:

>>> s1 = s1 | s12                                          # 1
>>> s1 |= s2                                               # 2
>>> s1.__ior__(s2)                                         # 3

burada son değeri aşağıdakilerden biri s1ile eşdeğerdir:

  1. atanmış bir OR işlemi
  2. yerinde VEYA işlem
  3. özel yöntem ++ aracılığıyla yerinde VEYA işlem

Misal

Burada OR ( |) ve yerinde OR ( |=) 'yi setlere uygularız :

>>> s1 = {"a", "b", "c"}
>>> s2 = {"d", "e", "f"}

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

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

Sözlükler

In Python 3.9+ , yeni birleştirme ( |) ve güncelleme ( |=) operatörleri sözlükleri arasında önerilmiştir. Not: Bunlar yukarıda belirtilen küme operatörleriyle aynı değildir.

Atanmış iki dikt arasındaki işlemler verildi d1ve d2:

>>> d1 = d1 | d2                                           # 1
>>> d1 |= d2                                               # 2

nerede d1ile eşdeğerdir:

  1. atanmış bir birleştirme hakkı işlemi
  2. yerinde birleştirme hakkı (güncelleme) işlemi; eşittird1.update(d2)

Misal

Burada diktlere merge ( |) ve update ( |=) uygularız :

>>> d1 = {"a": 0, "b": 1, "c": 2}
>>> d2 = {"c": 20, "d": 30}

>>> # Merge, | 
>>> d1 | d2
{"a": 0, "b": 1, "c": 20, "d": 30}
>>> d1 
{"a": 0, "b": 1, "c": 2}

>>> # Update, |=
>>> d1 |= d2
>>> d1 
{"a": 0, "b": 1, "c": 20, "d": 30}

Sayaçlar

collections.CounterOlarak adlandırılan bir matematiksel veri tipleri de ilgilidir multiset (Mist). Temelde (nesne, çokluk) anahtar-değer çiftlerinin bir diktesidir.

Atanmış iki sayaç arasındaki işlemler verildi c1ve c2:

>>> c1 = c1 | c2                                           # 1
>>> c1 |= c2                                               # 2

nerede c1ile eşdeğerdir:

  1. atanmış bir sendika operasyonu
  2. yerinde bir sendika operasyonu

Çoklu kümelerden oluşan bir birlik, giriş başına maksimum çoklukları içerir. Bu, iki set arasındaki veya iki normal dikt arasındaki ile aynı şekilde davranmaz.

Misal

Burada Union ( |) ve yerinde birleşimi ( |=) Sayaçlara uyguluyoruz :

import collections as ct


>>> c1 = ct.Counter({2: 2, 3: 3})
>>> c2 = ct.Counter({1: 1, 3: 5})

>>> # Union, |    
>>> c1 | c2
Counter({2: 2, 3: 5, 1: 1})
>>> c1
Counter({2: 2, 3: 3})

>>> # Inplace Union, |=
>>> c1 |= c2
>>> c1
Counter({2: 2, 3: 5, 1: 1})

Sayılar

Son olarak, ikili matematik yapabilirsiniz.

İki atanmış numara arasında verilen işlemler n1ve n2:

>>> n1 = n1 | n2                                           # 1
>>> n1 |= n2                                               # 2

nerede n1ile eşdeğerdir:

  1. atanmış bir bitsel OR işlemi
  2. yerinde bitsel OR işlemi

Misal

Burada bit OR (uygulamak |) ve yerinde bit OR ( |=kadar) sayılar :

>>> n1 = 0
>>> n2 = 1

>>> # Bitwise OR, |
>>> n1 | n2
1
>>> n1
0

>>> # Inplace Bitwise OR, |=
>>> n1 |= n2
>>> n1
1

gözden geçirmek

Bu bölüm, bazı bitsel matematiği kısaca gözden geçirir. En basit durumda, bit tabanlı OR işlemi iki ikili biti karşılaştırır. Her 1iki bitin de olduğu durumlar dışında her zaman geri dönecektir 0.

>>> assert 1 == (1 | 1) == (1 | 0) == (0 | 1)
>>> assert 0 == (0 | 0)

Şimdi bu fikri ikili sayıların ötesine genişletiyoruz. Herhangi iki integral sayı verildiğinde (kesirli bileşenler eksik), bitsel OR'yi uygularız ve integral bir sonuç alırız:

>>> a = 10 
>>> b = 16 
>>> a | b
26

Nasıl? Genel olarak, bitsel işlemler bazı "kuralları" izler:

  1. ikili eşdeğerleri dahili olarak karşılaştırın
  2. operasyonu uygula
  3. sonucu verilen tür olarak döndür

Bu kuralları yukarıdaki normal tam sayılarımıza uygulayalım.

(1) Burada dizeler olarak görülen ikili eşdeğerleri karşılaştırın ( 0bikiliyi gösterir):

>>> bin(a)
'0b1010'
>>> bin(b)
'0b10000'

(2) Her sütuna bit düzeyinde VEYA işlemi uygulayın (her 0ikisi de 0geçerliyse 1):

01010
10000
-----
11010

(3) Sonucu verilen türde döndürün, örneğin 10 tabanı, ondalık:

>>> int(0b11010)
26

Dahili ikili karşılaştırma, ikincisini herhangi bir tabandaki tamsayılara uygulayabileceğimiz anlamına gelir, örneğin onaltılık ve sekizlik:

>>> c = 0xa
>>> d = 0o32
>>> c | d
26

Ayrıca bakınız

+ Yerinde bitsel OR operatörü değişmez değerlere uygulanamaz; isimlere nesneler atayın.

++ Özel yöntemler, karşılık gelen işleçlerle aynı işlemleri döndürür.


2
Tamamen açık olmak gerekirse, gösterime, normal atamayı (x = x | y) yaptıktan sonra, yeni bir nesne olduğu için id (x) 'in değiştiğini ve | = aynı kimliği koruduğunu çünkü orijinal x olduğunu ekleyeceğim. değiştirilir, dolayısıyla adı "yerinde" olur.
Florimond

1
Bu en iyi cevap olmalı - en kapsamlı olanıdır.
Nick

Sayılar bölümünde, ikinci ifadenin yerinde işlem yaptığını iddia ediyorsunuz. intPython'da s değişkenleri değiştirilemediği için bunun doğru olmadığını düşünüyorum .
Asocia

106

Python ve diğer birçok programlama dillerinde, |bir bit seviyesinde VEYAlayın operasyon . |=için |olduğu gibi +=da +, işletme ve asignment yani bir kombinasyonu olabilir.

Kısaltması da var |= valueöyle var = var | value.

Yaygın bir kullanım örneği, iki grubu birleştirmektir:

>>> a = {1,2}; a |= {3,4}; print(a)
{1, 2, 3, 4}

21
Lütfen bir örnek verebilir misiniz?
mineraller

Aşağıda karşılaştığım bir kullanım örneği verdim
scharfmn

53

Setlerle birlikte kullanıldığında birleştirme işlemi gerçekleştirir.


1
Bazı kodlar okuyordum ve |=set bağlamında kullanıldı ve etrafta dolanıp bu cevabın da burada olduğunu fark
ettiğimi anlayıncaya

41

Bu sadece mevcut değişken ile diğeri arasındaki bir VEYA işlemidir. Var olmak T=Trueve F=Falseçıktıyı grafik olarak görmek:

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

Örneğin:

>>> r=True
>>> r|=False
>>> r
True
>>> r=False
>>> r|=False
>>> r
False
>>> r|=True
>>> r
True

7
Bu, operatör hakkında bir tür çarpık izlenim verir; |tamsayılar için bit düzeyinde veya operatördür, özellikle bir boole operatörü değildir ve bools dışında herhangi bir şey için , gerçekte üretmez Trueveya Falseçıktı üretmez . boolbir alt sınıfıdır intve güzel olmak gerekirse, / çıktı boolüretmeye devam etmek için onu aşırı yüklediler, ancak çoğu durumda, boole işlemleri ile yapılmamalıdır . Normal kullanımları bitsel veya veya set birleşimidir. Daha iyi kullanım örnekleri, üreten gibi bir şey olacaktır . TrueFalseor||a = 0b1001; a |= 0b0010; print(bin(a))0b1011
ShadowRanger


3

Bitsel veya. Diyelim ki biz var 32 |= 10, resim 32 ve 10 ikili.

32 = 10 0000
10 = 00 1010

Şimdi çünkü | veya, bitler halinde veya iki sayı üzerinde yapın

ör. 1 veya 0 -> 1, 0 veya 0 -> 0. Buna zincir boyunca devam edin

10 0000 | 00 1010 = 10 1010.

Şimdi ikiliyi ondalık sayıya çevirin, 10 1010 = 42.

| = İçin, bilinen örnekleri düşünün x +=5. Bu x = x + 5,nedenle, eğer sahipsek x |= 5, demek oluyor x = x bitwiseor with 5.


aradığım açıklama buydu, herkes setler ve bools hakkında konuştu ama kimse sayılarla kullanımından bahsetmedi.
Ankush Verma

Verdiğiniz örnek 32 |= 10daha ziyade değil 32 | 10. Bunu gelecekteki okuyucular için açıklığa kavuşturmak için :)
sniper71

@ sniper71 32'nin sonucu nedir | = 10
Future-Jim

2

Kullanım senaryosu vermek için (diğer cevaplarla vakit geçirdikten sonra):

def process(item):
   return bool(item) # imagine some sort of complex processing taking place above

def any_success(data): # return True if at least one is successful
    at_least_one = False
    for 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

Temelde anykısa devre olmadan: her öğeyi işlemeniz ve en az bir başarı kaydetmeniz gerekiyorsa yararlı olabilir.

Bu yanıttaki uyarılara da bakın


1

Python'da | = (ior) birleşim işlemi gibi çalışır. mesela x = 5 ve x | = 5 ise, o zaman her iki değer de önce ikili değere dönüşecek, sonra birleşim işlemi gerçekleştirilecek ve 5 cevabını alacağız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.