Tentang list
Pertama, poin yang sangat penting, dari mana semuanya akan mengikuti (saya harap).
Dalam Python biasa, list
tidak khusus dengan cara apa pun (kecuali memiliki sintaks lucu untuk membangun, yang sebagian besar merupakan kecelakaan historis). Setelah daftar [3,2,6]
dibuat, itu untuk semua maksud dan tujuan hanya objek Python biasa, seperti angka 3
, set {3,7}
, atau fungsi lambda x: x+5
.
(Ya, ia mendukung pengubahan elemen-elemennya, dan mendukung iterasi, dan banyak hal lainnya, tetapi itulah jenisnya: ia mendukung beberapa operasi, sementara tidak mendukung beberapa yang lain. Int mendukung peningkatan daya, tetapi itu tidak buat itu sangat istimewa - itu hanya int. lambda mendukung pemanggilan, tapi itu tidak membuatnya sangat istimewa - itulah gunanya lambda :)
Tentang and
and
bukan operator (Anda dapat menyebutnya "operator", tetapi Anda dapat memanggil "untuk" operator juga :). Operator di Python adalah (diimplementasikan melalui) metode yang dipanggil pada objek dari beberapa jenis, biasanya ditulis sebagai bagian dari jenis itu. Tidak ada cara bagi suatu metode untuk mengadakan evaluasi terhadap beberapa operandnya, tetapi and
dapat (dan harus) melakukannya.
Konsekuensi dari itu adalah bahwa and
tidak dapat kelebihan beban, sama seperti for
tidak dapat kelebihan beban. Ini sepenuhnya umum, dan berkomunikasi melalui protokol yang ditentukan. Yang dapat Anda lakukan adalah menyesuaikan bagian protokol Anda, tetapi itu tidak berarti Anda dapat mengubah perilaku and
sepenuhnya. Protokolnya adalah:
Bayangkan Python menafsirkan "a dan b" (ini tidak terjadi secara harfiah seperti ini, tetapi membantu memahami). Ketika datang ke "dan", itu melihat objek yang baru saja dievaluasi (a), dan bertanya: apakah Anda benar? ( BUKAN : apakah Anda True
?) Jika Anda seorang penulis kelas a, Anda dapat menyesuaikan jawaban ini. Jika a
jawaban "tidak", and
(melompati b sepenuhnya, itu tidak dievaluasi sama sekali, dan) mengatakan: a
adalah hasil saya ( BUKAN : Salah adalah hasil saya).
Jika a
tidak menjawab, and
tanyakan: berapa panjang Anda? (Sekali lagi, Anda dapat menyesuaikan ini sebagai penulis a
kelas). Jika a
jawaban 0, and
lakukan hal yang sama seperti di atas - menganggapnya salah ( BUKAN Salah), lewati b, dan berikan a
hasilnya.
Jika a
menjawab sesuatu selain 0 untuk pertanyaan kedua ("berapa panjang Anda"), atau tidak menjawab sama sekali, atau menjawab "ya" untuk pertanyaan pertama ("apakah Anda benar"), and
mengevaluasi b, dan mengatakan: b
adalah hasil saya. Perhatikan bahwa ia TIDAK mengajukan b
pertanyaan apa pun.
Cara lain untuk mengatakan semua ini a and b
adalah hampir sama dengan b if a else a
, kecuali a dievaluasi hanya sekali.
Sekarang duduk selama beberapa menit dengan pena dan kertas, dan yakinkan diri Anda bahwa ketika {a, b} adalah himpunan bagian dari {Benar, Salah}, itu berfungsi persis seperti yang Anda harapkan dari operator Boolean. Tetapi saya harap saya telah meyakinkan Anda bahwa itu jauh lebih umum, dan seperti yang akan Anda lihat, jauh lebih bermanfaat dengan cara ini.
Menyatukan keduanya
Sekarang saya harap Anda memahami contoh Anda 1. and
tidak peduli apakah mylist1 adalah angka, daftar, lambda atau objek dari kelas Argmhbl. Itu hanya peduli tentang jawaban mylist1 untuk pertanyaan-pertanyaan protokol. Dan tentu saja, mylist1 menjawab 5 pertanyaan tentang panjang, jadi dan mengembalikan mylist2. Dan itu saja. Ini tidak ada hubungannya dengan elemen mylist1 dan mylist2 - mereka tidak memasukkan gambar di mana pun.
Contoh kedua: &
padalist
Di sisi lain, &
adalah operator seperti yang lain, seperti +
misalnya. Itu dapat didefinisikan untuk tipe dengan mendefinisikan metode khusus pada kelas itu. int
mendefinisikannya sebagai bitwise "dan", dan bool mendefinisikannya sebagai logis "dan", tetapi itu hanya satu opsi: misalnya, set dan beberapa objek lain seperti tampilan kunci dict mendefinisikannya sebagai persimpangan set. list
tidak mendefinisikannya, mungkin karena Guido tidak memikirkan cara yang jelas untuk mendefinisikannya.
numpy
Di sisi lain: -D, array numpy adalah spesial, atau setidaknya mereka berusaha menjadi. Tentu saja, numpy.array hanya sebuah kelas, ia tidak dapat menimpa and
dengan cara apa pun, sehingga ia melakukan hal terbaik berikutnya: ketika ditanya "apakah Anda benar", numpy.array meningkatkan ValueError, secara efektif mengatakan "tolong ulangi pertanyaannya, saya pandangan kebenaran tidak cocok dengan model Anda ". (Perhatikan bahwa pesan ValueError tidak berbicara tentang and
- karena numpy.array tidak tahu siapa yang menanyakannya; itu hanya berbicara tentang kebenaran.)
Sebab &
, ceritanya sangat berbeda. numpy.array dapat mendefinisikannya seperti yang diinginkan, dan mendefinisikan &
secara konsisten dengan operator lain: pointwise. Jadi Anda akhirnya mendapatkan apa yang Anda inginkan.
HTH,
np.bitwise_and()
dannp.logical_and()
dan teman-teman untuk menghindari kebingungan.