Tại sao '+' không được hiểu bởi các bộ Python?


90

Tôi muốn biết tại sao điều này hợp lệ:

set(range(10)) - set(range(5))

nhưng điều này không hợp lệ:

set(range(10)) + set(range(5))

Có phải vì '+' có thể có nghĩa là cả giao nhau và kết hợp không?


3
|nghĩa là hợp nhất. Bạn hỏi gì?
S.Lott

13
Đó là bởi vì Guido đã chọn các nhà khai thác khác nhau cho giao lộ và liên hiệp.
David Heffernan

3
@David Heffernan, Guido thường không làm mọi thứ mà không có lý do hoặc ít nhất là một số nguyên tắc hướng dẫn - đó là điều khiến Python trở nên tuyệt vời.
Mark Ransom vào

1
@Mark Ồ, tôi khá chắc anh ấy làm vậy là có lý do chính đáng.
David Heffernan

1
Nếu chỉ ~là một toán tử nhị phân, thì bạn có thể có |for + union và ~for chênh lệch, cân bằng hơn nhiều.
Matt Joiner

Câu trả lời:


109

Các bộ Python không có triển khai cho +toán tử.

Bạn có thể sử dụng |cho hợp nhất thiết lập và &cho giao điểm đặt.

Bộ thực hiện -như sự khác biệt đặt. Bạn cũng có thể sử dụng ^cho chênh lệch tập đối xứng (tức là, nó sẽ trả về một tập hợp mới chỉ với các đối tượng xuất hiện trong một tập hợp nhưng không xuất hiện trong cả hai tập hợp).


2
Cảm ơn. Tôi không biết về | và &.
badzil

99

Python đã chọn sử dụng |thay +vì bởi vì set union là một khái niệm có liên quan chặt chẽ với boolean disjunction; Các vectơ bit (trong python chỉ là int/ long) xác định hoạt động này trên một chuỗi các giá trị boolean và gọi nó là "bitwise hoặc". Trong thực tế, hoạt động này tương tự như liên hiệp tập hợp mà các số nguyên nhị phân đôi khi còn được gọi là "tập hợp bit", trong đó các phần tử trong tập hợp được coi là số tự nhiên.

Bởi vì intđã định nghĩa các toán tử set-like là |, &^, điều tự nhiên là setkiểu mới hơn sẽ sử dụng cùng một giao diện.


7
Tôi nghĩ câu trả lời này giải quyết tốt hơn "tại sao" trong câu hỏi.
Greg Hendershott

1
Có lẽ. +1 cho lý do tại sao. Mặc dù vậy, theo một nghĩa nào đó, ít nhất người hỏi có vẻ hài lòng với việc chỉ biết cách thực hiện liên hợp và giao nhau.
Platinum Azure

2
@Platinum: Tôi thích trả lời câu hỏi thực sự được hỏi, vì vậy khi ai đó khác đi cùng có câu hỏi đó có thể thấy tất cả các câu trả lời hợp lý; ngay cả khi người hỏi câu hỏi ban đầu đã tiếp tục. Giữa hai chúng tôi, chúng tôi trả lời tốt.
SingleNegationElimination

1
@TokenMacGuy: "Bởi vì Python đơn giản là không xác định toán tử" cũng trả lời lý do tại sao. :-P
Platinum Azure

15
Tôi không chắc nó có; "Vì nó là màu xanh" không giải thích "Tại sao bầu trời có màu xanh?"
SingleNegationElimination

36

Trong lý thuyết tập hợp, ký hiệu + thường biểu thị sự kết hợp rời rạc của hai tập hợp. Nếu A và B là tập hợp, liên hợp rời rạc của chúng được định nghĩa là tập hợp

A + B = {(a, 1) | a in A} U {(b, 2) | b in B}

tức là, để xây dựng liên hợp rời rạc, chúng tôi đánh dấu tất cả các phần tử của A và tất cả các phần tử của B bằng các thẻ khác nhau (trong ví dụ tôi đã sử dụng số 1 và 2, nhưng bất kỳ hai "thứ" nào khác nhau sẽ thực hiện công việc) và sau đó lấy hợp của hai tập hợp kết quả. Trong ví dụ trên, tôi đã sử dụng 'U' cho liên hiệp thiết lập để làm cho nó giống với ký hiệu toán học thông thường hơn; bên dưới tôi sử dụng ký hiệu Python, tức là '|' cho liên hiệp và '&' cho giao lộ.

Nếu A và B không rời nhau, A + B tương ứng 1-1 với A | B. Nếu không, thì tất cả các phần tử chung x trong A & B sẽ xuất hiện hai lần trong A + B: một lần là (x, 1) và một lần là (x, 2).

Vì vậy, vì biểu tượng '+' có ý nghĩa được thiết lập khá rõ ràng như một hoạt động tập hợp, tôi thấy rất nhất quán rằng Python không sử dụng biểu tượng này cho liên hiệp hoặc giao điểm được thiết lập. Có lẽ (các) nhà thiết kế Python đã nghĩ đến điều này khi họ chọn các toán tử tập hợp.


5
Đây là câu trả lời tối ưu. Cho đến khi đọc câu trả lời này, tôi đã tự hỏi tại sao Guido lại quá tải người |điều hành cho các công đoàn nhất định nhưng không tìm ra lý do tại sao Guido tránh quá tải người +điều hành cho các công đoàn nhất định. Rốt cuộc, làm như vậy sẽ bảo toàn tính trực giao với +toán tử được nạp chồng cho các bổ sung danh sách. Vì dấu hiệu của Python là sự phù hợp với ký hiệu toán học (ví dụ: jbiểu thị thành phần phức tạp của số phức), lựa chọn gây tò mò của Guido cuối cùng cũng có ý nghĩa.
Cecil Curry

23

Chắc chắn, họ có thể đã từng +làm một hiệp hội, nhưng sau đó sẽ vẫn cần một biểu tượng cho giao lộ. |for union là đối xứng với &giao điểm và do đó tạo ra lựa chọn tốt hơn.


10

Bởi vì |có nghĩa là hợp nhất và &có nghĩa là giao nhau. Rõ ràng không có lý do gì để thêm nhiều toán tử cho cùng một hàm.

Lý do sử dụng |&có thể quay trở lại các hoạt động bitwise. Nếu bạn biểu diễn một tập hợp dưới dạng các bit trong một số, đó là các toán tử bạn sẽ sử dụng để kết hợp và giao nhau.

+đơn giản không ràng buộc với liên minh và -là thiết lập sự khác biệt.


3

Bởi vì sự khác biệt tập hợp là một khái niệm rất hữu ích và thường được biết đến, nhưng không có khái niệm (được sử dụng phổ biến) về “phép cộng tập hợp”.


1
Liên hiệp? Lần cuối cùng bạn nghe ai đó nói “set add” thay vì “union” hoặc sử dụng + thay cho ∪ là khi nào ?. Đôi khi +được định nghĩa là bổ sung thành viên khôn ngoan . Một số sử dụng nó cho sự khác biệt đối xứng . Dù bằng cách nào, bất kỳ tờ báo nào sử dụng nó hoặc gọi nó là thứ khác hoặc định nghĩa nó trước.
Petr Viktorin

1
Ai đó có thể gọi nó là 'bổ sung thiết lập' nếu họ không biết thuật ngữ thích hợp. Rõ ràng những người biết thuật ngữ 'công đoàn' sử dụng thuật ngữ 'công đoàn'.
fluffy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.