ฉันเพิ่งมาถึงรู้ว่ามีTruthyและFalsyค่าในหลามที่แตกต่างจากปกติTrue
และFalse
?
ใครช่วยอธิบายเชิงลึกได้ไหมว่าค่าจริงและเท็จคืออะไร?
ฉันควรใช้ที่ไหน?
อะไรคือความแตกต่างระหว่างTruthyและTrue
values และfalsyและFalse
values?
__nonzero__
และ__bool__
ฉันเพิ่งมาถึงรู้ว่ามีTruthyและFalsyค่าในหลามที่แตกต่างจากปกติTrue
และFalse
?
ใครช่วยอธิบายเชิงลึกได้ไหมว่าค่าจริงและเท็จคืออะไร?
ฉันควรใช้ที่ไหน?
อะไรคือความแตกต่างระหว่างTruthyและTrue
values และfalsyและFalse
values?
__nonzero__
และ__bool__
คำตอบ:
ตามความคิดเห็นที่อธิบายไว้มันหมายถึงค่าที่ประเมินเป็นจริงหรือเท็จ
ตัวอย่างเช่นหากต้องการดูว่ารายการไม่ว่างเปล่าแทนที่จะตรวจสอบดังนี้:
if len(my_list) != 0:
print("Not empty!")
คุณสามารถทำได้ง่ายๆ:
if my_list:
print("Not empty!")
เนื่องจากค่าบางค่าเช่นรายการว่างถือว่าเป็นเท็จเมื่อประเมินเป็นค่าบูลีน รายการที่ไม่ว่างเป็น True
เช่นเดียวกันสำหรับจำนวนเต็ม 0 สตริงว่าง "" และอื่น ๆ สำหรับจำนวนเต็ม False และไม่ใช่ศูนย์สตริงที่ไม่ว่างและอื่น ๆ สำหรับ True
แนวคิดของคำศัพท์เช่น "จริง" และ "เท็จ" เพียงแค่อ้างถึงค่าเหล่านั้นซึ่งถือว่าเป็นจริงในกรณีเช่นเดียวกับที่อธิบายไว้ข้างต้นและคำที่ถือว่าเป็นเท็จ
ตัวอย่างเช่นรายการว่าง ( []
) ถือเป็น "เท็จ" และรายการที่ไม่ว่างเปล่า (เช่น[1]
) ถือว่าเป็น "จริง"
if my_list
หมายถึง "ถ้า my_list ไม่ว่างเปล่า" และif not my_list
หมายถึง "ถ้า my_list ว่างเปล่า"
if a:
เงื่อนไขประเภทนี้หมายถึงอะไร? หมายความว่า a เป็นจริงหรือหมายความว่า a เป็นเท็จ? หรือหมายความว่า a เป็นจริงหรือเป็นเท็จ?
if []:
จะไม่ดำเนินการ
ค่าทั้งหมดถือเป็น "จริง" ยกเว้นค่าต่อไปนี้ซึ่งเป็น "เท็จ":
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
ค่าและTrue
False
__bool__
__len__
หากไม่มีการกำหนดอินสแตนซ์ทั้งหมดจะถือว่าเป็น "จริง" สิ่งนี้จะกล่าวถึงในเอกสารสำหรับobject.__bool__
วิธีการ
timedelta(0)
ก็เหมือนศูนย์ สิ่งนี้เกิดขึ้นเมื่อพบว่าค่าเวลาที่เป็นตัวแทนของเที่ยงคืนเป็นเท็จซึ่งในที่สุดก็ได้รับการแก้ไข: lwn.net/Articles/590299
ค่าความจริงหมายถึงอ็อบเจ็กต์ที่ใช้ในบริบทบูลีนและค่าบูลีนที่คืนค่าจริงหรือเท็จไม่มากนักใช้สิ่งเหล่านี้เป็นตัวอย่าง:
>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True
งูหลามกำหนด truthiness โดยใช้bool()
ชนิดซึ่งผลตอบแทนTrue
หรือFalse
ซึ่งจะใช้ในการแสดงออกเหมือนหรือif
while
นี่เป็นตัวอย่างสำหรับการเรียนที่กำหนดเอง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, ชัดเจน, กระชับและมีประสิทธิภาพการเขียนโปรแกรม"
คุณควรใช้ค่า 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"
อย่างไรก็ตามคุณสามารถปฏิบัติตามรูปแบบการเข้ารหัสนี้ได้หากคุณรู้สึกสบายใจกับมัน
Falsy หมายถึงสิ่งที่ว่างเปล่าเช่นรายการว่างทูเพิลเนื่องจากประเภทข้อมูลใด ๆ ที่มีค่าว่างหรือไม่มี Truthy หมายถึง: ยกเว้น Truthy
bool(value)
ผลลัพธ์ในTrue
นั้นvalue
คือtruthy