Câu trả lời:
|=thực hiện một thao tác tại chỗ + giữa các cặp đối tượng. Đặc biệt, giữa:
Trong hầu hết các trường hợp, nó liên quan đến | nhà điều hành. Xem ví dụ bên dưới.
Bộ
Ví dụ, sự kết hợp của hai tập hợp được gán s1và s2chia sẻ các biểu thức tương đương sau:
>>> s1 = s1 | s12 # 1
>>> s1 |= s2 # 2
>>> s1.__ior__(s2) # 3
trong đó giá trị cuối cùng của s1tương đương bằng:
Thí dụ
Ở đây chúng tôi áp dụng OR ( |) và thay thế OR ( |=) cho các bộ :
>>> 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'}
Từ điển
Trong Python 3.9+ , các toán tử merge ( |) và update ( |=) mới được đề xuất giữa các từ điển. Lưu ý: những toán tử này không giống với toán tử tập hợp đã đề cập ở trên.
Đưa ra các phép toán giữa hai phần được chỉ định d1và d2:
>>> d1 = d1 | d2 # 1
>>> d1 |= d2 # 2
d1tương đương ở đâu qua:
d1.update(d2)Thí dụ
Ở đây chúng tôi áp dụng merge ( |) và update ( |=) cho các 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}
Bộ đếm
Nó collections.Countercó liên quan đến một cấu trúc dữ liệu toán học được gọi là multiset (mset). Về cơ bản, nó là một mệnh lệnh của các cặp khóa-giá trị (đối tượng, tính đa dạng).
Đưa ra các hoạt động giữa hai bộ đếm được chỉ định c1và c2:
>>> c1 = c1 | c2 # 1
>>> c1 |= c2 # 2
c1tương đương ở đâu qua:
Một tổ hợp nhiều tập chứa số nhân tối đa cho mỗi mục nhập. Lưu ý, điều này không hoạt động giống như giữa hai tập hợp hoặc giữa hai quân số thông thường.
Thí dụ
Ở đây chúng tôi áp dụng union ( |) và union tại chỗ ( |=) cho Bộ đếm :
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})
Số
Cuối cùng, bạn có thể làm toán nhị phân.
Đưa ra các phép toán giữa hai số được chỉ định n1và n2:
>>> n1 = n1 | n2 # 1
>>> n1 |= n2 # 2
n1tương đương ở đâu qua:
Thí dụ
Ở đây chúng tôi áp dụng bitwise OR ( |) và bitwise OR ( ) tại chỗ |=cho các số :
>>> n1 = 0
>>> n2 = 1
>>> # Bitwise OR, |
>>> n1 | n2
1
>>> n1
0
>>> # Inplace Bitwise OR, |=
>>> n1 |= n2
>>> n1
1
Ôn tập
Phần này xem xét ngắn gọn một số phép toán bitwise. Trong trường hợp đơn giản nhất, phép toán OR theo bit so sánh hai bit nhị phân. Nó sẽ luôn trả về 1ngoại trừ khi cả hai bit 0.
>>> assert 1 == (1 | 1) == (1 | 0) == (0 | 1)
>>> assert 0 == (0 | 0)
Bây giờ chúng tôi mở rộng ý tưởng này ra ngoài số nhị phân. Cho hai số tích phân bất kỳ (thiếu các thành phần phân số), chúng tôi áp dụng OR theo bit và nhận được kết quả tích phân:
>>> a = 10
>>> b = 16
>>> a | b
26
Làm sao? Nói chung, các hoạt động bitwise tuân theo một số "quy tắc":
Hãy áp dụng các quy tắc này cho các số nguyên thông thường của chúng tôi ở trên.
(1) So sánh các giá trị tương đương nhị phân, được xem ở đây dưới dạng chuỗi ( 0bbiểu thị nhị phân):
>>> bin(a)
'0b1010'
>>> bin(b)
'0b10000'
(2) Áp dụng thao tác OR bitwise cho mỗi cột ( 0khi cả hai đều là 0khác 1):
01010
10000
-----
11010
(3) Trả về kết quả ở kiểu đã cho, ví dụ: cơ số 10, số thập phân:
>>> int(0b11010)
26
So sánh nhị phân nội bộ có nghĩa là chúng ta có thể áp dụng thứ hai cho các số nguyên trong bất kỳ cơ số nào, ví dụ: hex và octal:
>>> c = 0xa
>>> d = 0o32
>>> c | d
26
Xem thêm
__ior__()phương thức để lặp các đoạn lặp trong một MutableSetlớp cơ sở trừu tượng|=để cập nhật một tập hợp+ Không thể áp dụng toán tử OR theo chiều bit tại chỗ cho các ký tự; gán tên các đối tượng.
++ Các phương thức đặc biệt trả về các hoạt động giống như các toán tử tương ứng của chúng.
ints không thể thay đổi trong Python.
Trong Python và nhiều ngôn ngữ lập trình khác, |là phép toán OR theo bit . |=là |như +=là+ , tức là một sự kết hợp hoạt động và asignment.
Vì vậy, var |= valuelà viết tắt củavar = var | value .
Một trường hợp sử dụng phổ biến là hợp nhất hai tập hợp:
>>> a = {1,2}; a |= {3,4}; print(a)
{1, 2, 3, 4}
Đây chỉ là một phép toán OR giữa biến hiện tại và biến khác. Đang T=Truevà F=False, xem kết quả đầu ra bằng đồ thị:
r s r|=s
--------------
T T T
T F T
F T T
F F F
Ví dụ:
>>> r=True
>>> r|=False
>>> r
True
>>> r=False
>>> r|=False
>>> r
False
>>> r|=True
>>> r
True
|là một toán tử-hoặc bit đối với số nguyên, không cụ thể là toán tử boolean và đối với bất kỳ thứ gì khác ngoài bools, nó sẽ không thực sự tạo ra Truehoặc xuất Falsera. boollà một lớp con của int, và tốt hơn là họ đã nạp chồng nó boolđể tiếp tục sản xuất True/ Falseđầu ra, nhưng trong hầu hết các trường hợp, các hoạt động boolean nên được thực hiện với orchứ không phải |. Việc sử dụng bình thường cho |là bitwise-or, hoặc set-union. Ví dụ tốt hơn về việc sử dụng sẽ là một cái gì đó giống như cái gì a = 0b1001; a |= 0b0010; print(bin(a))đó tạo ra 0b1011.
Nó thực hiện phép OR theo chiều bit nhị phân của phía bên trái và bên phải của phép gán, sau đó lưu trữ kết quả trong biến bên trái.
http://docs.python.org/reference/expressions.html#binary-bitwise-operations
Đó là một chút hoặc. Giả sử chúng ta có 32 |= 10, hình 32 và 10 là nhị phân.
32 = 10 0000
10 = 00 1010
Bây giờ vì | là hoặc, làm một chút hoặc trên hai số
tức là 1 hoặc 0 -> 1, 0 hoặc 0 -> 0. Tiếp tục điều này xuống chuỗi
10 0000 | 00 1010 = 10 1010.
Bây giờ thay đổi số nhị phân thành số thập phân, 10 1010 = 42.
Đối với | =, hãy nghĩ đến các ví dụ đã biết x +=5,. Nó có nghĩa là x = x + 5,vì thế nếu chúng ta có x |= 5, nó có nghĩa x = x bitwiseor with 5.
32 |= 10nhưng đúng hơn 32 | 10. Chỉ cần làm rõ điều này cho độc giả tương lai :)
Để đưa ra một trường hợp sử dụng (sau khi dành thời gian cho các câu trả lời khác):
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
Về cơ bản anykhông có hiện tượng đoản mạch: có thể hữu ích nếu bạn cần xử lý mọi mục và ghi lại ít nhất một thành công, v.v.
Xem thêm những lưu ý trong câu trả lời này
|cũng được sử dụng làm toán tử liên hiệp thiết lập