hakkında list
İlk önce her şeyin takip edileceği çok önemli bir nokta (umarım).
Sıradan Python'da, list
hiçbir şekilde özel değildir (çoğunlukla tarihi bir kaza olan inşaat için sevimli sözdizimine sahip olmak dışında). Bir liste yapıldıktan sonra [3,2,6]
, tüm niyet ve amaçlar için, bir sayı 3
, küme {3,7}
veya bir fonksiyon gibi sıradan bir Python nesnesi içindir lambda x: x+5
.
(Evet, öğelerini değiştirmeyi destekler ve yinelemeyi ve diğer birçok şeyi destekler, ancak bu sadece bir türdür: bazı işlemleri desteklerken bazılarını destekler. İnt bir güce yükseltmeyi destekler, ancak bu çok özel kılmak - int bir şey budur. lambda aramayı destekler, ama bu çok özel yapmaz - sonuçta lambda bunun için ne var :).
hakkında and
and
bir operatör değil ("operatör" diyebilirsiniz, ancak "operatör" için de arayabilirsiniz :). Python'daki işleçler, genellikle bu türün bir parçası olarak yazılan, belirli türdeki nesneler üzerinde çağrılan yöntemlerle uygulanır. Bir yöntemin bazı işlenenlerinin değerlendirmesini yapmasının bir yolu yoktur, ancak and
bunu yapabilir (ve yapmalıdır).
Bunun sonucu, and
aşırı yüklenememesi, aşırı for
yüklenememesidir. Tamamen geneldir ve belirli bir protokol aracılığıyla iletişim kurar. Ne yapabilirsiniz yapmak protokolün sizin bölümünü özelleştirmek olduğunu, ama bu davranışını değiştirebilir anlamına gelmez and
tamamen. Protokol:
Python'un "a ve b" yi yorumladığını düşünün (bu tam anlamıyla bu şekilde gerçekleşmez, ancak anlamaya yardımcı olur). "Ve" söz konusu olduğunda, az önce değerlendirdiği (a) nesnesine bakar ve şunu sorar: doğru musunuz? ( NOT : siz misiniz True
?) Eğer bir sınıfın yazarıysanız, bu yanıtı özelleştirebilirsiniz. Eğer a
cevaplar "hayır" ise and
(b'yi tamamen atlar, hiç değerlendirilmez ve) diyor ki: a
benim sonucum ( NOT : Yanlış benim sonucum).
Yanıt a
vermezse and
soruyor: uzunluğunuz nedir? (Yine, bunu a
sınıfının yazarı olarak özelleştirebilirsiniz ). Eğer a
cevaplar 0, and
yukarıdaki ile aynı ise - yanlış olduğunu düşünmez (yanlış değil ), b'yi atlar ve a
sonuç olarak verir .
Eğer a
ikinci soruya 0'dan farklı cevaplar şey ( "sizin süresi nedir"), ya da hiç cevap vermez veya ilk one ( "true") olduğu için "evet" cevapları, and
b değerlendirir ve diyor ki: b
benim sonucum. O unutmayın DEĞİL sormak b
herhangi bir soru.
Tüm bunları söylemenin diğer yolu , a'nın sadece bir kez değerlendirilmesi dışında a and b
neredeyse aynı b if a else a
olmasıdır.
Şimdi bir kalem ve kağıtla birkaç dakika oturun ve {a, b}, {True, False} öğesinin bir alt kümesi olduğunda, tam olarak Boole operatörlerinden beklediğiniz gibi çalıştığına ikna edin. Ama umarım seni çok daha genel olduğuna ikna ettim ve göreceğin gibi, bu şekilde çok daha kullanışlı.
Bu ikisini bir araya getirmek
Şimdi umarım örnek 1'i anlarsınız. and
Mylist1'in bir sayı, liste, lambda veya Argmhbl sınıfının bir nesnesi olup olmadığı umrunda değildir. Sadece mylist1'in protokolün sorularına cevabını önemsiyor. Ve elbette, mylist1 uzunluk hakkındaki soruya 5 cevap verir ve mylist2 öğesini döndürür. Ve bu kadar. Mylist1 ve mylist2 unsurları ile ilgisi yoktur - resme hiçbir yere girmezler.
İkinci örnek: &
açıklist
Öte yandan, örneğin &
diğerleri gibi bir operatör +
. Bir sınıf için o sınıfta özel bir yöntem tanımlanarak tanımlanabilir. int
bunu bitsel "ve" olarak tanımlar ve bool bunu mantıksal "ve" olarak tanımlar, ancak bu sadece bir seçenektir: örneğin, setler ve dikte tuşları görünümleri gibi diğer bazı nesneler bunu küme kesişimi olarak tanımlar. list
muhtemelen bunu tanımlamaz, çünkü Guido onu tanımlamanın açık bir yolunu düşünmemiştir.
dizi
Diğer bacak üzerinde: -D, numpy diziler vardır , özel ya da en azından onlar için çalışıyoruz. Elbette, numpy.array sadece bir sınıftır, and
herhangi bir şekilde geçersiz kılınamaz , bu yüzden bir sonraki en iyi şeyi yapar: "doğru mısın" sorulduğunda, numpy.array etkili bir şekilde "lütfen soruyu yeniden ifade et, msgstr "Doğrunun görüşü modelinize uymuyor" + + msgid ". (ValueError mesajının bahsetmediğini unutmayın and
- çünkü numpy.array soruyu kimin sorduğunu bilmiyor ; sadece gerçek hakkında konuşuyor.)
Çünkü &
tamamen farklı bir hikaye. numpy.array onu istediği gibi tanımlayabilir &
ve diğer işleçlerle tutarlı olarak tanımlar : nokta. Sonunda istediğini elde edersin.
HTH,
np.bitwise_and()
venp.logical_and()
ve arkadaşlar karışıklığı önlemek için.