Yanıtlar:
Evet, her ikisi andve oroperatörler kısa devre - belgelere bakın .
and, or:Önce bir şeyin yürütülüp yürütülmediğini belirlemek için yararlı bir işlev tanımlayalım. Bir argümanı kabul eden, bir mesaj basan ve girişi değiştirmeden döndüren basit bir işlev.
>>> def fun(i):
... print "executed"
... return i
...
Bir gözlemleyebilirsiniz Python'un kısa devre davranışı arasında and, oraşağıdaki örnekte operatörler:
>>> fun(1)
executed
1
>>> 1 or fun(1) # due to short-circuiting "executed" not printed
1
>>> 1 and fun(1) # fun(1) called and "executed" printed
executed
1
>>> 0 and fun(1) # due to short-circuiting "executed" not printed
0
Not: Aşağıdaki değerler yorumlayıcı tarafından yanlış anlamına gelir:
False None 0 "" () [] {}
any(), all():Python'lar any()ve all()işlevleri de kısa devreyi destekler. Dokümanlarda gösterildiği gibi; değerlendirmede erken çıkışa izin veren bir sonuç bulana kadar bir sekansın her bir öğesini sırayla değerlendirir. Her ikisini de anlamak için aşağıdaki örnekleri düşünün.
İşlev any(), herhangi bir öğenin Doğru olup olmadığını kontrol eder. Bir True ile karşılaşıldığında yürütmeyi durdurur ve True değerini döndürür.
>>> any(fun(i) for i in [1, 2, 3, 4]) # bool(1) = True
executed
True
>>> any(fun(i) for i in [0, 2, 3, 4])
executed # bool(0) = False
executed # bool(2) = True
True
>>> any(fun(i) for i in [0, 0, 3, 4])
executed
executed
executed
True
İşlev, all()tüm öğelerin Doğru olup olmadığını kontrol eder ve Yanlış ile karşılaşıldığında çalıştırmayı durdurur:
>>> all(fun(i) for i in [0, 0, 3, 4])
executed
False
>>> all(fun(i) for i in [1, 0, 3, 4])
executed
executed
False
Ayrıca, Python'da
Karşılaştırmalar keyfi olarak zincirlenebilir ; örneğin,
x < y <= zbunun sadece bir kez değerlendirilmesix < y and y <= zdışında eşdeğerdiry(ancak her iki durumdazda yanlış olarak değerlendirildiğinde hiç değerlendirilmezx < y).
>>> 5 > 6 > fun(3) # same as: 5 > 6 and 6 > fun(3)
False # 5 > 6 is False so fun() not called and "executed" NOT printed
>>> 5 < 6 > fun(3) # 5 < 6 is True
executed # fun(3) called and "executed" printed
True
>>> 4 <= 6 > fun(7) # 4 <= 6 is True
executed # fun(3) called and "executed" printed
False
>>> 5 < fun(6) < 3 # only prints "executed" once
executed
False
>>> 5 < fun(6) and fun(6) < 3 # prints "executed" twice, because the second part executes it again
executed
executed
False
Düzenleme:
Dikkat çekici bir nokta daha : - Mantıksal and,or Python işleçleri Boolean ( veya ) yerine bir işlenenin değerini döndürür . Örneğin:TrueFalse
Operasyon
x and ysonucu veririf x is false, then x, else y
Diğer dillerden farklı olarak, örneğin &&, ||0 veya 1 döndüren C operatörleri.
Örnekler:
>>> 3 and 5 # Second operand evaluated and returned
5
>>> 3 and ()
()
>>> () and 5 # Second operand NOT evaluated as first operand () is false
() # so first operand returned
Benzer şekilde, oroperatör bool(value)= = Truebaşka doğru en yanlış değeri (kısa devre davranışına göre) olan en soldaki değeri döndürür , örnekler:
>>> 2 or 5 # left most operand bool(2) == True
2
>>> 0 or 5 # bool(0) == False and bool(5) == True
5
>>> 0 or ()
()
Peki, bu nasıl faydalı? Pratik Python'da verilen örnek kullanım Magnus Lie Hetland:
Diyelim ki bir kullanıcı adını girmelidir, ancak hiçbir şey girmemeyi tercih edebilir, bu durumda varsayılan değeri kullanmak istersiniz '<unknown>'. Bir if ifadesi kullanabilirsiniz, ancak işleri çok kısa bir şekilde de ifade edebilirsiniz:
In [171]: name = raw_input('Enter Name: ') or '<Unkown>'
Enter Name:
In [172]: name
Out[172]: '<Unkown>'
Başka bir deyişle, raw_input öğesinin döndürme değeri true ise (boş bir dize değil), name (adsız) olarak atanır (hiçbir şey değişmez); aksi takdirde varsayılan '<unknown>'atandı name.
0(sadece değil yani falsy vardır 0, bu kadar 0.0, 0j, decimal.Decimal(0), fractions.Fraction(0), vb) gibi tüm koleksiyonları uzunluğu vardır 0(böylece listede neyi üstüne, b''[PY3], u''[Py2] ve set()/ frozenset()vardır kullanıcı tanımlı / üçüncü taraf türleri kendi tanımlayabilir ( doğrudan __bool__[Py3] / __nonzero__[Py2] ile veya dolaylı olarak tanımlayarak __len__).