ค่าความจริง (`truthy`) และค่าความเท็จ (`falsy`) ใน Python
บทความนี้อธิบายเกี่ยวกับค่าความจริง (truthy) และค่าความเท็จ (falsy) ใน Python
YouTube Video
ค่าความจริง (truthy) และค่าความเท็จ (falsy) ใน Python
คำจำกัดความของค่าความจริง (truthy) และค่าความเท็จ (falsy)
ใน Python วัตถุที่ถูกประเมินในนิพจน์เงื่อนไขจะถูกพิจารณาเป็น 'True' หรือ 'False' Truthy หมายถึงวัตถุที่ถูกประเมินค่าเป็น 'True' และ falsy หมายถึงวัตถุที่ถูกประเมินค่าเป็น 'False' การประเมินเหล่านี้มักถูกใช้ในตัวแยกสาขาเงื่อนไข เช่น คำสั่ง if หรือ วนลูป while นอกจากนี้ ฟังก์ชัน bool() สามารถรับวัตถุใดก็ได้และส่งค่าความเป็นบูลีนของวัตถุนั้นกลับมา
Falsy (วัตถุที่ถูกประเมินค่าเป็น False)
ในภาษา Python วัตถุต่อไปนี้ถือว่าเป็น falsy:
-
False -
None -
ค่าศูนย์แบบตัวเลข
- ตัวอย่าง:
0,0.0
- ตัวอย่าง:
-
ลำดับข้อมูลว่าง (เช่น ลิสต์ว่าง ทูเพิลว่าง หรือสตริงว่าง)
- ตัวอย่าง:
[],(),""
- ตัวอย่าง:
-
พจนานุกรมที่ว่าง
- ตัวอย่าง:
{}
- ตัวอย่าง:
-
เซตที่ว่าง
- ตัวอย่าง:
set()
- ตัวอย่าง:
วัตถุเหล่านี้จะถูกประเมินว่าเป็น 'falsy' เมื่อใช้ในเงื่อนไขของคำสั่ง if ตัวอย่างเช่น คุณสามารถเขียนโค้ดแบบนี้
1if not []:
2 print("The list is falsy.")- ในโค้ดนี้ ลิสต์
[]เป็นค่าว่าง ดังนั้นจึงถูกประเมินว่าเป็นfalsyและคำสั่งprintถูกเรียกใช้งาน
Truthy (วัตถุที่ถูกประเมินค่าเป็น True)
วัตถุที่ไม่ถือว่าเป็น falsy จะถูกมองว่าเป็น truthy
-
ตัวเลขที่ไม่ใช่ศูนย์ (จำนวนเต็ม, จำนวนทศนิยม)
- ตัวอย่าง:
1,3.14,-100
- ตัวอย่าง:
-
ชนิดข้อมูลลำดับที่ไม่ว่าง (lists, tuples, strings เป็นต้น)
- ตัวอย่าง:
[1, 2, 3],(1, 2),"Hello"
- ตัวอย่าง:
-
พจนานุกรม (dictionaries) ที่ไม่ว่าง
- ตัวอย่าง:
{"key": "value"}
- ตัวอย่าง:
-
เซต (sets) ที่ไม่ว่าง
- ตัวอย่าง:
{1, 2, 3}
- ตัวอย่าง:
วัตถุที่ถือว่าเป็น truthy จะถูกประเมินผลเป็น 'True' เมื่อใช้งานในเงื่อนไขของคำสั่ง if ตัวอย่างเช่น คุณสามารถเขียนโค้ดแบบนี้
1if [1, 2, 3]:
2 print("The list is truthy.")- ในโค้ดด้านบน เนื่องจากลิสต์
[1, 2, 3]ไม่ว่างเปล่า จึงถูกประเมินว่าเป็นtruthyและคำสั่งprintจะถูกรัน
การประเมินค่าความเป็นบูลีนด้วยฟังก์ชัน bool()
คุณสามารถประเมินค่าความเป็นบูลีนของวัตถุได้ด้วยการใช้ฟังก์ชัน bool()
1# Examples of falsy values
2print("False is", "truthy" if bool(False) else "falsy")
3print("0 is", "truthy" if bool(0) else "falsy")
4print('"" is', "truthy" if bool("") else "falsy")
5print("None is", "truthy" if bool(None) else "falsy")
6print("[] is", "truthy" if bool([]) else "falsy")
7
8# Examples of truthy values
9print("1 is", "truthy" if bool(1) else "falsy")
10print('"hello" is', "truthy" if bool("hello") else "falsy")
11print('" " (space) is', "truthy" if bool(" ") else "falsy")
12print('"0" is', "truthy" if bool("0") else "falsy")- โค้ดนี้แสดงให้เห็นว่าค่าความจริงของค่าต่าง ๆ ถูกประเมินอย่างไร ตัวอย่างเช่น ค่าตัวเลข
0และสายอักขระว่าง จะถูกพิจารณาว่าเป็นFalseขณะที่ช่องว่างหรือสายอักขระ"0"จะถูกพิจารณาว่าเป็นTrue
การใช้ truthy และ falsy
การใช้ truthy และ falsy ช่วยให้สามารถเขียนโค้ดได้กระชับและเข้าใจง่ายมากขึ้น โดยเฉพาะอย่างยิ่ง คำสั่ง if สามารถประเมินได้โดยไม่ต้องมีการเปรียบเทียบอย่างชัดเจน ซึ่งช่วยทำให้โค้ดสั้นลง ตัวอย่างเช่น โค้ดสองส่วนต่อไปนี้มีพฤติกรรมที่คล้ายกัน แต่โค้ดแรกจะกระชับกว่า
1my_list = [1]
2
3# Explicit comparison
4if my_list != []:
5 print("The list is not empty.")
6
7# Using truthy/falsy
8if my_list:
9 print("The list is not empty.")ในตัวอย่างข้างต้น คุณจะเห็นว่า my_list ถูกประเมินว่าเป็น truthy ตราบใดที่มันไม่ใช่ลิสต์ว่าง ซึ่งช่วยลดความจำเป็นในการเปรียบเทียบอย่างชัดเจน
การออกแบบด้วย truthy และ falsy
การใช้แนวคิด truthy และ falsy อย่างมีประสิทธิภาพช่วยเพิ่มความเข้าใจในการอ่านโค้ดและปรับปรุงประสิทธิภาพได้ สิ่งเหล่านี้มีประโยชน์อย่างยิ่งสำหรับการตั้งค่าค่าเริ่มต้น การตรวจสอบความถูกต้องของตัวแปร และการตรวจสอบข้อมูลที่ป้อน ตัวอย่างเช่น หากคุณคาดหวังว่า None หรือรายการว่างจะถูกส่งเป็นอาร์กิวเมนต์ คุณสามารถเขียนโค้ดแบบนี้
1def process_data(data=None):
2 data = data or []
3 print(data)
4
5process_data() # An empty list is used by default.- ในโค้ดนี้ หาก
dataเป็นNoneลิสต์ว่าง[]จะถูกตั้งเป็นค่าเริ่มต้น ด้วยวิธีนี้ การใช้truthyและfalsyช่วยให้คุณสามารถตั้งค่าค่าเริ่มต้นได้อย่างกระชับ
ข้อควรระวังเพื่อหลีกเลี่ยงพฤติกรรมที่ไม่คาดคิด
อย่างไรก็ตาม แม้การใช้ค่า truthy และ falsy จะทำให้โค้ดกระชับและสะดวกขึ้น แต่ควรระวังว่าอาจเกิดพฤติกรรมที่ไม่คาดคิดได้ ตัวอย่างเช่น ในโค้ดนี้ ไม่เพียงแต่เมื่อ data เป็น None เท่านั้น แต่หากเป็นค่าใด ๆ ที่ถูกประเมินว่าเป็น False เช่น สตริงว่าง หรือ 0 ก็จะถูกแทนที่ด้วยลิสต์ว่าง [] ที่เป็นค่าตั้งต้นเช่นกัน ด้วยเหตุนี้ ในกรณีที่ต้องการเงื่อนไขที่เข้มงวดมากขึ้น เช่น กำหนดค่าเริ่มต้นเฉพาะเมื่อค่าคือ None ควรใช้เงื่อนไขที่ชัดเจน เช่น value is None: ขึ้นอยู่กับสถานการณ์ การออกแบบควรคำนึงถึงสมดุลระหว่างความกระชับและความถูกต้องเข้มงวด
1def process_data(data=None):
2 if data is None:
3 data = []
4 print(data)
5
6process_data() # An empty list is used by default.
7process_data(0) # 0 is printed because it's not None.- โค้ดนี้ ตัวแปร
dataจะถูกกำหนดค่าเริ่มต้นเป็นลิสต์ว่างก็ต่อเมื่อค่าเป็นNoneเท่านั้น ส่วนค่าที่เป็น falsy อื่น ๆ เช่น0จะถูกคงไว้เหมือนเดิม
การควบคุมค่าบูลีนในอ็อบเจกต์ที่สร้างขึ้นเอง
แม้แต่ในคลาสที่คุณสร้างเอง คุณก็สามารถควบคุมค่าบูลีนของอินสแตนซ์ได้โดยกำหนดเมธอด __bool__() หรือ __len__()
1class MyContainer:
2 def __init__(self, items):
3 self.items = items
4
5 def __len__(self):
6 return len(self.items)
7
8box = MyContainer([])
9print(bool(box)) # False
10
11box.items.append("item")
12print(bool(box)) # True- ในโค้ดนี้ เมธอด
__len__()จะทำให้คอนเทนเนอร์ถูกประเมินเป็นFalseเมื่อว่างเปล่า และเป็นTrueเมื่อมีองค์ประกอบ
สรุป
แนวคิดเรื่อง truthy และ falsy ใน Python มีความสำคัญอย่างมากในการเขียนนิพจน์เงื่อนไขให้กระชับและทำให้โค้ดดูเข้าใจง่ายขึ้น การทำความเข้าใจและใช้งานสิ่งเหล่านี้อย่างเหมาะสมสามารถเพิ่มความน่าอ่านและประสิทธิภาพของโค้ดได้อย่างมาก
คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย