Trong khoảng list
Đầu tiên một điểm rất quan trọng, từ đó mọi thứ sẽ theo sau (tôi hy vọng).
Trong Python thông thường, list
không có gì đặc biệt (ngoại trừ việc có cú pháp dễ thương để xây dựng, phần lớn là một tai nạn lịch sử). Khi một danh sách [3,2,6]
được tạo, nó dành cho tất cả các ý định và mục đích chỉ là một đối tượng Python thông thường, như một số 3
, tập hợp {3,7}
hoặc một hàm lambda x: x+5
.
(Vâng, nó hỗ trợ thay đổi các yếu tố của nó, và nó hỗ trợ lặp lại, và nhiều thứ khác, nhưng đó chỉ là một loại: nó hỗ trợ một số hoạt động, trong khi không hỗ trợ một số hoạt động khác. làm cho nó trở nên rất đặc biệt - đó chỉ là một int. Lambda hỗ trợ gọi, nhưng điều đó không làm cho nó trở nên rất đặc biệt - đó là những gì lambda dành cho, sau tất cả :).
Trong khoảng and
and
không phải là một toán tử (bạn có thể gọi nó là "toán tử", nhưng bạn cũng có thể gọi "cho" một toán tử :). Các toán tử trong Python là các phương thức (được thực hiện thông qua) được gọi trên các đối tượng thuộc loại nào đó, thường được viết như một phần của loại đó. Không có cách nào để một phương thức tổ chức đánh giá một số toán hạng của nó, nhưng and
có thể (và phải) làm điều đó.
Hậu quả của điều đó là and
không thể bị quá tải, giống như for
không thể bị quá tải. Nó hoàn toàn chung chung và giao tiếp thông qua một giao thức được chỉ định. Những gì bạn có thể làm là tùy chỉnh một phần của giao thức, nhưng điều đó không có nghĩa là bạn có thể thay đổi and
hoàn toàn hành vi . Giao thức là:
Tưởng tượng Python diễn giải "a và b" (điều này không xảy ra theo nghĩa đen theo cách này, nhưng nó giúp hiểu). Khi nói đến "và", nó nhìn vào đối tượng mà nó vừa đánh giá (a) và hỏi nó: bạn có đúng không? ( KHÔNG : bạn có phải True
không?) Nếu bạn là tác giả của một lớp, bạn có thể tùy chỉnh câu trả lời này. Nếu a
câu trả lời là "không", and
(bỏ qua b hoàn toàn, nó hoàn toàn không được đánh giá và) nói: a
là kết quả của tôi ( KHÔNG : Sai là kết quả của tôi).
Nếu a
không trả lời, hãy and
hỏi nó: chiều dài của bạn là bao nhiêu? (Một lần nữa, bạn có thể tùy chỉnh điều này với tư cách là tác giả của a
lớp). Nếu a
câu trả lời 0, and
thực hiện tương tự như trên - coi đó là sai ( KHÔNG sai), bỏ qua b và đưa ra a
kết quả.
Nếu a
câu trả lời khác 0 cho câu hỏi thứ hai ("chiều dài của bạn là bao nhiêu") hoặc nó không trả lời gì cả, hoặc nó trả lời "có" cho câu hỏi thứ nhất ("bạn có đúng không"), hãy and
đánh giá b và nói: b
là kết quả của tôi. Lưu ý rằng nó KHÔNG hỏi b
bất kỳ câu hỏi.
Một cách khác để nói tất cả những điều này a and b
là gần giống như b if a else a
, ngoại trừ a chỉ được đánh giá một lần.
Bây giờ hãy ngồi trong vài phút với bút và giấy và tự thuyết phục bản thân rằng khi {a, b} là tập con của {Đúng, Sai}, nó hoạt động chính xác như bạn mong đợi của các toán tử Boolean. Nhưng tôi hy vọng tôi đã thuyết phục bạn rằng nó chung chung hơn nhiều, và như bạn sẽ thấy, theo cách này hữu ích hơn nhiều.
Đặt hai cái đó lại với nhau
Bây giờ tôi hy vọng bạn hiểu ví dụ của bạn 1. and
không quan tâm nếu mylist1 là một số, danh sách, lambda hoặc một đối tượng của một lớp Argmhbl. Nó chỉ quan tâm đến câu trả lời của mylist1 cho các câu hỏi của giao thức. Và tất nhiên, mylist1 trả lời 5 cho câu hỏi về độ dài, và trả về mylist2. Và đó là nó. Nó không liên quan gì đến các yếu tố của mylist1 và mylist2 - họ không nhập hình ảnh vào bất cứ đâu.
Ví dụ thứ hai: &
trênlist
Mặt khác, &
là một toán tử như bất kỳ khác, +
ví dụ như. Nó có thể được định nghĩa cho một kiểu bằng cách định nghĩa một phương thức đặc biệt trên lớp đó. int
định nghĩa nó là bitwise "và", và bool định nghĩa nó là logic "và", nhưng đó chỉ là một tùy chọn: ví dụ: tập hợp và một số đối tượng khác như chế độ xem khóa chính xác định nó là giao điểm đã đặt. list
chỉ không định nghĩa nó, có lẽ bởi vì Guido đã không nghĩ ra bất kỳ cách định nghĩa rõ ràng nào.
numpy
Mặt khác: -D, mảng numpy là đặc biệt, hoặc ít nhất là chúng đang cố gắng để được. Tất nhiên, numpy.array chỉ là một lớp, nó không thể ghi đè and
bằng bất kỳ cách nào, vì vậy nó sẽ làm điều tốt nhất tiếp theo: khi được hỏi "bạn có đúng không", numpy.array đưa ra ValueError, nói một cách hiệu quả "vui lòng viết lại câu hỏi, của tôi quan điểm về sự thật không phù hợp với mô hình của bạn ". (Lưu ý rằng thông điệp ValueError không nói về and
- bởi vì numpy.array không biết ai đang hỏi nó câu hỏi; nó chỉ nói về sự thật.)
Đối với &
, đó là câu chuyện hoàn toàn khác. numpy.array có thể định nghĩa nó theo ý muốn và nó định nghĩa &
nhất quán với các toán tử khác: theo chiều. Vì vậy, cuối cùng bạn đã có được những gì bạn muốn.
HTH
np.bitwise_and()
vànp.logical_and()
và bạn bè để tránh nhầm lẫn.