Truthy and Falsy คืออะไร? ต่างจาก True และ False อย่างไร?


120

ฉันเพิ่งมาถึงรู้ว่ามีTruthyและFalsyค่าในหลามที่แตกต่างจากปกติTrueและFalse?

ใครช่วยอธิบายเชิงลึกได้ไหมว่าค่าจริงและเท็จคืออะไร?

ฉันควรใช้ที่ไหน?

อะไรคือความแตกต่างระหว่างTruthyและTruevalues ​​และfalsyและFalsevalues?


20
ถ้าbool(value)ผลลัพธ์ในTrueนั้นvalueคือtruthy
wnnmaw

4
คุณประดิษฐ์คำเหล่านั้นขึ้นมาเองใช่ไหม อย่างไรก็ตามดู__nonzero__และ__bool__
zvone

6
ค่า Truthy / Falsy เป็นเพียงความสะดวกสำหรับสถานการณ์ที่คุณต้องการการทดสอบไบนารีบางประเภท ช่วยให้สามารถเขียนโค้ดได้ง่ายขึ้นและโค้ดที่เรียบง่ายมักจะอ่านได้ง่ายขึ้นโดยมีโอกาสเกิดข้อบกพร่องน้อยลง
Mark Ransom

4
@zvone Truthy และ falsy มักใช้ในโค้ดกอล์ฟหากภาษาโปรแกรมไม่มีค่าบูลีน
MilkyWay90

6
@zvone: 'Truthy' และ 'falsy' ใช้กันอย่างแพร่หลายเมื่อเปรียบเทียบภาษาโปรแกรมเช่น PHP vs PERL vs Python vs JS (ไม่ใช่แค่โค้ดกอล์ฟ)
smci

คำตอบ:


78

ตามความคิดเห็นที่อธิบายไว้มันหมายถึงค่าที่ประเมินเป็นจริงหรือเท็จ

ตัวอย่างเช่นหากต้องการดูว่ารายการไม่ว่างเปล่าแทนที่จะตรวจสอบดังนี้:

if len(my_list) != 0:
   print("Not empty!")

คุณสามารถทำได้ง่ายๆ:

if my_list:
   print("Not empty!")

เนื่องจากค่าบางค่าเช่นรายการว่างถือว่าเป็นเท็จเมื่อประเมินเป็นค่าบูลีน รายการที่ไม่ว่างเป็น True

เช่นเดียวกันสำหรับจำนวนเต็ม 0 สตริงว่าง "" และอื่น ๆ สำหรับจำนวนเต็ม False และไม่ใช่ศูนย์สตริงที่ไม่ว่างและอื่น ๆ สำหรับ True

แนวคิดของคำศัพท์เช่น "จริง" และ "เท็จ" เพียงแค่อ้างถึงค่าเหล่านั้นซึ่งถือว่าเป็นจริงในกรณีเช่นเดียวกับที่อธิบายไว้ข้างต้นและคำที่ถือว่าเป็นเท็จ

ตัวอย่างเช่นรายการว่าง ( []) ถือเป็น "เท็จ" และรายการที่ไม่ว่างเปล่า (เช่น[1]) ถือว่าเป็น "จริง"

ดูเพิ่มเติมในส่วนของเอกสารนี้


หรือหมายความว่า my_list เป็นจริง?

ฉันขอแนะนำให้ลองใช้สิ่งเหล่านี้ใน Python shell และดูด้วยตัวคุณเอง ;) if my_listหมายถึง "ถ้า my_list ไม่ว่างเปล่า" และif not my_listหมายถึง "ถ้า my_list ว่างเปล่า"
B. Eckles

1
ตกลงฉันมีความสับสนเล็กน้อยฉันเคยเห็นสถานที่หลายแห่งเช่นif a:เงื่อนไขประเภทนี้หมายถึงอะไร? หมายความว่า a เป็นจริงหรือหมายความว่า a เป็นเท็จ? หรือหมายความว่า a เป็นจริงหรือเป็นเท็จ?

1
หมายความว่า "ถ้า a เป็นจริง" ดังที่ฉันอธิบายไว้ในคำตอบของฉันและตามที่คนอื่น ๆ ได้อธิบายไว้ในความคิดเห็นและคำตอบอื่น ๆ สิ่งที่แตกต่างกันนั้นถือว่าเป็นจริงหรือเท็จ แต่ไม่เป็นเช่นนั้นจริง ตัวอย่างเช่นรายการว่างถือว่าเป็นเท็จ นั่นเป็นเหตุผลที่if []:จะไม่ดำเนินการ
B. Eckles

หมายความว่าถ้า a: หมายถึงถ้า a เป็นจริง (เมื่อ a เป็นจำนวนเต็มหรือสตริง) และถ้า a: หมายถึงเท็จถ้ารายการว่างหรือค่า dict ว่างหรือเท็จ!

200

ค่าทั้งหมดถือเป็น "จริง" ยกเว้นค่าต่อไปนี้ซึ่งเป็น "เท็จ":

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] - ว่างเปล่า list
  • {} - ว่างเปล่า dict
  • () - ว่างเปล่า tuple
  • '' - ว่างเปล่า str
  • b'' - ว่างเปล่า bytes
  • set() - ว่างเปล่า set
  • ว่างเปล่าrangeเช่นrange(0)
  • วัตถุที่
    • obj.__bool__() ผลตอบแทน False
    • obj.__len__() ผลตอบแทน 0

ค่า "จริง" จะตอบสนองการตรวจสอบที่ดำเนินการโดยifหรือwhileคำสั่ง เราใช้ "truthy" และ "falsy" เพื่อให้แตกต่างจากboolค่าและTrueFalse

การทดสอบค่าความจริง


5
รายการที่ดีขอบคุณ คำถามทางวิชาการทั้งหมด แต่คุณรู้หรือไม่ว่าคำสั่งดำเนินการคืออะไร? คิดว่าคุณสามารถสร้างออบเจ็กต์ที่บูลส่งคืนค่า True และlenส่งกลับ 0 (หรือในทางกลับกัน)
Hayden Crocker

16
@HaydenCrocker จะมองหาก่อนแล้ว__bool__ __len__หากไม่มีการกำหนดอินสแตนซ์ทั้งหมดจะถือว่าเป็น "จริง" สิ่งนี้จะกล่าวถึงในเอกสารสำหรับobject.__bool__วิธีการ
Patrick Haugh

3
ใน Python เวอร์ชันก่อนหน้า 3.5 วัตถุเวลาที่แสดงถึงเวลาเที่ยงคืน UTC ถือว่าเป็นเท็จ บทความนี้แสดงภาพรวมของรายงานข้อบกพร่องของปัญหาและการแก้ไขในที่สุด
เจสันโวลต์

1
ที่น่าสนใจสำหรับแพ็คเกจวันที่และเวลา datetime.min เป็นจริงในขณะที่ timedelta (0) เป็นเท็จ
David Kinghorn

1
@DavidKinghorn นั่นเข้าท่าใช่มั้ย? ค่าวันที่และเวลาขั้นต่ำเป็นเพียงวันที่เหมือนค่าอื่น ๆ ซึ่งไม่เหมือนกับศูนย์ แต่อย่างใด ในทางตรงกันข้ามtimedelta(0)ก็เหมือนศูนย์ สิ่งนี้เกิดขึ้นเมื่อพบว่าค่าเวลาที่เป็นตัวแทนของเที่ยงคืนเป็นเท็จซึ่งในที่สุดก็ได้รับการแก้ไข: lwn.net/Articles/590299
Patrick Haugh

5

ค่าความจริงหมายถึงอ็อบเจ็กต์ที่ใช้ในบริบทบูลีนและค่าบูลีนที่คืนค่าจริงหรือเท็จไม่มากนักใช้สิ่งเหล่านี้เป็นตัวอย่าง:

>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True

4

งูหลามกำหนด truthiness โดยใช้bool()ชนิดซึ่งผลตอบแทนTrueหรือFalseซึ่งจะใช้ในการแสดงออกเหมือนหรือifwhile

นี่เป็นตัวอย่างสำหรับการเรียนที่กำหนดเองVector2dและอินสแตนซ์ของมันกลับมาFalseเมื่อขนาด (ความยาวของเวกเตอร์) เป็น 0 Trueมิฉะนั้น

import math
class Vector2d(object):
    def __init__(self, x, y):
        self.x = float(x)
        self.y = float(y)

    def __abs__(self):
        return math.hypot(self.x, self.y)

    def __bool__(self):
        return bool(abs(self))

a = Vector2d(0,0)
print(bool(a))        #False
b = Vector2d(10,0)    
print(bool(b))        #True

หมายเหตุ:หากเราไม่ได้กำหนดไว้__bool__มันจะส่งกลับ True เสมอเนื่องจากอินสแตนซ์ของคลาสที่ผู้ใช้กำหนดเองถือเป็นความจริงตามค่าเริ่มต้น

ตัวอย่างจากหนังสือ: "Fluent in Python, ชัดเจน, กระชับและมีประสิทธิภาพการเขียนโปรแกรม"


2

คุณควรใช้ค่า Truthy หรือ Falsy ที่ใด สิ่งเหล่านี้คือน้ำตาลในรูปแบบที่คุณสามารถหลีกเลี่ยงได้เสมอ แต่การใช้มันสามารถทำให้โค้ดของคุณอ่านง่ายขึ้นและทำให้คุณมีประสิทธิภาพมากขึ้น ยิ่งไปกว่านั้นคุณจะพบพวกเขาในตัวอย่างโค้ดมากมายไม่ว่าจะใน python หรือไม่ก็ตามเพราะถือว่าเป็นแนวทางปฏิบัติที่ดี

ดังที่ได้กล่าวไว้ในคำตอบอื่น ๆ คุณสามารถใช้คำตอบเหล่านี้ได้ใน if testing and while loops นี่คือตัวอย่างที่สองอื่น ๆ ในหลาม 3 มีค่าเริ่มต้นรวมกับor, sเป็นตัวแปรสตริง คุณจะขยายไปสู่สถานการณ์ที่คล้ายคลึงกันด้วย

ไม่มีความจริง

if len(s) > 0:
    print(s)
else:
    print('Default value')

ด้วยความจริงมันกระชับมากขึ้น:

print(s or 'Default value')

ใน python 3.8 เราสามารถใช้ประโยชน์จากนิพจน์การกำหนด :=

ไม่มีความจริง

if len(s) == 0:
    s = 'Default value'
do_something(s)

ด้วยความจริงมันก็สั้นกว่าเช่นกัน

s or (s := 'Default value')
do_something(s)

หรือสั้นกว่านั้น

do_something(s or (s := 'Default value'))

หากไม่มีนิพจน์มอบหมายก็สามารถทำได้

s = s or 'Default value'
do_something(s)

แต่ไม่สั้นลง บางคนพบว่าs =...เส้นไม่น่าพอใจเพราะสอดคล้องกับ

if len(s)>0:
    s = s # HERE is an extra useless assignment
else:
    s = "Default value"

อย่างไรก็ตามคุณสามารถปฏิบัติตามรูปแบบการเข้ารหัสนี้ได้หากคุณรู้สึกสบายใจกับมัน


-3

Falsy หมายถึงสิ่งที่ว่างเปล่าเช่นรายการว่างทูเพิลเนื่องจากประเภทข้อมูลใด ๆ ที่มีค่าว่างหรือไม่มี Truthy หมายถึง: ยกเว้น Truthy

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.