2010-03-16 57 views
71

tôi chạy qua nhà điều hành caret trong python ngày hôm nay và đã thử qua, tôi nhận được kết quả như sau:Toán tử dấu mũ (^) trong Python làm gì?

>>> 8^3 
11 
>>> 8^4 
12 
>>> 8^1 
9 
>>> 8^0 
8 
>>> 7^1 
6 
>>> 7^2 
5 
>>> 7^7 
0 
>>> 7^8 
15 
>>> 9^1 
8 
>>> 16^1 
17 
>>> 15^1 
14 
>>> 

Nó dường như được dựa trên 8, vì vậy tôi đoán một số loại hoạt động byte? Tôi dường như không thể tìm thấy nhiều về các trang tìm kiếm khác hơn là nó hoạt động kỳ lạ đối với phao nổi, có ai có liên kết đến những gì nhà điều hành này làm hoặc bạn có thể giải thích nó ở đây không?

+3

Đối với số nguyên, điều tương tự nó trong C.^_- –

+8

FYI, từ vỏ python, bạn có thể gõ 'giúp đỡ ('^') ' – seth

+1

-1: Đây là hoàn toàn nêu trong tài liệu Python và chức năng trợ giúp đi kèm. Đặt câu hỏi này ở đây là ngớ ngẩn. –

Trả lời

109

Đó là một bitwise XOR (độc quyền OR).

Kết quả là đúng nếu một (và chỉ một) của toán hạng (đánh giá là đúng).

Để chứng minh:

>>> 0^0 
0 
>>> 1^1 
0 
>>> 1^0 
1 
>>> 0^1 
1 

Để giải thích một trong những ví dụ của riêng bạn:

>>> 8^3 
11 

Hãy suy nghĩ về nó theo cách này:

 
1000 # 8 (binary) 
0011 # 3 (binary) 
---- # APPLY XOR ('vertically') 
1011 # result = 11 (binary) 
+10

Ví dụ minh họa một chút có thể bao gồm cả hai số có '1' trong cùng một bit để làm cho nó rõ ràng rằng '1 xor 1 = 0'. –

+1

Tôi muốn thêm, bạn có thể làm số nhị phân bằng cách nhập '0bX' trong đó X là nhị phân của bạn. '0b0001',' 0b0010', v.v. Vì vậy, '0b1101^0b1110' sẽ cho bạn' 0b0011' (hoặc 3). – Jeff

+0

Tôi nghĩ rằng "Kết quả là đúng nếu một (và chỉ một) của toán hạng (đánh giá) đúng". là không chính xác, nó sẽ là định nghĩa của một boolean xor –

37

Nó gọi các __xor__() hoặc __rxor__() phương pháp đối tượng khi cần, đối với các loại số nguyên thì có một bit độc quyền hoặc.

+3

+1 để chỉ ra những gì nó * thực sự * làm, bên ngoài hoạt động số nguyên. –

7

Nói chung, biểu tượng ^ là phiên bản infix của các phương pháp __xor__ hoặc __rxor__. Bất kỳ kiểu dữ liệu nào được đặt ở bên phải và bên trái của biểu tượng phải thực hiện chức năng này theo cách tương thích. Đối với số nguyên, nó là phổ biến XOR hoạt động, nhưng ví dụ không có tích hợp sẵn trong định nghĩa của hàm cho loại float với loại int:

In [12]: 3^4 
Out[12]: 7 

In [13]: 3.3^4 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-13-858cc886783d> in <module>() 
----> 1 3.3^4 

TypeError: unsupported operand type(s) for ^: 'float' and 'int' 

Một điều gọn gàng về Python là bạn có thể ghi đè lên hành vi này trong một lớp học của riêng bạn. Ví dụ: trong một số ngôn ngữ, ký hiệu ^ có nghĩa là lũy thừa. Bạn có thể làm điều đó theo cách này, chỉ là một ví dụ:

class Foo(float): 
    def __xor__(self, other): 
     return self ** other 

Sau đó, một cái gì đó như thế này sẽ làm việc, và bây giờ, cho trường hợp của Foo chỉ, biểu tượng ^ sẽ có nghĩa lũy thừa.

In [16]: x = Foo(3) 

In [17]: x 
Out[17]: 3.0 

In [18]: x^4 
Out[18]: 81.0 
+0

woah, điều đó thậm chí có thể? và có lẽ chúng ta có thể thay đổi cách toán tử '+' hoạt động không? –

+0

Vâng, đây là cách biểu tượng '+' có thể thực hiện một loại hành động cho 'danh sách' (nối) trong khi thực hiện một loại hành động khác (bổ sung toán học) cho các kiểu số. Trong trường hợp đó, bạn sẽ ghi đè các phương thức '__add__' hoặc' __radd__' trong lớp của bạn. – ely

+1

Như một lưu ý phụ, phiên bản '__r * __' (như '__rxor__' hoặc' __radd__') sẽ được gọi từ đối số xuất hiện ở phía bên phải * của biểu tượng kết thúc, và chỉ khi cuộc gọi đến chức năng cho biểu tượng bàn tay trái không hoạt động. Bạn có thể nghĩ về nó như 'try: left_hand_symbol .__ xor __ (right_hand_symbol); ngoại trừ: right_hand_symbol .__ rxor __ (left_hand_symbol) ', nhưng' xor' có thể được thay thế bởi bất kỳ toán tử nào có sẵn trong [Python Data Model] (http://docs.python.org/3.1/reference/datamodel.html? highlight = rlshift). – ely

Các vấn đề liên quan