ค่าความจริง (`truthy`) และค่าความเท็จ (`falsy`) ใน Python

ค่าความจริง (`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 ด้วย

YouTube Video