Doğruluk ve Yanlışlık nedir? Doğru ve Yanlış'dan farkı nedir?


119

Sadece orada olduğunu bilmek geldi Truthy ve Falsy normale farklıdır piton değerler Trueve False?

Birisi lütfen doğru ve yanlış değerlerin ne olduğunu derinlemesine açıklayabilir mi?

Bunları nerede kullanmalıyım?

Doğruluk ve Truedeğerler ile yanlış ve Falsedeğerler arasındaki fark nedir ?


20
Eğer bool(value)sonuç çıkarsa True, o valuezaman doğrudur .
wnnmaw

4
Bu kelimeleri kendin icat ettin, değil mi? Her neyse, bakın __nonzero__ve__bool__
zvone

6
Doğruluk / Yanlış değerleri, bir tür ikili teste ihtiyaç duyduğunuz durumlar için uygundur. Daha basit kod sağlar ve daha basit kodun okunması genellikle daha az hata şansı ile daha kolaydır.
Mark Ransom

4
@zvone Doğruluk ve yanlış, programlama dillerinin boole değerlerine sahip olmaması durumunda kod golfünde yaygın olarak kullanılır.
MilkyWay90

6
@zvone: 'Doğruluk' ve 'yanlış' programlama dillerini karşılaştırırken yaygın olarak kullanılır, örneğin PHP ile PERL, Python ve JS. (Kesinlikle sadece kod golf değil).
smci

Yanıtlar:


77

Açıklandığı gibi, sadece Doğru veya Yanlış olarak değerlendirilen değerlere atıfta bulunur.

Örneğin, şu şekilde kontrol etmek yerine bir listenin boş olup olmadığını görmek için:

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

Bunu basitçe yapabilirsiniz:

if my_list:
   print("Not empty!")

Bunun nedeni, boş listeler gibi bazı değerlerin bir boole değeri için değerlendirildiğinde Yanlış olarak kabul edilmesidir. Boş olmayan listeler Doğru'dur.

Benzer şekilde, 0 tamsayısı için, boş "" dizesi için False ve sıfır olmayan tam sayılar, boş olmayan dizeler vb. True için.

"Doğru" ve "yanlış" gibi terimler fikri, yukarıda açıklananlar gibi durumlarda Doğru olarak kabul edilen ve Yanlış olarak kabul edilen değerlere atıfta bulunur.

Örneğin, boş bir liste ( []) "yanlış" olarak kabul edilir ve boş olmayan bir liste (örneğin [1]) "doğru" olarak kabul edilir.

Belgelerin bu bölümüne de bakın .


yoksa my_list true ise anlamına gelir?

Bunları bir Python kabuğunda denemenizi ve kendiniz görmenizi öneririm. ;) if my_list"listem boş değilse" ve if not my_list"listem boşsa" anlamına gelir.
B.Eckles

1
tamam son ufak bir kafa karışıklığım var, if a:bu tür koşulların ne anlama geldiği gibi birçok yer gördüm ? a'nın doğru olduğu anlamına mı, yoksa a'nın yanlış olduğu anlamına mı gelir? ya da a doğru mu yoksa a yanlış mı anlamına gelir?

1
"Eğer a doğruysa" anlamına gelir. Cevabımda açıkladığım ve diğerlerinin yorumlarda ve diğer cevaplarda açıkladığı gibi, farklı şeyler Doğru veya Yanlış DEĞERLENDİRİLİR, ancak gerçekte öyle değildir. Örneğin boş bir liste Yanlış olarak kabul edilir. Bu yüzden if []:asla idam edilmez.
B.Eckles

a: eğer a doğru ise (a tamsayı veya dize olduğunda) ve a: eğer a boş bir liste veya boş bir dikt veya yanlış değerler ise yanlış anlamına gelir!

200

Aşağıdakiler haricinde tüm değerler "doğru" kabul edilir, bunlar "yanlıştır":

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] - boş list
  • {} - boş dict
  • () - boş tuple
  • '' - boş str
  • b'' - boş bytes
  • set() - boş set
  • boş rangegibirange(0)
  • hangi nesneler için
    • obj.__bool__() İadeler False
    • obj.__len__() İadeler 0

Bir "truthy" değeri tarafından gerçekleştirilen çek tatmin edecek ifveya whiletablolar. boolDeğerlerden Trueve değerlerinden farklılaşmak için "doğru" ve "yanlış" kullanıyoruz False.

Gerçek Değer Testi


5
Harika liste, teşekkürler. Tamamen akademik bir soru, ama infaz emrinin ne olduğunu biliyor musunuz? Bool'un True döndürdüğü ve len'in 0 döndürdüğü (veya tersi) bir nesne yaratabileceğinizi düşünüyordum .
Hayden Crocker

16
@HaydenCrocker __bool__Önce arar , sonra __len__. Hiçbiri tanımlanmazsa, tüm örnekler "doğru" olarak kabul edilir. Bu, object.__bool__yöntemin belgelerinde tartışılmıştır
Patrick Haugh

3
3.5'ten önceki Python sürümlerinde, UTC gece yarısı temsil eden zaman nesneleri Yanlış olarak değerlendirildi. Bu makale , sorunun bir hata raporu ve nihai çözüme ilişkin bir genel bakış sunar.
Jason V.

1
İlginçtir, datetime paketi için, datetime.min doğrudur, timedelta (0) ise yanlıştır.
David Kinghorn

1
@DavidKinghorn Bu mantıklı, değil mi? Minimum tarih saat değeri, diğerleri gibi sadece bir tarihtir, hiçbir şekilde sıfıra benzemez. Aksine, timedelta(0)sıfır gibidir. Bu, gece yarısını temsil eden zaman değerlerinin yanlış olduğu keşfedildiğinde ortaya çıktı ve sonunda düzeltildi: lwn.net/Articles/590299
Patrick Haugh

5

Gerçek değerler, bir boole bağlamında kullanılan nesnelere atıfta bulunur ve doğru veya yanlış döndüren boole değerini çok fazla ifade etmez. Bunları örnek olarak alın:

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

4

Piton uygulayarak truthiness belirleyen bool()döner tipi, Trueya da Falsebenzeri bir ifadesinde kullanılan ifya da while.

İşte özel bir sınıf için bir örnek Vector2dve bunun Falsebüyüklüğü (bir vektörün uzunluğu) 0 olduğunda, aksi takdirde geri dönen örnek 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

Not: Belirlediğimiz olmazdı Eğer __bool__her zaman bir kullanıcı tanımlı sınıfın örneklerini varsayılan olarak truthy kabul edildiğinden, doğru değeriyle dönecektir.

Kitaptan örnek: "Python'da Akıcı, açık, özlü ve etkili programlama"


2

Doğruluk veya Yanlış değerlerini nerede kullanmalısınız? Bunlar sözdizimsel şekerlerdir , bu yüzden onlardan her zaman kaçınabilirsiniz, ancak bunları kullanmak kodunuzu daha okunaklı hale getirebilir ve sizi daha verimli hale getirebilir. Dahası, bunları python'da olsun ya da olmasın birçok kod örneğinde bulacaksınız, çünkü bu iyi bir uygulama olarak kabul edilir.

Diğer cevaplarda da belirtildiği gibi, bunları if testlerinde ve döngülerde kullanabilirsiniz. İşte python 3'te varsayılan değerlerle birleştirilmiş or, sbir dize değişkeni olan diğer iki örnek . Siz de benzer durumlara uzanacaksınız.

Gerçek olmadan

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

doğrusu daha özlüdür:

print(s or 'Default value')

Python 3.8'de atama ifadesinden faydalanabiliriz :=

dürüst olmadan

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

doğrusu o da daha kısa

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

hatta daha kısa

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

Atama ifadesi olmadan kişi yapabilir

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

ama daha kısa değil. Bazı insanlar s =...satırı tatmin edici bulmaz çünkü şuna karşılık gelir

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

yine de kendinizi rahat hissediyorsanız bu kodlama stiline bağlı kalabilirsiniz.


-3

Falsy, boş değerleri olan herhangi bir veri türü veya Yok gibi boş liste, tuple gibi boş bir şey anlamına gelir. Hakikat şu anlama gelir: Hakikat dışında

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.