W Pythonie 3.9+ nowe operatory merge ( |) i update ( |=) są proponowane między słownikami. Uwaga: to nie to samo, co operatory zbioru wymienione powyżej.
Biorąc pod uwagę operacje między dwoma przypisanymi dyktami d1i d2:
>>> d1 = d1 | d2 # 1>>> d1 |= d2 # 2
gdzie d1odpowiada poprzez:
przypisana operacja z prawem scalania
operacja typu „merge-right” (aktualizacja) w miejscu; równoważnyd1.update(d2)
Przykład
Tutaj stosujemy merge ( |) i update ( |=) do dykt :
collections.CounterDotyczy matematycznego datastructure zwanego multiset (MSET). Jest to w zasadzie dyktando par klucz-wartość (obiekt, wielokrotność).
Dane operacje między dwoma przypisanymi licznikami c1i c2:
>>> c1 = c1 | c2 # 1>>> c1 |= c2 # 2
gdzie c1odpowiada poprzez:
przypisana operacja związkowa
operacja związkowa na miejscu
Unia multisets zawiera krotności maksymalnych na wejściu. Uwaga, nie zachowuje się to tak samo, jak między dwoma zestawami lub między dwoma zwykłymi dyktami.
Przykład
Tutaj stosujemy union ( |) i in-place union ( |=) do Counters :
W tej sekcji krótko omówiono matematykę bitową. W najprostszym przypadku operacja bitowa OR porównuje dwa bity binarne. Zawsze zwróci, 1z wyjątkiem sytuacji, gdy oba bity są 0.
>>>assert1==(1|1)==(1|0)==(0|1)>>>assert0==(0|0)
Teraz rozszerzymy ten pomysł poza liczby binarne. Biorąc pod uwagę dowolne dwie liczby całkowite (bez składników ułamkowych), stosujemy bitowe OR i otrzymujemy wynik całkowity:
>>> a =10>>> b =16>>> a | b
26
W jaki sposób? Ogólnie rzecz biorąc, operacje bitowe podlegają pewnym „regułom”:
wewnętrznie porównaj odpowiedniki binarne
zastosować operację
zwraca wynik jako podany typ
Zastosujmy te reguły do naszych zwykłych liczb całkowitych powyżej.
(1) Porównaj odpowiedniki binarne, widziane tutaj jako ciągi ( 0boznacza binarne):
>>> bin(a)'0b1010'>>> bin(b)'0b10000'
(2) Zastosuj bitową operację OR do każdej kolumny ( 0gdy obie są 0, w przeciwnym razie 1):
0101010000-----11010
(3) Zwróć wynik w podanym typie, np. Podstawa 10, dziesiętna:
>>> int(0b11010)26
Wewnętrzne porównanie binarne oznacza, że możemy zastosować to drugie do liczb całkowitych o dowolnej podstawie, np. Szesnastkowej i ósemkowej:
Żeby było jasne, dodałbym do demonstracji, że po wykonaniu zwykłego przypisania (x = x | y) id (x) zmieniło się, ponieważ jest to nowy obiekt, podczas gdy | = zachowuje ten sam identyfikator, ponieważ jest to oryginalne x, które jest modyfikowany, stąd nazwa „inplace”.
Florimond
1
To powinna być najlepsza odpowiedź - jest najbardziej wyczerpująca.
Nick
W sekcji liczbowej twierdzisz, że druga instrukcja wykonuje operacje na miejscu. Myślę, że to nieprawda, ponieważ intnie można ich zmieniać w Pythonie.
Asocia
106
W Pythonie i wielu innych językach programowania |jest operacja bitowa-OR . |=jest |tak, jak +=jest +, tj. połączenie operacji i przypisania.
Więc var |= valuejest skrótem od var = var | value.
Typowym przypadkiem użycia jest połączenie dwóch zestawów:
Czytałem kod i |=został użyty w określonym kontekście i dopiero gdy się pogubiłem i zorientowałem się, że zauważyłem, że ta odpowiedź również jest tutaj
TallChuck
41
To jest po prostu operacja OR między bieżącą zmienną a drugą. Będąc T=Truei F=False, zobacz dane wyjściowe graficznie:
r s r|=s
--------------
T T T
T F T
F T T
F F F
Na przykład:
>>> r=True>>> r|=False>>> r
True>>> r=False>>> r|=False>>> r
False>>> r|=True>>> r
True
Daje to coś w rodzaju wypaczonego wrażenia operatora; |jest operatorem bitowym lub dla liczb całkowitych, a nie operatorem logicznym, a dla czegokolwiek innego niż bools, w rzeczywistości nie generuje Trueani nie wyświetla Falsewyników. booljest podklasą inti żeby być miłym, przeładowali ją, boolaby kontynuować produkcję True/ Falsewyjścia, ale w większości przypadków operacje logiczne powinny być wykonywane za pomocą or, nie |. Normalne zastosowania |to to bitowa lub set-union. Lepszymi przykładami użycia byłoby coś, a = 0b1001; a |= 0b0010; print(bin(a))co produkuje 0b1011.
ShadowRanger,
9
Wykonuje binarne bitowe OR lewej i prawej strony przypisania, a następnie zapisuje wynik w lewej zmiennej.
to jest wyjaśnienie, którego szukałem, wszyscy mówili o zestawach i boolach, ale nikt nie wspomniał o ich zastosowaniu z liczbami.
Ankush Verma
Przykład, który podałeś, nie jest, 32 |= 10ale raczej 32 | 10.
Żeby
@ sniper71 jaki jest wynik 32 | = 10
Future-Jim
2
Aby podać przypadek użycia (po spędzeniu czasu z innymi odpowiedziami):
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
Zasadniczo anybez zwarcia: może być przydatne, jeśli musisz przetworzyć każdy element i odnotować co najmniej jeden sukces itp.
W Pythonie, | = (ior) działa jak operacja na sumieniu. na przykład jeśli x = 5 i x | = 5, obie wartości zostaną najpierw przekonwertowane na wartość binarną, a następnie zostanie wykonana operacja sumowania i otrzymamy odpowiedź 5.
|
jest również używana jako operator set unionOdpowiedzi:
|=
wykonuje operację w miejscu + między parami obiektów. W szczególności między:W większości przypadków jest to związane z
|
operatorem. Zobacz przykłady poniżej.Zestawy
Na przykład połączenie dwóch przypisanych zestawów
s1
is2
współdzielenie następujących równoważnych wyrażeń:gdzie końcowa wartość
s1
jest równoważna albo przez:Przykład
Tutaj stosujemy OR (
|
) i inplace OR (|=
) do zestawów :Słowniki
W Pythonie 3.9+ nowe operatory merge (
|
) i update (|=
) są proponowane między słownikami. Uwaga: to nie to samo, co operatory zbioru wymienione powyżej.Biorąc pod uwagę operacje między dwoma przypisanymi dyktami
d1
id2
:gdzie
d1
odpowiada poprzez:d1.update(d2)
Przykład
Tutaj stosujemy merge (
|
) i update (|=
) do dykt :Liczniki
collections.Counter
Dotyczy matematycznego datastructure zwanego multiset (MSET). Jest to w zasadzie dyktando par klucz-wartość (obiekt, wielokrotność).Dane operacje między dwoma przypisanymi licznikami
c1
ic2
:gdzie
c1
odpowiada poprzez:Unia multisets zawiera krotności maksymalnych na wejściu. Uwaga, nie zachowuje się to tak samo, jak między dwoma zestawami lub między dwoma zwykłymi dyktami.
Przykład
Tutaj stosujemy union (
|
) i in-place union (|=
) do Counters :Liczby
Na koniec możesz wykonywać obliczenia binarne.
Biorąc pod uwagę operacje między dwoma przypisanymi numerami
n1
in2
:gdzie
n1
odpowiada poprzez:Przykład
Tutaj stosujemy bitowe OR (
|
) i lokalne bitowe OR (|=
) do liczb :Przejrzeć
W tej sekcji krótko omówiono matematykę bitową. W najprostszym przypadku operacja bitowa OR porównuje dwa bity binarne. Zawsze zwróci,
1
z wyjątkiem sytuacji, gdy oba bity są0
.Teraz rozszerzymy ten pomysł poza liczby binarne. Biorąc pod uwagę dowolne dwie liczby całkowite (bez składników ułamkowych), stosujemy bitowe OR i otrzymujemy wynik całkowity:
W jaki sposób? Ogólnie rzecz biorąc, operacje bitowe podlegają pewnym „regułom”:
Zastosujmy te reguły do naszych zwykłych liczb całkowitych powyżej.
(1) Porównaj odpowiedniki binarne, widziane tutaj jako ciągi (
0b
oznacza binarne):(2) Zastosuj bitową operację OR do każdej kolumny (
0
gdy obie są0
, w przeciwnym razie1
):(3) Zwróć wynik w podanym typie, np. Podstawa 10, dziesiętna:
Wewnętrzne porównanie binarne oznacza, że możemy zastosować to drugie do liczb całkowitych o dowolnej podstawie, np. Szesnastkowej i ósemkowej:
Zobacz też
__ior__()
metody w celu iteracji iteracji w plikuMutableSet
abstrakcyjnej klasie bazowej|=
zaktualizować zestaw+ W miejscu bitowego operatora OR nie można zastosować do literałów; przypisywać obiekty do nazw.
++ Metody specjalne zwracają te same operacje, co odpowiadające im operatory.
źródło
int
nie można ich zmieniać w Pythonie.W Pythonie i wielu innych językach programowania
|
jest operacja bitowa-OR .|=
jest|
tak, jak+=
jest+
, tj. połączenie operacji i przypisania.Więc
var |= value
jest skrótem odvar = var | value
.Typowym przypadkiem użycia jest połączenie dwóch zestawów:
źródło
W przypadku użycia z zestawami wykonuje operację sumowania.
źródło
|=
został użyty w określonym kontekście i dopiero gdy się pogubiłem i zorientowałem się, że zauważyłem, że ta odpowiedź również jest tutajTo jest po prostu operacja OR między bieżącą zmienną a drugą. Będąc
T=True
iF=False
, zobacz dane wyjściowe graficznie:Na przykład:
źródło
|
jest operatorem bitowym lub dla liczb całkowitych, a nie operatorem logicznym, a dla czegokolwiek innego niżbool
s, w rzeczywistości nie generujeTrue
ani nie wyświetlaFalse
wyników.bool
jest podklasąint
i żeby być miłym, przeładowali ją,bool
aby kontynuować produkcjęTrue
/False
wyjścia, ale w większości przypadków operacje logiczne powinny być wykonywane za pomocąor
, nie|
. Normalne zastosowania|
to to bitowa lub set-union. Lepszymi przykładami użycia byłoby coś,a = 0b1001; a |= 0b0010; print(bin(a))
co produkuje0b1011
.Wykonuje binarne bitowe OR lewej i prawej strony przypisania, a następnie zapisuje wynik w lewej zmiennej.
http://docs.python.org/reference/expressions.html#binary-bitwise-operations
źródło
Jest bitowy lub. Powiedzmy, że mamy
32 |= 10
, obrazki 32 i 10 są binarne.Teraz, ponieważ | jest lub, wykonaj bitowo lub na dwóch liczbach
tj. 1 lub 0 -> 1, 0 lub 0 -> 0. Kontynuuj w dół łańcucha
Teraz zmień liczbę dwójkową na dziesiętną, 10 1010 = 42.
Dla | =, pomyślcie o znanych przykładach
x +=5
. Oznacza to,x = x + 5,
że jeśli mamyx |= 5
, to znaczyx = x bitwiseor with 5
.źródło
32 |= 10
ale raczej32 | 10
.Aby podać przypadek użycia (po spędzeniu czasu z innymi odpowiedziami):
Zasadniczo
any
bez zwarcia: może być przydatne, jeśli musisz przetworzyć każdy element i odnotować co najmniej jeden sukces itp.Zobacz także zastrzeżenia w tej odpowiedzi
źródło
W Pythonie, | = (ior) działa jak operacja na sumieniu. na przykład jeśli x = 5 i x | = 5, obie wartości zostaną najpierw przekonwertowane na wartość binarną, a następnie zostanie wykonana operacja sumowania i otrzymamy odpowiedź 5.
źródło