Apa itu Truthy and Falsy? Apa bedanya dengan True dan False?

119

Aku hanya datang untuk tahu ada truthy dan falsy nilai dalam python yang berbeda dari normal Truedan False?

Dapatkah seseorang tolong jelaskan secara mendalam apa yang truthy dan falsy nilai-nilai?

Di mana saya harus menggunakannya?

Apa perbedaan antara kebenaran dan Truenilai dan kepalsuan dan Falsenilai?

martineau.dll
sumber
20
Jika bool(value)hasil dalam True, maka valueadalah truthy .
wnnmaw
4
Anda menemukan kata-kata itu sendiri, bukan? Pokoknya, lihat __nonzero__dan__bool__
zvone
6
Nilai Truthy / Falsy hanyalah kemudahan untuk situasi di mana Anda memerlukan semacam pengujian biner. Ini memungkinkan kode yang lebih sederhana, dan kode yang lebih sederhana seringkali lebih mudah dibaca dengan sedikit peluang untuk bug.
Mark Ransom
4
@zvone Truthy and falsy biasanya digunakan dalam golf kode, jika bahasa pemrograman tidak memiliki nilai boolean.
MilkyWay90
6
@zvone: 'Truthy' dan 'falsy' banyak digunakan saat membandingkan bahasa pemrograman, misalnya PHP vs PERL vs Python vs JS. (Sama sekali bukan hanya kode golf).
smci

Jawaban:

77

Seperti yang dijelaskan dalam komentar, ini hanya merujuk ke nilai yang dievaluasi ke True atau False.

Misalnya, untuk melihat apakah daftar tidak kosong, daripada memeriksa seperti ini:

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

Anda cukup melakukan ini:

if my_list:
   print("Not empty!")

Ini karena beberapa nilai, seperti daftar kosong, dianggap False saat dievaluasi untuk nilai boolean. Daftar yang tidak kosong adalah True.

Demikian pula untuk integer 0, string kosong "", dan seterusnya, untuk False, dan integer bukan nol, string tidak kosong, dan seterusnya, untuk True.

Ide istilah seperti "truthy" dan "falsy" merujuk pada nilai-nilai yang dianggap Benar dalam kasus-kasus seperti yang dijelaskan di atas, dan yang dianggap Salah.

Misalnya, daftar kosong ( []) dianggap "salah", dan daftar yang tidak kosong (misalnya, [1]) dianggap "benar".

Lihat juga bagian dokumentasi ini .

B. Eckles
sumber
atau artinya jika my_list benar?
Saya sarankan untuk mencoba hal-hal ini dengan Python shell dan melihatnya sendiri. ;) if my_listberarti "jika daftar_saya tidak kosong", dan if not my_listberarti "jika daftar_saya kosong".
B. Eckles
1
ok saya memiliki sedikit kebingungan terakhir, saya telah melihat banyak tempat seperti if a:apa artinya kondisi seperti ini? apakah itu berarti jika a benar atau berarti jika a salah? atau itu berarti jika a benar atau jika salah?
1
Artinya "jika benar". Seperti yang saya jelaskan dalam jawaban saya, dan seperti yang dijelaskan orang lain dalam komentar dan jawaban lain, hal-hal berbeda DIPERTIMBANGKAN Benar atau Salah, tetapi sebenarnya tidak demikian. Daftar kosong, misalnya, dianggap False. Itu sebabnya if []:tidak akan pernah mengeksekusi.
B. Eckles
berarti jika a: berarti jika a benar (ketika a adalah integer atau string) dan jika a: berarti salah jika daftar kosong atau dikosongkan atau nilai salah!
200

Semua nilai dianggap "benar" kecuali yang berikut ini, yang "salah":

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] - kosong list
  • {} - kosong dict
  • () - kosong tuple
  • '' - kosong str
  • b'' - kosong bytes
  • set() - kosong set
  • kosong range, sepertirange(0)
  • objek yang
    • obj.__bool__() kembali False
    • obj.__len__() kembali 0

Nilai "kebenaran" akan memenuhi pemeriksaan yang dilakukan oleh pernyataan ifatau while. Kami menggunakan "kebenaran" dan "salah" untuk membedakan dari boolnilai Truedan False.

Pengujian Nilai Kebenaran

Patrick Haugh
sumber
5
Daftar yang bagus, terima kasih. Pertanyaan yang sepenuhnya akademis, tetapi apakah Anda tahu apa perintah eksekusi? Berpikir bahwa Anda bisa membuat objek di mana bool mengembalikan True dan len mengembalikan 0 (atau sebaliknya).
Hayden Crocker
16
@HaydenCrocker Ini mencari yang __bool__pertama, lalu __len__. Jika tidak ada yang ditentukan, semua contoh dianggap "benar". Ini dibahas dalam dokumen untuk object.__bool__metode tersebut
Patrick Haugh
3
Dalam versi Python sebelum 3.5, objek waktu yang merepresentasikan tengah malam UTC dianggap False. Artikel ini memberikan gambaran umum tentang laporan bug dari masalah tersebut dan penyelesaian akhirnya.
Jason V.
1
Menariknya untuk paket datetime, datetime.min adalah benar sedangkan timedelta (0) salah.
David Kinghorn
1
@DavidKinghorn Itu masuk akal, kan? Nilai minimum datetime hanyalah tanggal seperti tanggal lainnya, sama sekali tidak seperti nol. Sebaliknya, timedelta(0)itu seperti nol. Hal ini muncul ketika ditemukan bahwa nilai waktu yang mewakili tengah malam salah, yang akhirnya diperbaiki: lwn.net/Articles/590299
Patrick Haugh
5

Nilai kebenaran merujuk ke objek yang digunakan dalam konteks boolean dan bukan nilai boolean yang mengembalikan true atau false. Ambil ini sebagai contoh:

>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True
adi1ya
sumber
4

Python menentukan kebenaran dengan menerapkan bool()tipe, yang mengembalikan Trueatau Falseyang digunakan dalam ekspresi seperti ifatau while.

Berikut adalah contoh untuk custom class Vector2ddan instance itu kembali Falseketika magnitude (panjang vektor) adalah 0, jika tidak 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

Catatan: Jika kita tidak mendefinisikannya, __bool__itu akan selalu mengembalikan True, karena instance dari kelas yang ditentukan pengguna dianggap benar secara default.

Contoh dari buku: "Fasih dengan Python, pemrograman yang jelas, ringkas dan efektif"

pengguna1767754
sumber
2

Di mana Anda sebaiknya menggunakan nilai Truthy atau Falsy? Ini adalah gula sintaksis , jadi Anda selalu dapat menghindarinya, tetapi menggunakannya dapat membuat kode Anda lebih mudah dibaca dan membuat Anda lebih efisien. Selain itu, Anda akan menemukannya di banyak contoh kode, baik di python atau tidak, karena dianggap praktik yang baik.

Seperti yang disebutkan dalam jawaban lain, Anda dapat menggunakannya di if tes dan while loop. Berikut adalah dua contoh lain di python 3 dengan nilai default yang digabungkan dengan or, smenjadi variabel string. Anda juga akan mengembangkan situasi serupa.

Tanpa kejujuran

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

sejujurnya ini lebih ringkas:

print(s or 'Default value')

Di python 3.8, kita bisa memanfaatkan ekspresi tugas :=

tanpa kejujuran

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

sejujurnya itu juga lebih pendek

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

atau bahkan lebih pendek,

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

Tanpa ekspresi tugas, seseorang bisa melakukannya

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

tapi tidak lebih pendek. Beberapa orang menganggap s =...garis tersebut tidak memuaskan karena sesuai dengan

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

namun Anda dapat mengikuti gaya pengkodean ini jika Anda merasa nyaman dengannya.

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

Jika Anda menjalankan perulangan ini, Anda akan melihat bahwa while 0: = while false:

0 dianggap salah

MLee
sumber
-2

Falsy berarti sesuatu yang kosong seperti daftar kosong, tuple, karena tipe data apa pun yang memiliki nilai kosong atau Tidak Ada. Truthy artinya: Kecuali adalah Truthy

Venkatesh
sumber