TL; DR
İki mantıksal operatörün iki davranışını özetleyerek başlıyoruz and
ve or
. Bu deyimler, aşağıdaki tartışmamızın temelini oluşturacaktır.
and
Varsa ilk Falsy değerini, yoksa ifadedeki son değeri döndür.
or
Varsa ilk Gerçek değerini döndür, yoksa ifadedeki son değeri döndür.
Davranış ayrıca , özellikle bu tabloda , belgelerde özetlenmiştir :
İşlenenlerine bakılmaksızın bir boole değeri döndüren tek operatör not
operatördür.
"Doğruluk" ve "Doğruluk" Değerlendirmeleri
İfade
len(args) and max(args) - min(args)
Bir mı çok pythonic özlü (ve belki daha az okunabilir) "eğer demenin yolu args
boş değilse, sonucunu döndürmek max(args) - min(args)
aksi dönüş", 0
. Genel olarak, bir if-else
ifadenin daha özlü bir temsilidir . Örneğin,
exp1 and exp2
Aşağıdakilere (kabaca) çevrilmelidir:
r1 = exp1
if r1:
r1 = exp2
Veya eşdeğer olarak,
r1 = exp2 if exp1 else exp1
Benzer şekilde,
exp1 or exp2
Aşağıdakilere (kabaca) çevrilmelidir:
r1 = exp1
if not r1:
r1 = exp2
Veya eşdeğer olarak,
r1 = exp1 if exp1 else exp2
Nerede exp1
ve nerede exp2
rasgele python nesneleri veya bazı nesneler döndüren ifadeler. Buradaki mantıksal and
ve or
işleçlerin kullanımlarını anlamanın anahtarı , bunların üzerinde çalışmakla veya boole değerleri döndürmekle sınırlı olmadıklarını anlamaktır. Doğruluk değerine sahip herhangi bir nesne burada test edilebilir. Bu içerir int
, str
, list
, dict
, tuple
, set
, NoneType
, ve kullanıcı nesneleri tanımlandığı gibidir. Kısa devre kuralları da hala geçerlidir.
Ama doğruluk nedir?
Koşullu ifadelerde kullanıldığında nesnelerin nasıl değerlendirildiğini ifade eder. @Patrick Haugh bu yazıda gerçeği güzelce özetliyor .
Aşağıdakiler hariç, 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ş
range
gibirange(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 if
veya while
tablolar. bool
Değerlerden True
ve değerlerinden farklılaşmak için "doğru" ve "yanlış" kullanıyoruz
False
.
Nasıl and
Çalışır
OP'nin sorusunu, bu operatörlerin bu durumlarda nasıl yapıldığına dair bir tartışmanın parçası olarak inşa ediyoruz.
Tanımı olan bir işlev verildiğinde
def foo(*args):
...
Sıfır veya daha fazla bağımsız değişken listesindeki minimum ve maksimum değer arasındaki farkı nasıl döndürürüm?
Minimum ve maksimumu bulmak kolaydır (dahili fonksiyonları kullanın!). Buradaki tek engel, bağımsız değişken listesinin boş olabileceği köşe durumunu uygun şekilde ele almaktır (örneğin, arama foo()
). and
Operatör sayesinde her ikisini de tek bir hatta yapabiliyoruz :
def foo(*args):
return len(args) and max(args) - min(args)
foo(1, 2, 3, 4, 5)
foo()
Bu yana and
kullanılan ilk ise, ikinci ifade da değerlendirilmelidir True
. İlk ifade doğru olarak değerlendirilirse, dönüş değerinin her zaman ikinci ifadenin sonucu olduğunu unutmayın . İlk ifade Yanlış olarak değerlendirilirse, döndürülen sonuç ilk ifadenin sonucudur.
Yukarıdaki işlevde, eğer foo
bir veya daha fazla argüman alırsa len(args)
, büyüktür 0
(pozitif bir sayı), dolayısıyla döndürülen sonuç olur max(args) - min(args)
. Hiçbir argüman geçirilir OTOH, len(args)
olduğu 0
Falsy olduğu ve hangi 0
döndürülür.
Bu işlevi yazmanın alternatif bir yolunun şöyle olacağını unutmayın:
def foo(*args):
if not len(args):
return 0
return max(args) - min(args)
Veya daha kısaca,
def foo(*args):
return 0 if not args else max(args) - min(args)
Elbette, bu işlevlerden hiçbiri herhangi bir tür denetimi yapmaz , bu nedenle sağlanan girdiye tamamen güvenmiyorsanız, bu yapıların basitliğine güvenmeyin.
Nasıl or
Çalışır
Çalışmasını or
benzer şekilde yapmacık bir örnekle açıklarım.
Tanımı olan bir işlev verildiğinde
def foo(*args):
...
foo
Tüm sayıları geri getirmeyi nasıl tamamlarsınız 9000
?
Burada or
köşe davasını halletmek için kullanıyoruz . Biz şöyle tanımlıyoruz foo
:
def foo(*args):
return [x for x in args if x > 9000] or 'No number over 9000!'
foo(9004, 1, 2, 500)
foo(1, 2, 3, 4)
foo
tüm sayıları korumak için listede filtreleme yapar 9000
. Bu tür sayılar varsa, liste anlayışının sonucu boş olmayan bir listedir ve bu Doğruluktur, bu nedenle geri döndürülür (burada eylemde kısa devre). Böyle bir sayı yoksa, liste []
kompozisyonunun sonucu Falsy'dir. Böylece ikinci ifade artık değerlendirilir (boş olmayan bir dize) ve döndürülür.
Koşul cümlelerini kullanarak bu işlevi şu şekilde yeniden yazabiliriz:
def foo(*args):
r = [x for x in args if x > 9000]
if not r:
return 'No number over 9000!'
return r
Daha önce olduğu gibi, bu yapı hata işleme açısından daha esnektir.
and
(yanı sıraor
) boole değerleriyle çalışmak veya döndürmekle sınırlı değildir.