Python kısa devreyi destekliyor mu?


Yanıtlar:



192

Operatörü davranışı Kısa devre 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    ""    ()    []     {}

Fonksiyonda kısa devre davranışı: 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

Zincirleme Karşılaştırmada Kısa Devre Davranışı:

Ayrıca, Python'da

Karşılaştırmalar keyfi olarak zincirlenebilir ; örneğin, x < y <= zbunun sadece bir kez değerlendirilmesi x < y and y <= zdışında eşdeğerdir y(ancak her iki durumda zda yanlış olarak değerlendirildiğinde hiç değerlendirilmez x < 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.


1
Küçük kelime oyunu: Yanlış değerlerin açık listesi biraz yanıltıcıdır. Herhangi bir tür bir veya daha fazla sahte değere sahip olabilir. Geleneksel olarak, değerle tüm sayısal türleri 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__).
ShadowRanger

@ShadowRanger burada yorumunuz cevabımı tamamlayacak. bu notu eklediğiniz için teşekkürler.
Grijesh Chauhan

Ayrıca, python, daha sonra boolean
Erik Aronesty

48

Evet. Python yorumcunuzda aşağıdakileri deneyin:

ve

>>>False and 3/0
False
>>>True and 3/0
ZeroDivisionError: integer division or modulo by zero

veya

>>>True or 3/0
True
>>>False or 3/0
ZeroDivisionError: integer division or modulo by zero
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.