บูลีน การเปรียบเทียบ และตัวดำเนินการตรรกะใน Python
บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล
ทุกวันคุณตัดสินใจเรื่องแบบใช่หรือไม่ใช่ "ฝนตกไหม" "เงินพอไหม" "รหัสผ่านถูกไหม" คอมพิวเตอร์ก็ตัดสินใจแบบเดียวกัน และใช้บูลีน (boolean) ในการตัดสินใจ
บูลีนคือค่าที่เป็นได้แค่ True หรือ False มีแค่สองตัวเลือกเท่านั้น ลองนึกถึงสวิตช์ไฟ: เปิดหรือปิด ใช่หรือไม่ใช่ จริงหรือเท็จ
ในบทเรียนนี้ คุณจะได้เรียนรู้ว่า Python เปรียบเทียบค่าอย่างไร รวมเงื่อนไขอย่างไร และตัดสินอย่างไรว่าอะไรนับเป็น "จริง" หรือ "เท็จ" ทักษะเหล่านี้เป็นพื้นฐานของคำสั่ง if และลูปทุกตัวที่คุณจะเขียนต่อจากนี้
บูลีนใน Python คืออะไร
Python มีชนิดข้อมูลในตัวชื่อ bool ซึ่งมีค่าที่เป็นไปได้แค่สองค่า คือ True และ False สังเกตว่าขึ้นต้นด้วยตัวพิมพ์ใหญ่ T และ F ซึ่งเป็นเรื่องสำคัญ
True False <class 'bool'>
ตัวแปรบูลีนมักขึ้นต้นด้วย is_, has_ หรือ can_ (แปลว่า "เป็น" "มี" และ "ทำได้") เพื่อให้โค้ดอ่านได้เหมือนประโยคภาษาอังกฤษธรรมดา เช่น is_logged_in หรือ has_permission บอกได้ชัดเจนว่าตัวแปรหมายถึงอะไร
วิธีเปรียบเทียบค่าใน Python
ค่าบูลีนส่วนใหญ่ไม่ได้มาจากการพิมพ์ True หรือ False ลงไปตรง ๆ แต่มาจากการเปรียบเทียบ เมื่อคุณเปรียบเทียบสองค่า Python จะให้ค่าบูลีนกลับมา
ให้คิดว่าตัวดำเนินการเปรียบเทียบเป็นเหมือนกรรมการในรายการประกวด คุณส่งของสองอย่างให้ แล้วกรรมการจะตอบว่า "True" หรือ "False"
True False True False True False True True
คุณเก็บผลการเปรียบเทียบไว้ในตัวแปรได้ ซึ่งมีประโยชน์เมื่อต้องการตรวจเงื่อนไขครั้งเดียวแล้วใช้ผลลัพธ์หลายครั้ง
True True
วิธีเปรียบเทียบสตริงใน Python
คุณเปรียบเทียบสตริงได้ด้วย Python จะตรวจทีละตัวอักษรตามลำดับตัวอักษร (ในทางเทคนิคคือลำดับ Unicode) ตัวพิมพ์ใหญ่จะมาก่อนตัวพิมพ์เล็ก
True False True True True
วิธีใช้ตัวดำเนินการตรรกะ: and, or, not
บางครั้งการเปรียบเทียบครั้งเดียวไม่พอ คุณอาจต้องตรวจว่าคนคนหนึ่งอายุถึงเกณฑ์และมีตั๋ว หรือวันนี้เป็นวันเสาร์หรือวันอาทิตย์ Python มีตัวดำเนินการตรรกะ (logical operator) 3 ตัวสำหรับรวมเงื่อนไข
ตัวดำเนินการ "and"
ตัวดำเนินการ and คืนค่า True ก็ต่อเมื่อทั้งสองฝั่งเป็นจริง ลองนึกถึงประตูที่มีแม่กุญแจสองตัว คุณต้องมีลูกกุญแจครบทั้งสองดอกจึงจะเปิดได้
True False True
ตัวดำเนินการ "or"
ตัวดำเนินการ or คืนค่า True เมื่ออย่างน้อยหนึ่งฝั่งเป็นจริง ลองนึกถึงประตูที่มีกริ่งสองตัว กดตัวไหนก็มีคนมาเปิดประตูให้
True False True
ตัวดำเนินการ "not"
ตัวดำเนินการ not กลับค่าบูลีนเป็นค่าตรงข้าม True กลายเป็น False และ False กลายเป็น True เหมือนการกดสวิตช์ไฟ
False True True
การประเมินค่าแบบลัดวงจร (short-circuit) ใน Python คืออะไร
Python ขี้เกียจอย่างฉลาด เมื่อประเมินค่า and หรือ or มันจะหยุดทันทีที่รู้คำตอบ เรียกว่าการประเมินค่าแบบลัดวงจร (short-circuit evaluation)
กับ and ถ้าค่าแรกเป็น False Python จะไม่ตรวจค่าที่สองเลย เพราะผลลัพธ์เป็น False แน่นอนแล้ว กับ or ถ้าค่าแรกเป็น True ก็จะข้ามค่าที่สอง เพราะผลลัพธ์เป็น True แน่นอนแล้ว
False True False
ค่า truthy และ falsy ใน Python คืออะไร
ข้อเท็จจริงที่อาจทำให้แปลกใจคือ ใน Python ทุกค่ามี "ความเป็นจริง" (truthiness) ไม่ได้มีแค่ True กับ False ที่นับ แต่ทุกค่าถูกตีความว่าเป็นจริงหรือเท็จได้
ลองคิดแบบนี้: กระเป๋าสตางค์ของคุณว่างเปล่า หรือมีอะไรอยู่ข้างใน สิ่งที่ว่างเปล่าถือเป็น "falsy" (ถือว่าเป็นเท็จ) ส่วนสิ่งที่มีของอยู่ถือเป็น "truthy" (ถือว่าเป็นจริง)
False False False False False False True True True True
วิธีใช้ฟังก์ชัน bool()
ฟังก์ชัน bool() แปลงค่าใดก็ได้เป็นค่าบูลีนที่สอดคล้องกัน และบอกให้รู้ว่า Python มองค่านั้นเป็น truthy หรือ falsy
True False True False False No input provided
ในทางปฏิบัติ คุณแทบไม่ต้องเรียก bool() เอง Python ตรวจความเป็นจริงของค่าในคำสั่ง if ให้อัตโนมัติ การเขียน if name: ให้ผลเหมือน if bool(name): แต่สั้นกว่า
name = "Alice"
if bool(name) == True:
print("Name is set")name = "Alice"
if name:
print("Name is set")วิธีใช้การเปรียบเทียบแบบต่อกันใน Python
Python มีความสามารถที่น่าสนใจซึ่งภาษาส่วนใหญ่ไม่มี คือคุณเขียนการเปรียบเทียบต่อกันได้ (chained comparison) เหมือนในคณิตศาสตร์ แทนที่จะเขียน x > 1 and x < 10 คุณเขียน 1 < x < 10 ได้เลย
True True True
การเปรียบเทียบแบบต่อกันอ่านได้เหมือนสัญลักษณ์ทางคณิตศาสตร์ สั้นกว่าและเข้าใจได้ในแวบเดียว ใช้เมื่อไรก็ตามที่ต้องตรวจว่าค่าหนึ่งอยู่ในช่วงที่กำหนดหรือไม่
ข้อผิดพลาดเรื่องบูลีนที่พบบ่อยใน Python
ข้อผิดพลาดที่ 1: ใช้ = แทน ==
นี่คือข้อผิดพลาดเรื่องบูลีนที่มือใหม่ทำบ่อยที่สุด เครื่องหมาย = ตัวเดียวใช้กำหนดค่า (ให้ค่ากับตัวแปร) ส่วน == สองตัวใช้เปรียบเทียบ (ตรวจว่าสองค่าเท่ากันหรือไม่)
score = 100
# A single = tries to assign 50 to score, which is not allowed in an if
# if score = 50: # SyntaxError!
# print("You got 50")score = 100
if score == 50:
print("You got 50")
else:
print("Not 50")ข้อผิดพลาดที่ 2: เปรียบเทียบข้อมูลต่างชนิดกัน
การเปรียบเทียบสตริงกับตัวเลขอาจให้ผลที่คาดไม่ถึง สตริง "5" ไม่เท่ากับตัวเลข 5 เพราะเป็นข้อมูลคนละชนิดกัน
False True True True True
แบบฝึกหัด
สร้างตัวแปร num ให้มีค่าเป็น 42 ใช้การเปรียบเทียบแบบต่อกันตรวจว่า num อยู่ระหว่าง 1 ถึง 100 (รวม 1 และ 100) หรือไม่ แล้วแสดงผลลัพธ์
ผลลัพธ์ที่คาดหวัง:
Trueสร้างตัวแปร word ให้มีค่าเป็น "Python" ตรวจว่าสตริงไม่ว่าง และยาวกว่า 3 ตัวอักษร แล้วแสดงผลลัพธ์
ผลลัพธ์ที่คาดหวัง:
Trueทายว่าแต่ละบรรทัดจะแสดงอะไรโดยไม่ต้องรันโค้ด จากนั้นรันเพื่อตรวจคำตอบ
โค้ดนี้แสดงผลลัพธ์ของการดำเนินการทางตรรกะ 3 แบบ
โค้ดด้านล่างควรตรวจว่า status เท่ากับ "active" หรือไม่ แล้วแสดงผล แต่มีบั๊กอยู่ ให้หาบั๊กแล้วแก้ไข
ผลลัพธ์ที่คาดหวัง:
Trueสร้างตัวแปร year ให้มีค่าเป็น 2024 ปีหนึ่งจะเป็นปีอธิกสุรทิน (leap year) ถ้า
ใช้ตัวดำเนินการหารเอาเศษ % และตัวดำเนินการตรรกะในการตรวจ แล้วแสดงผลลัพธ์
ผลลัพธ์ที่คาดหวัง:
Trueใช้ฟังก์ชัน bool() แสดงความเป็นจริง (truthiness) ของค่าต่อไปนี้ ค่าละบรรทัด เรียงตามลำดับนี้พอดี
1. 0
2. "hello"
3. ""
4. 42
5. None
ผลลัพธ์ที่คาดหวัง:
False
True
False
True
False