2011-07-15 17 views
15

koşullu atama yapmak, ama o çirkin:iyi yolu bu çok kullanma eğiliminde piton

def either(val, alt): 
    if val: 
     return val 
    else: 
     return alt 

Yani yapabilirsiniz:

a = (lambda x: x if x else y)(get_something()) 

yüzden bu fonksiyonu yazdım
a = either(get_something(), y) 

Bunun için yerleşik bir işlev var mı (T-SQL'de ISNULL benzeri)?

cevap

34

or operatör istediğini yapar:

get_something() or y 

Aslında, COALESCE gibi (ve ISNULL aksine) chainable bu. Aşağıdaki ifade, True'a dönüştüren en soldaki argümanı değerlendirir.

A or B or C 
+0

teşekkürler eğer. Ha, aslında bunu deniyordum ama 'a = 0 veya Yok' denerken onu reddetti ve konsol hiçbir şey basmadı. Ama 'a' denemeden sonra '' True '' denir, artı 'Yok veya 0' işlevselliğini istiyorum (geç kalmak) :) Bu arada, hızlı cevap için teşekkürler. – crizCraig

+3

Sadece kayıt için, eğer 've' operatörünü zincirliyorsanız, eğer tüm argümanlar veya False'ye dönüştürülürse False'ye dönüştüren en soldaki argüman ise, True'e dönüşen en doğru argümana göre değerlendirilecektir. –

+1

"a = 0 veya Yok" Tabii ki konsol hiçbir şey yazdırmıyor, "0 veya Yok" sonucunu "a" olarak atayacaksınız ve bunlara atanan "None" değişkenleri otomatik olarak görüntülenmiyor Konsolda gösterildiğinde 'Hiçbiri '. Özellikle repr', str' veya 'print' kullanmalısınız. Ya da böyle bir şey. – JAB

3

Öyle gibi basit or kullanabilirsiniz:

>>> a = None 
>>> b = 1 
>>> c = (a or b) # parentheses are optional 
>>> c 
1 
5

Sen kullanabilirsiniz:

a = get_something() or y 

get_something Eğer boolean bağlamında True olduğunu, değeri a atanacak . Aksi halde - ya'a atanacaktır.

2

Kolay! Bunun üzerine

a = get_something() if get_something() else val 

böyle karmaşık koşullar yapabilirsiniz: Ben de kullanıyorum

a = get_something() if get_something()/2!=0 else val 
+4

Bu çağrı dışında "get_something" iki kere. –

+1

, get_somthing öğesini bir değişkene koyabilir. Sadece sadece OR ile çalışma koşullarını koyamazsınız. –

+1

Gerçekten mi? neden bir -1 hak ediyor? –

1

Kodunuzdaki için

a = b if b else val 

: Daha fazla koşullu kodu için

(a,b)[condition based on the value of a] formu, get_something() aramasının sonucunuolarak kaydetme en iyi burada sunulmaktadır nadir durumlarda: Ben başka bir kullanıcıya bu soruya bir yanıt vermiş http://mail.python.org/pipermail/python-list/2002-September/785515.html

... 
a=0  b=None  a or b => None  (a,b)[a is None] => 0 
a=() b=None  a or b => None  (a,b)[a is None] =>() 
... 
+0

Anladım. Eğer daha spesifik bir durum için 'a' kontrol etmek isterseniz bu olurdu. Ama iki satıra ihtiyacınız var bu yüzden daha okunabilir olan bir başka bir durum varsa, a = x ile devam ediyorum. İlginç sözdizimi olsa da. Hiç böyle bir şey görmedim :) – crizCraig

+0

@crizCraig: kısa bir örnek eklendi – alexandrul