TL; DR
İki mantıksal operatörün iki davranışını özetleyerek başlıyoruz andve 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 notoperatö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 argsboş değilse, sonucunu döndürmek max(args) - min(args)aksi dönüş", 0. Genel olarak, bir if-elseifadenin 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 exp1ve nerede exp2rasgele python nesneleri veya bazı nesneler döndüren ifadeler. Buradaki mantıksal andve oriş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ş
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 while
tablolar. boolDeğerlerden Trueve 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()). andOperatö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 andkullanı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 foobir 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 0Falsy olduğu ve hangi 0dö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ı orbenzer şekilde yapmacık bir örnekle açıklarım.
Tanımı olan bir işlev verildiğinde
def foo(*args):
...
fooTüm sayıları geri getirmeyi nasıl tamamlarsınız 9000?
Burada orköş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)
footü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.