Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

เทคนิคการลัดวงจรใน Python?


ข้อผิดพลาดทั่วไปสำหรับผู้ที่เพิ่งเริ่มเขียนโปรแกรมคือความเข้าใจผิดเกี่ยวกับวิธีการทำงานของตัวดำเนินการบูลีน ซึ่งเกิดขึ้นจากวิธีที่ล่ามหลามอ่านนิพจน์เหล่านี้ ตัวอย่างเช่น หลังจากเริ่มเรียนรู้เกี่ยวกับคำสั่ง "และ " และ "หรือ" เราอาจสันนิษฐานว่านิพจน์ 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 เป็นเท็จ แสดงว่าจริง มิฉะนั้น เป็นเท็จ
ไม่มีลำดับความสำคัญต่ำกว่าโอเปอเรเตอร์ที่ไม่ใช่บูลีน