Apa yang | = (ior) lakukan dengan Python?

112

Google tidak mengizinkan saya mencari, |=jadi saya kesulitan menemukan dokumentasi yang relevan. Ada yang tahu?

Sean W.
sumber
5
Saya pikir itu relevan untuk |
ditunjukkan
10
di 2019 Google akan membiarkan Anda mencari` | = `! :-)
rbennell

Jawaban:

46

|=melakukan operasi di tempat + di antara pasangan objek. Secara khusus, antara:

Dalam kebanyakan kasus, ini terkait dengan |operator. Lihat contoh di bawah.

Set

Misalnya, gabungan dari dua set yang ditetapkan s1dan s2berbagi ekspresi setara berikut:

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

di mana nilai akhir s1setara dengan:

  1. operasi ATAU yang ditugaskan
  2. operasi OR di tempat
  3. operasi OR di tempat melalui metode khusus ++

Contoh

Di sini kami menerapkan OR ( |) dan inplace OR ( |=) ke set :

>>> 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'}

Kamus

Di Python 3.9+ , operator merge ( |) dan update ( |=) baru diusulkan antar kamus. Catatan: ini tidak sama dengan operator set yang disebutkan di atas.

Operasi yang diberikan antara dua penis yang ditugaskan d1dan d2:

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

dimana d1setara melalui:

  1. operasi hak gabungan yang ditetapkan
  2. operasi merge-right (update) di tempat; setara dengand1.update(d2)

Contoh

Di sini kami menerapkan merge ( |) dan update ( |=) ke dicts :

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

Penghitung

Ini collections.Counterterkait dengan struktur data matematika yang disebut multiset (mset). Ini pada dasarnya adalah diktekan dari pasangan nilai kunci (objek, multiplisitas).

Operasi yang diberikan antara dua penghitung yang ditetapkan c1dan c2:

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

dimana c1setara melalui:

  1. operasi serikat yang ditugaskan
  2. operasi serikat di tempat

Sebuah serikat multisets berisi multiplicities maksimum per entri. Catatan, ini tidak berlaku dengan cara yang sama seperti antara dua set atau di antara dua penis biasa.

Contoh

Di sini kami menerapkan union ( |) dan in-place union ( |=) ke Counter :

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

Angka

Terakhir, Anda dapat melakukan matematika biner.

Operasi yang diberikan antara dua nomor yang ditetapkan n1dan n2:

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

dimana n1setara melalui:

  1. operasi bitwise ATAU yang ditetapkan
  2. operasi bitwise ATAU di tempat

Contoh

Di sini kami menerapkan bitwise OR ( |) dan bitwise OR ( ) di tempat |=ke angka :

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

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

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

Ulasan

Bagian ini secara singkat mengulas beberapa matematika bitwise. Dalam kasus yang paling sederhana, operasi bitwise OR membandingkan dua bit biner. Itu akan selalu kembali 1kecuali jika kedua bit tersebut 0.

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

Kami sekarang memperluas gagasan ini di luar bilangan biner. Diberikan dua bilangan integral (tidak memiliki komponen pecahan), kami menerapkan bitwise OR dan mendapatkan hasil integral:

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

Bagaimana? Secara umum, operasi bitwise mengikuti beberapa "aturan":

  1. membandingkan secara internal setara biner
  2. terapkan operasi
  3. kembalikan hasilnya sebagai tipe yang diberikan

Mari terapkan aturan ini ke bilangan bulat reguler di atas.

(1) Bandingkan ekuivalen biner, terlihat di sini sebagai string ( 0bmenunjukkan biner):

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

(2) Terapkan operasi OR bitwise ke setiap kolom ( 0jika keduanya 0, lain 1):

01010
10000
-----
11010

(3) Kembalikan hasil dalam jenis yang diberikan, misalnya basis 10, desimal:

>>> int(0b11010)
26

Perbandingan biner internal berarti kita dapat menerapkan yang terakhir ke bilangan bulat di basis apa pun, misalnya heksa dan oktal:

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

Lihat juga

+ Operator OR bitwise di tempat tidak dapat diterapkan ke literal; menetapkan objek ke nama.

++ Metode khusus mengembalikan operasi yang sama dengan operator terkait.

pylang
sumber
2
Agar lebih jelas, saya akan menambahkan demonstrasi bahwa setelah melakukan penugasan biasa (x = x | y) id (x) telah berubah karena itu adalah objek baru, sementara | = menyimpan id yang sama karena itu adalah x asli itu dimodifikasi, oleh karena itu dinamai "di tempat".
Florimond
1
Ini harus menjadi jawaban teratas - ini yang paling lengkap.
Nick
Di bagian angka, Anda mengklaim bahwa pernyataan kedua melakukan operasi di tempat. Saya pikir itu tidak benar, karena ints tidak bisa berubah di Python.
Asocia
106

Di Python, dan banyak bahasa pemrograman lainnya, |adalah operasi bitwise-OR . |=adalah |sebagaimana +=adanya +, yaitu kombinasi antara operasi dan asignment.

Jadi var |= valuekependekan dari var = var | value.

Kasus penggunaan yang umum adalah menggabungkan dua set:

>>> a = {1,2}; a |= {3,4}; print(a)
{1, 2, 3, 4}
Daniel Stutzbach
sumber
21
Bisakah Anda memberikan contoh?
mineral
Telah memberikan satu kasus penggunaan yang saya temui di bawah
scharfmn
53

Saat digunakan dengan set, ia melakukan operasi gabungan.

cerah
sumber
1
Saya membaca beberapa kode dan |=digunakan dalam konteks yang ditetapkan, dan baru setelah saya
mengotak
41

Ini hanyalah operasi OR antara variabel saat ini dan variabel lainnya. Sedang T=Truedan F=False, lihat hasilnya secara grafis:

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

Sebagai contoh:

>>> r=True
>>> r|=False
>>> r
True
>>> r=False
>>> r|=False
>>> r
False
>>> r|=True
>>> r
True
fedorqui 'JADI berhenti merugikan'
sumber
7
Hal ini memberikan kesan operator yang menyesatkan; |adalah operator bitwise-or untuk bilangan bulat, bukan secara spesifik operator boolean, dan untuk apa pun selain bools, ia tidak akan benar-benar menghasilkan Trueatau Falsemengeluarkan. booladalah subkelas dari int, dan untuk menyenangkannya, mereka membebani untuk booltetap memproduksi True/ Falsekeluaran, tetapi dalam banyak kasus, operasi boolean harus dilakukan dengan or, bukan |. Penggunaan normal untuk |adalah bitwise-or, atau set-union. Contoh penggunaan yang lebih baik adalah sesuatu seperti a = 0b1001; a |= 0b0010; print(bin(a))yang menghasilkan 0b1011.
ShadowRanger
3

Ini bitwise atau. Misalkan kita punya 32 |= 10, gambar 32 dan 10 adalah biner.

32 = 10 0000
10 = 00 1010

Sekarang karena | adalah atau, lakukan sedikit atau pada dua angka

yaitu 1 atau 0 -> 1, 0 atau 0 -> 0. Lanjutkan proses ini ke bawah rantai

10 0000 | 00 1010 = 10 1010.

Sekarang ubah biner menjadi desimal, 10 1010 = 42.

Untuk | =, pikirkan contoh yang diketahui x +=5,. Artinya, x = x + 5,jika kita punya x |= 5, itu artinya x = x bitwiseor with 5.

memeKing
sumber
ini adalah penjelasan yang saya cari, semua orang berbicara tentang set dan bools tetapi tidak ada yang menyebutkan penggunaannya dengan angka.
Ankush Verma
Contoh yang Anda berikan bukan 32 |= 10melainkan 32 | 10. Hanya untuk mengklarifikasi hal ini untuk pembaca selanjutnya :)
sniper71
@ sniper71 apa hasil dari 32 | = 10
Future-Jim
2

Untuk memberikan kasus penggunaan (setelah menghabiskan waktu dengan jawaban lain):

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

Pada dasarnya anytanpa korsleting: mungkin berguna jika Anda perlu memproses setiap item dan mencatat setidaknya satu keberhasilan, dll.

Lihat juga peringatan dalam jawaban ini

scharfmn
sumber
1

Dalam Python, | = (ior) bekerja seperti operasi gabungan. seperti jika x = 5 dan x | = 5 maka kedua nilai tersebut akan dikonversi terlebih dahulu ke dalam nilai biner kemudian operasi penyatuan akan dilakukan dan kita mendapatkan jawaban 5.

aanchal.s
sumber