ข้อผิดพลาดทั่วไปสำหรับผู้ที่เพิ่งเริ่มเขียนโปรแกรมคือความเข้าใจผิดเกี่ยวกับวิธีการทำงานของตัวดำเนินการบูลีน ซึ่งเกิดขึ้นจากวิธีที่ล่ามหลามอ่านนิพจน์เหล่านี้ ตัวอย่างเช่น หลังจากเริ่มเรียนรู้เกี่ยวกับคำสั่ง "และ " และ "หรือ" เราอาจสันนิษฐานว่านิพจน์ X =('x' หรือ 'y') จะตรวจสอบเพื่อดูว่าตัวแปร X เทียบเท่ากับหนึ่งในสตริง 'a หรือไม่ ' หรือ 'b' นี้ไม่เป็นเช่นนั้น เพื่อให้เข้าใจสิ่งที่ฉันพยายามจะพูด ให้เริ่มเซสชันโต้ตอบกับล่ามและป้อนนิพจน์ต่อไปนี้:
>>> 'x' == ('x' or 'y') True >>> 'y' == ('x' or 'y') False >>> 'x' == ('x' and 'y') False >>> 'y' == ('x' and 'y') True
ณ จุดนี้ ตัวดำเนินการและ และ หรือ ดูเหมือนจะใช้งานไม่ได้ ไม่สมเหตุสมผลสำหรับสองนิพจน์แรก 'x' เทียบเท่ากับ 'x' หรือ 'y' ไม่ใช่ นอกจากนี้ มันไม่สมเหตุสมผลเลยที่ 'y' เทียบเท่ากับ 'x' และ 'y' หลังจากตรวจสอบสิ่งที่ล่ามทำกับโอเปอเรเตอร์บูลีนแล้ว ผลลัพธ์เหล่านี้ทำในสิ่งที่คุณต้องการอย่างแท้จริง ซึ่งไม่เหมือนกับสิ่งที่คุณคิดว่ากำลังถาม
ในกรณีของหรือนิพจน์ ตัวแปล python จะใช้คำสั่งแรกและตรวจสอบเพื่อดูว่าเป็นจริงหรือไม่ เมื่อคำสั่งแรกเป็นจริง python จะคืนค่าของอ็อบเจ็กต์นั้นโดยไม่พิจารณาอาร์กิวเมนต์ที่สอง นี่เป็นเพราะสำหรับ an หรือ นิพจน์ สิ่งทั้งหมดเป็นจริงถ้าค่าใดค่าหนึ่งเป็นจริง และโปรแกรมไม่มีลักษณะเป็นคำสั่งที่สอง อย่างไรก็ตาม หากค่าอ็อบเจ็กต์แรกประเมินเป็นเท็จ python จะตรวจสอบคำสั่งที่สองและส่งกลับค่านั้น ครึ่งหลังกำหนดค่าความจริงของนิพจน์เนื่องจากครึ่งแรกเป็นเท็จ "ความเกียจคร้าน" ในส่วนของล่ามนี้เรียกว่า "การลัดวงจร" และเป็นวิธีทั่วไปในการประเมินนิพจน์บูลีนในภาษาการเขียนโปรแกรมหลายภาษา
ในทำนองเดียวกัน สำหรับ an และ expression python ใช้เทคนิคการลัดวงจรเพื่อเพิ่มความเร็วในการประเมินค่าความจริง หากคำสั่งแรกเป็นเท็จ สิ่งทั้งหมดจะต้องเป็นเท็จ และส่งกลับค่าวัตถุนั้น (เท็จ) อย่างอื่น หากค่าแรกเป็นจริง จะตรวจสอบค่าที่สองและส่งกลับค่านั้น เรามาดูกันว่าล่าม “เห็น” อะไรเมื่อผ่านรหัส
เคสแรก
'x' == ('x' or 'y') # Look at parentheses first, so evaluates "('x' or 'y")" # 'x' is a nonempty string, so the first value is True >>> 'x' == 'x' # the string 'x' is equivalent to the string 'x' , so our expression is True True
กรณีที่สอง
'y' == ('x' or 'y')# Look at parentheses first, so evaluates expression "('x' or 'y')" # 'x' is a nonempty string, so the first value is True #Return that first value : 'x' 'y' == 'x'# the string 'y' is not equivalent to the string 'x', so the expression is False
คดีที่สาม
>>> 'x' == ('x' and 'y')# Look at parentheses first, so evaluate expression "('x' and 'y')" #'x' is a nonempty string, so the first value is True, examine second value # 'y' is a nonempty string, so second value is True #Return that second value as result of whole expression: 'y' >>> 'x' == 'y'# the string 'x' is not equivalent to the string 'y', so expression is False False
กรณีที่สี่
>>> 'y' == ('x' and 'y')# Look at parenthese first, so evaluates expression "('x' and 'y')" True # 'x' is a nonempty string, so the first value is True, examine second value # 'y' is a nonempty string, so second value is True # Return that second value as result of whole expression: 'y' >>> 'y' == 'y'# the string 'y' is equivalent to the string 'y', so expression is True True
การประเมินการลัดวงจรหมายความว่าเมื่อทำการประเมินนิพจน์บูลีน เช่น AND และ OR คุณสามารถหยุดทันทีที่คุณพบเงื่อนไขแรกที่ตรงหรือปฏิเสธนิพจน์
ไฟฟ้าลัดวงจรอธิบายโดยเอกสารอย่างเป็นทางการ:
การทำงาน | ผลลัพธ์ | คำอธิบาย |
---|---|---|
x หรือ y | ถ้า x เป็นเท็จ แล้ว y อื่น x | ประเมินอาร์กิวเมนต์ที่สองเท่านั้น (y) ถ้าอาร์กิวเมนต์แรกเป็นเท็จ |
x และ y | ถ้า x เป็นเท็จ แล้ว x อื่น y | ประเมินอาร์กิวเมนต์ที่สองเท่านั้น (y) ถ้าอาร์กิวเมนต์แรก (x) เป็น True |
ไม่ใช่ x | ถ้า x เป็นเท็จ แสดงว่าจริง มิฉะนั้น เป็นเท็จ | ไม่มีลำดับความสำคัญต่ำกว่าโอเปอเรเตอร์ที่ไม่ใช่บูลีน |