Eğer Python üçlü bir koşullu operatöre sahip değilse, diğer dil yapılarını kullanarak benzetim yapmak mümkün mü?
Eğer Python üçlü bir koşullu operatöre sahip değilse, diğer dil yapılarını kullanarak benzetim yapmak mümkün mü?
Evet öyleydi katma 2.5 sürümünde.
Sözdizimi şöyledir:
a if condition else b
İlk condition
değerlendirilir, ya sonra a
veya b
dayalı olarak iade edilir Boole değeri condition
Eğer condition
değerlendirir Doğru a
geri döndü, başka b
Geri döndü.
Örneğin:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Şartların bir ifadedeğil Beyan. Bu, atamaları kullanamayacağınız anlamına gelir veya pass
veya koşullu diğer ifadeler:
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
Böyle bir durumda normal kullanmalısın if
koşullu ifade yerine.
Birkaç nedenden ötürü bazı Pythonistas tarafından kaşıldığını unutmayın:
Siparişi hatırlamakta sorun yaşıyorsanız, bunu sesli olarak okursanız, (neredeyse) ne demek istediğini söyleyin. Örneğin, x = 4 if b > 8 else 9
yüksek sesle okunur x will be 4 if b is greater than 8 otherwise 9
.
Resmi belgeler:
Bir tuple indeksleyebilirsiniz:
(falseValue, trueValue)[test]
test
geri dönmek gerekiyor Doğru veya Yanlış.
Her zaman uygulamak için daha güvenli olabilir:
(falseValue, trueValue)[test == True]
ya da yerleşik kullanabilirsiniz bool()
sağlamak için Boole değeri:
(falseValue, trueValue)[bool(<expression>)]
2.5'den önceki sürümlerde, hile vardır:
[expression] and [on_true] or [on_false]
Ne zaman yanlış sonuçlar verebilir on_true
yanlış bir boole değeri var.1
Her ne kadar benim görüşüme göre daha açık olan, sağa doğru ifade edilen ifadelerin değerlendirilmesinin faydası vardır.
deyim1 Eğer şart Başka expression2
>>> a = 1
>>> b = 2
>>> 1 if a > b else -1
-1
>>> 1 if a > b else -1 if a < b else 0
-1
itibaren Dökümantasyon:
Koşullu ifadeler (bazen “üçlü operatör” olarak adlandırılır) tüm Python işlemlerinin en düşük önceliğine sahiptir.
İfade
x if C else y
önce durumu değerlendirir, C (x değil); Eğer C doğru, x değerlendirilir ve değeri iade edilir; aksi takdirde, y değerlendirilir ve değeri döndürülür.Görmek PEP 308 koşullu ifadeler hakkında daha fazla bilgi için.
2.5 sürümünden beri yeni.
Python'da koşullu ifade için bir operatör 2006 yılında bir parçası olarak eklendi Python Geliştirme Önerisi 308. Formu ortakdan farklıdır ?:
operatör ve bu:
<expression1> if <condition> else <expression2>
buna eşdeğerdir:
if <condition>: <expression1> else: <expression2>
İşte bir örnek:
result = x if a > b else y
Kullanılabilecek başka bir sözdizimi (2.5'den önceki sürümlerle uyumlu):
result = (lambda:y, lambda:x)[a > b]()
işlenenler nerede tembel değerlendirildi.
Başka bir yol, bir tuple indekslemektir (çoğu dilin şartlı operatörü ile tutarlı olmayan):
result = (y, x)[a > b]
veya açıkça yapılandırılmış sözlük:
result = {True: x, False: y}[a > b]
Başka bir (daha az güvenilir), ancak daha basit bir yöntem kullanmaktır and
ve or
operatörler:
result = (a > b) and x or y
Ancak eğer bu işe yaramazsa x
olabilir False
.
Olası bir geçici çözüm yapmaktır. x
ve y
Listeler veya aşağıdaki gibi tuples:
result = ((a > b) and [x] or [y])[0]
veya:
result = ((a > b) and (x,) or (y,))[0]
Sözlüklerle çalışıyorsanız, üçlü bir koşul kullanmak yerine, get(key, default)
, Örneğin:
shell = os.environ.get('SHELL', "/bin/sh")
Kaynak: ?: Wikipedia'da Python'da
@up:
Ne yazık ki
(falseValue, trueValue)[test]
Çözüm kısa devre davranışına sahip değildir; Böylece hem falseValue hem de trueValue durumdan bağımsız olarak değerlendirilir. Bu, suboptimal veya hatta buggy olabilir (yani hem trueValue hem de falseValue yöntemleri olabilir ve yan etkileri olabilir).
Bunun bir çözümü olurdu
(lambda: falseValue, lambda: trueValue)[test]()
(kazanan bilinene kadar yürütme geciktirildi;)), ancak callable ve callable olmayan nesneler arasında tutarsızlık getiriyor. Ek olarak, özellikleri kullanırken durumu çözmez.
Ve öyleyse öykü devam ediyor - bahsedilen 3 çözüm arasında seçim yapmak, kısa devre özelliğine sahip olmak arasında en az python 2.5 (IMHO artık problem değil) kullanarak ve "doğru-değerlendirmeler-yanlış" seçeneğine eğilimli olmamak arasındaki bir alıştırmadır. hatalar.
Python 2.5 ve daha yeni bir özel sözdizimi vardır:
[on_true] if [cond] else [on_false]
Eski Pythons'ta üçlü bir operatör uygulanmaz fakat bunu simüle etmek mümkündür.
cond and on_true or on_false
Yine de, potansiyel bir sorun var ki eğer cond
değerlendirir True
ve on_true
değerlendirir False
sonra on_false
yerine döndü on_true
. Bu davranışı istiyorsanız yöntem tamam, aksi takdirde şunu kullanın:
{True: on_true, False: on_false}[cond is True] # is True, not == True
tarafından sarılabilir:
def q(cond, on_true, on_false)
return {True: on_true, False: on_false}[cond is True]
ve bu şekilde kullanılır:
q(cond, on_true, on_false)
Tüm Python sürümleriyle uyumludur.
Burada sadece bazı önemli farklılıkları göstermeye çalışıyorum. ternary operator
Birkaç programlama dili arasında.
Javascript'te Üçlü Operatör
var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0
Ruby'de Üçlü Operatör
a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0
Scala'da Üçlü operatör
val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0
R programlamada üçlü operatör
a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0
Python'da Üçlü operatör
a = 1 if True else 0
# 1
b = 1 if False else 0
# 0
Şimdi python dilinin güzelliğini görebilirsiniz. Son derece okunabilir ve bakımı yapılabilir.
Sık sık bulabilirsiniz
cond and on_true or on_false
ancak bu, on_true == 0 olduğunda sorun oluşturuyor
>>> x = 0
>>> print x == 0 and 0 or 1
1
>>> x = 1
>>> print x == 0 and 0 or 1
1
Normal bir üçlü operatör için beklediğiniz bu sonuç
>>> x = 0
>>> print 0 if x == 0 else 1
0
>>> x = 1
>>> print 0 if x == 0 else 1
1
Kesinlikle, ve anlamak inanılmaz derecede kolay.
general syntax : first_expression if bool_expression_is_true else second_expression
Example: x= 3 if 3 > 2 else 4
# assigns 3 to x if the boolean expression evaluates to true or 4 if it is false