เกี่ยวกับ list
จุดแรกที่สำคัญมากซึ่งทุกอย่างจะตามมา (ฉันหวังว่า)
ในไพ ธ อนธรรมดาlistไม่ได้มีความพิเศษ แต่อย่างใด (ยกเว้นมีซินแท็กซ์ที่น่ารักสำหรับการสร้างซึ่งส่วนใหญ่เป็นอุบัติเหตุทางประวัติศาสตร์) เมื่อรายการ[3,2,6]จะทำก็คือสำหรับ intents และวัตถุประสงค์เพียงวัตถุหลามธรรมดาเช่นหมายเลข3ชุดหรือฟังก์ชั่น{3,7}lambda x: x+5
(ใช่มันรองรับการเปลี่ยนแปลงองค์ประกอบของมันและรองรับการทำซ้ำและสิ่งอื่น ๆ อีกมากมาย แต่นั่นเป็นสิ่งที่ประเภท: สนับสนุนการดำเนินงานบางอย่างในขณะที่ไม่สนับสนุนคนอื่น ๆ int สนับสนุนการเพิ่มอำนาจ แต่ไม่ได้ ทำให้มันพิเศษมาก - มันคือสิ่งที่ int เป็น lambda รองรับการโทร แต่นั่นไม่ได้ทำให้พิเศษมาก - นั่นคือสิ่งที่แลมบ์ดาใช้สำหรับ :)
เกี่ยวกับ and
andไม่ใช่ตัวดำเนินการ (คุณสามารถเรียกมันว่า "โอเปอเรเตอร์" แต่คุณสามารถเรียกว่า "สำหรับ" โอเปอเรเตอร์ได้เช่นกัน :) ตัวดำเนินการใน Python เป็นวิธีการ (นำไปใช้ผ่าน) ที่เรียกใช้บนวัตถุบางชนิดซึ่งมักเขียนเป็นส่วนหนึ่งของชนิดนั้น ไม่มีวิธีใดสำหรับวิธีที่จะระงับการประเมินผลตัวถูกดำเนินการบางอย่าง แต่andสามารถ (และต้อง) ทำเช่นนั้น
ผลที่ตามมาก็คือ andไม่สามารถโหลดได้มากเกินไปเช่นเดียวกับที่forไม่สามารถโอเวอร์โหลดได้ มันเป็นเรื่องทั่วไปอย่างสมบูรณ์และสื่อสารผ่านโปรโตคอลที่ระบุ สิ่งที่คุณสามารถทำได้คือปรับแต่งส่วนของโพรโทคอล แต่นั่นไม่ได้หมายความว่าคุณสามารถปรับเปลี่ยนพฤติกรรมของโพรโทคอลได้andอย่างสมบูรณ์ โปรโตคอลคือ:
ลองนึกภาพ Python ตีความ "a และ b" (สิ่งนี้ไม่ได้เกิดขึ้นในลักษณะนี้ แต่ช่วยให้เข้าใจได้) เมื่อพูดถึง "และ" มันจะดูที่วัตถุที่เพิ่งประเมิน (a) และถามว่า: คุณจริงหรือไม่ ( ไม่ : คุณเป็นTrueอย่างไร) หากคุณเป็นผู้แต่งชั้นเรียนคุณสามารถปรับแต่งคำตอบนี้ได้ ถ้าaคำตอบ "ไม่" and(ข้าม b อย่างสมบูรณ์จะไม่ได้รับการประเมินเลยและ) บอกว่า: aคือผลลัพธ์ของฉัน ( ไม่ใช่ : เท็จคือผลลัพธ์ของฉัน)
ถ้าaไม่ตอบandให้ถามมันความยาวของคุณคืออะไร (อีกครั้งคุณสามารถปรับแต่งสิ่งนี้เป็นผู้เขียนของaคลาส) ถ้าaตอบ 0andทำเช่นเดียวกันกับด้านบน - ถือว่าเป็นเท็จ ( ไม่ใช่เท็จ) ข้าม b และให้aผลลัพธ์
หากaตอบคำถามอื่นที่ไม่ใช่ 0 ถึงคำถามที่สอง ("ความยาวของคุณคืออะไร") หรือไม่ตอบเลยหรือตอบว่า "ใช่" กับคำถามแรก ("คุณเป็นคนจริง") andประเมินค่า b และ พูดว่า: bคือผลลัพธ์ของฉัน โปรดทราบว่าจะไม่ถามbคำถามใด ๆ
อีกวิธีหนึ่งในการพูดทั้งหมดนี้a and bคือเกือบจะเหมือนกับb if a else aยกเว้น a ถูกประเมินเพียงครั้งเดียว
ทีนี้นั่งสักครู่ด้วยปากกาและกระดาษและโน้มน้าวตัวเองว่าเมื่อ {a, b} เป็นส่วนย่อยของ {True, False} มันทำงานได้อย่างที่คุณคาดหวังจากผู้ให้บริการบูลีน แต่ฉันหวังว่าฉันจะทำให้คุณมั่นใจว่ามันเป็นเรื่องทั่วไปมากขึ้นและอย่างที่คุณเห็นมันมีประโยชน์มากกว่านี้
นำสองสิ่งนี้มารวมกัน
ตอนนี้ฉันหวังว่าคุณจะเข้าใจตัวอย่างของคุณ 1 andไม่สนใจว่า mylist1 เป็นตัวเลขรายการแลมบ์ดาหรือวัตถุของคลาส Argmhbl เพียงแค่ใส่ใจกับคำตอบของ mylist1 สำหรับคำถามของโปรโตคอล และแน่นอน mylist1 ตอบคำถาม 5 ข้อเกี่ยวกับความยาวดังนั้นและส่งคืน mylist2 และนั่นคือมัน มันไม่มีส่วนเกี่ยวข้องกับองค์ประกอบของ mylist1 และ mylist2 - พวกเขาไม่ได้ป้อนรูปภาพทุกที่
ตัวอย่างที่สอง: &เปิดlist
ในทางกลับกัน&ผู้ประกอบการเหมือนคนอื่น ๆ เช่น+เป็น มันสามารถกำหนดประเภทโดยการกำหนดวิธีการพิเศษในชั้นเรียนนั้น intกำหนดเป็นบิต "และ" และบูลกำหนดเป็นตรรกะ "และ" แต่นั่นเป็นเพียงหนึ่งตัวเลือก: ยกตัวอย่างเช่นชุดและวัตถุอื่น ๆ เช่นมุมมองปุ่ม Dict กำหนดมันเป็นจุดตัดชุดlistเพียงแค่ไม่ได้นิยามอาจเป็นเพราะกุยโดไม่ได้คิดวิธีการกำหนดที่ชัดเจน
numpy
ในอีกด้านหนึ่ง: -D อาร์เรย์ที่มีจำนวนมากเป็นพิเศษหรืออย่างน้อยก็พยายามเป็น แน่นอนว่า numpy.array เป็นเพียงคลาสมันไม่สามารถแทนที่ได้andในทางใดทางหนึ่งดังนั้นจึงทำสิ่งที่ดีที่สุดต่อไป: เมื่อถูกถามว่า "คุณจริงหรือไม่" numpy.array เพิ่ม ValueError โดยพูดว่า "โปรดใช้คำถามใหม่อีกครั้ง มุมมองของความจริงไม่สอดคล้องกับโมเดลของคุณ " (โปรดทราบว่าข้อความ ValueError ไม่ได้พูดถึงand- เนื่องจาก numpy.array ไม่รู้ว่าใครกำลังถามคำถามมันแค่พูดถึงความจริงเท่านั้น)
สำหรับ&มันเป็นเรื่องที่แตกต่างอย่างสิ้นเชิง numpy.array สามารถกำหนดได้ตามที่ต้องการและจะกำหนด&อย่างสม่ำเสมอกับตัวดำเนินการอื่น ๆ : pointwise ดังนั้นในที่สุดคุณก็จะได้สิ่งที่คุณต้องการ
HTH,
np.bitwise_and()และnp.logical_and()และเพื่อน ๆ เพื่อหลีกเลี่ยงความสับสน