Truthy and Falsy là gì? Nó khác gì với True và False?


118

Tôi chỉ đến để biết có những TruthyFalsy giá trị trong python mà là khác biệt so với bình thường TrueFalse?

Có thể ai đó hãy giải thích sâu gì truthyfalsy giá trị là?

Tôi nên sử dụng chúng ở đâu?

Sự khác nhau giữa là gì truthyTruecác giá trị và falsyFalsegiá trị?


20
Nếu bool(value)kết quả trong True, sau đó valuetruthy .
wnnmaw

4
Bạn đã tự phát minh ra những từ đó, phải không? Dù sao, hãy xem __nonzero____bool__
zvone.

6
Giá trị Truthy / Falsy chỉ là tiện ích cho các tình huống mà bạn cần một thử nghiệm nhị phân nào đó. Nó cho phép tạo mã đơn giản hơn và mã đơn giản hơn thường dễ đọc hơn và ít có lỗi hơn.
Mark Ransom

4
@zvone Truthy và falsy được sử dụng phổ biến trong mã golf, nếu ngôn ngữ lập trình không có giá trị boolean.
MilkyWay90

6
@zvone: 'Truthy' và 'falsy' được sử dụng rộng rãi khi so sánh các ngôn ngữ lập trình, ví dụ: PHP vs PERL vs Python vs JS. (Hoàn toàn không phải chỉ chơi golf mã).
smci 29/07/19

Câu trả lời:


77

Như các nhận xét được mô tả, nó chỉ đề cập đến các giá trị được đánh giá là Đúng hoặc Sai.

Ví dụ: để xem liệu danh sách có trống không, thay vì kiểm tra như sau:

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

Bạn chỉ có thể làm điều này:

if my_list:
   print("Not empty!")

Điều này là do một số giá trị, chẳng hạn như danh sách trống, được coi là Sai khi được đánh giá cho một giá trị boolean. Danh sách không trống là Đúng.

Tương tự đối với số nguyên 0, chuỗi rỗng "", v.v., đối với False và số nguyên khác 0, chuỗi không rỗng, v.v. đối với True.

Ý tưởng của các thuật ngữ như "true" và "falsy" chỉ đơn giản là dùng để chỉ những giá trị được coi là Đúng trong các trường hợp như được mô tả ở trên và những giá trị được coi là Sai.

Ví dụ: một danh sách rỗng ( []) được coi là "giả" và một danh sách không rỗng (ví dụ, [1]) được coi là "đúng".

Xem thêm phần này của tài liệu .


hoặc nó có nghĩa là nếu my_list là true?

Tôi khuyên bạn nên thử những thứ này trong một trình bao Python và tự mình xem. ;) if my_listcó nghĩa là "nếu danh sách của tôi không trống", và if not my_listcó nghĩa là "nếu danh sách của tôi trống".
B. Eke,

1
Được rồi, tôi có chút nhầm lẫn cuối cùng, tôi đã thấy nhiều nơi như if a:loại điều kiện này có nghĩa là gì? có nghĩa là nếu a là đúng hoặc có nghĩa là nếu a là sai? hoặc nó có nghĩa là nếu a là trung thực hoặc nếu a là giả dối?

1
Nó có nghĩa là "nếu a là đúng". Như tôi đã mô tả trong câu trả lời của mình và như những người khác đã mô tả trong phần nhận xét và các câu trả lời khác, những điều khác nhau được XÉT là Đúng hay Sai, nhưng thực tế không phải như vậy. Ví dụ, một danh sách trống được coi là Sai. Đó là lý do tại sao if []:sẽ không bao giờ thực thi.
B. Eke,

có nghĩa là nếu a: nghĩa là nếu a là đúng (khi a là số nguyên hoặc chuỗi) và nếu a: có nghĩa là sai nếu a là danh sách trống hoặc các giá trị dict hoặc false!

199

Tất cả các giá trị được coi là "đúng" ngoại trừ các giá trị sau, là "sai":

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] - trống rỗng list
  • {} - trống rỗng dict
  • () - trống rỗng tuple
  • '' - trống rỗng str
  • b'' - trống rỗng bytes
  • set() - trống rỗng set
  • trống rỗng range, giống nhưrange(0)
  • đối tượng mà
    • obj.__bool__() trả lại False
    • obj.__len__() trả lại 0

Giá trị "đúng" sẽ thỏa mãn việc kiểm tra được thực hiện bởi ifhoặc các whilecâu lệnh. Chúng tôi sử dụng "true" và "falsy" để phân biệt với các boolgiá trị TrueFalse.

Kiểm tra giá trị sự thật


5
Danh sách tuyệt vời, cảm ơn. Hoàn toàn là câu hỏi học thuật, nhưng bạn có biết thứ tự thực hiện là gì không? Đang nghĩ rằng bạn có thể tạo một đối tượng trong đó bool trả về True và len trả về 0 (hoặc ngược lại).
Hayden Crocker

16
@HaydenCrocker Trước __bool__tiên, nó sẽ tìm kiếm __len__. Nếu cả hai đều không được xác định, tất cả các trường hợp được coi là "đúng". Này được thảo luận trong các tài liệu cho các object.__bool__phương pháp
Patrick Haugh

3
Trong các phiên bản Python trước 3.5, các đối tượng thời gian đại diện cho UTC lúc nửa đêm được coi là Sai. Bài viết này cung cấp tổng quan về báo cáo lỗi của sự cố và giải pháp cuối cùng.
Jason V.

1
Điều thú vị là đối với gói datetime, datetime.min là trung thực trong khi timedelta (0) là giả.
David Kinghorn

1
@DavidKinghorn Tuy nhiên, điều đó có ý nghĩa, phải không? Giá trị ngày giờ tối thiểu chỉ là một ngày giống như bất kỳ ngày nào khác, nó không giống như số không theo bất kỳ cách nào. Ngược lại, timedelta(0)giống như số không. Điều này được đưa ra khi người ta phát hiện ra rằng các giá trị thời gian đại diện cho nửa đêm là sai, cuối cùng đã được sửa: lwn.net/Articles/590299
Patrick Haugh

5

Giá trị Truthy đề cập đến các đối tượng được sử dụng trong ngữ cảnh boolean và không quá nhiều giá trị boolean trả về true hoặc false. Hãy lấy chúng làm ví dụ:

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

4

Python xác định độ tin cậy bằng cách áp dụng bool()cho kiểu trả về Truehoặc Falseđược sử dụng trong một biểu thức như ifhoặc while.

Đây là một ví dụ cho một lớp tùy chỉnh Vector2dvà thể hiện của nó sẽ trả về Falsekhi độ lớn (chiều dài của một vectơ) bằng 0, ngược lại 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

Lưu ý: Nếu chúng ta không định nghĩa, __bool__nó sẽ luôn trả về True, vì các thể hiện của lớp do người dùng xác định được coi là đúng theo mặc định.

Ví dụ từ cuốn sách: "Thông thạo Python, lập trình rõ ràng, ngắn gọn và hiệu quả"


2

Bạn nên sử dụng giá trị Truthy hoặc Falsy ở đâu? Đây là các đường cú pháp , vì vậy bạn luôn có thể tránh chúng, nhưng sử dụng chúng có thể làm cho mã của bạn dễ đọc hơn và làm cho bạn hiệu quả hơn. Hơn nữa, bạn sẽ tìm thấy chúng trong nhiều ví dụ mã, cho dù trong python hay không, vì nó được coi là thực hành tốt.

Như đã đề cập trong các câu trả lời khác, bạn có thể sử dụng chúng trong các bài kiểm tra if và vòng lặp while. Đây là hai ví dụ khác trong python 3 với các giá trị mặc định được kết hợp với or, slà một biến chuỗi. Bạn cũng sẽ gặp phải những tình huống tương tự.

Không có sự thật

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

với sự thật thì nó ngắn gọn hơn:

print(s or 'Default value')

Trong python 3.8, chúng ta có thể tận dụng biểu thức gán :=

không có sự thật

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

với sự thật thì nó cũng ngắn hơn

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

hoặc thậm chí ngắn hơn,

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

Nếu không có biểu thức gán, người ta có thể làm

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

nhưng không ngắn hơn. Một số người thấy s =...dòng không đạt yêu cầu vì nó tương ứng với

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

tuy nhiên, bạn có thể tuân thủ phong cách mã hóa này nếu bạn cảm thấy thoải mái với nó.


-1
while 0:
    print("Inside the loop.", counter)
    counter -= 1
print("Outside the loop.", counter)

Nếu bạn chạy vòng lặp này, bạn sẽ thấy rằng while 0: = while false:

0 được coi là giả dối


-2

Falsy có nghĩa là một cái gì đó trống rỗng như danh sách trống, tuple, vì bất kỳ kiểu dữ liệu nào có giá trị trống hoặc Không có. Truthy có nghĩa là: Ngoại trừ là Chân lý

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.