2011-07-15 13 views
15

I mają tendencję do korzystania z tego dużo, ale jest brzydki:Najlepszy sposób na przypisanie warunkowej w Pythonie

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

Więc napisałem tę funkcję:

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

Więc można zrobić:

a = either(get_something(), y) 

Czy jest do tego wbudowana funkcja (podobna do ISNULL w T-SQL)?

Odpowiedz

34

Operator or robi to, co chcesz:

get_something() or y 

W rzeczywistości, to chainable, jak COALESCE (iw przeciwieństwie ISNULL). Poniższe wyrażenie zwraca wartość do lewego argumentu, który konwertuje na wartość True.

A or B or C 
+0

Dzięki. Ha, próbowałem tego, ale odrzuciłem, gdy próbowałem "a = 0 lub None", a konsola nic nie wydrukowała. Ale próba "a to None" po tym daje "True", a dodatkowo chcę funkcji "None or 0" w każdym razie (spóźnienie) :) Przy okazji, dziękuję za szybką odpowiedź. – crizCraig

+3

Tylko dla rekordu, jeśli chcesz łańcuch operatora "i", oceni on do najbardziej prawicowego argumentu, który konwertuje na True, jeśli wszystkie argumenty lub lewy-najwyższy argument, który konwertuje na False, jeśli którykolwiek konwertuje na False. –

+1

"a = 0 lub Brak" Cóż, oczywiście konsola niczego nie wydrukuje, przypisujesz wynik '0 lub Brak' do' a', a zmienne z przypisanymi do nich 'Brak' nie wyświetlają się automatycznie 'Brak', gdy pokazano na konsoli. Musisz użyć 'repr',' str' lub 'print'. Czy coś takiego. – JAB

3

Można użyć prostego or, tak:

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

może używać:

a = get_something() or y 

Jeśli get_something jest True w kontekście logicznym, jego wartość zostanie przypisana do a . W przeciwnym razie - y zostanie przypisany do a.

2

Easy!

Więcej kodu warunkowego:

a = b if b else val 

Dla kodzie:

a = get_something() if get_something() else val 

Z tym można zrobić złożone warunki tak:

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

Oprócz tego dwa razy wywołuje 'get_something'. –

+1

może umieścić get_somthing w zmiennej. Tylko z OR nie możesz umieścić warunków do pracy. –

+1

Naprawdę? dlaczego zasługują na -1? –

1

Jestem również przy użyciu (a,b)[condition based on the value of a] formularz, zapisując wynik połączenia get_something() do a, w rzadkich przypadkach, które są najlepiej prezentowanych tutaj: 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

Rozumiem. Byłoby to, gdybyś chciał sprawdzić "a" pod kątem bardziej szczegółowego warunku. Ale potrzebujesz dwóch linii, więc chciałbym pójść z 'a = x, jeśli warunek else y', który jest bardziej czytelny. Interesująca składnia. Nigdy nie widziałem czegoś takiego :) – crizCraig

+0

@crizCraig: dodano krótki przykład – alexandrul

3

I dostarczyły odpowiedzi na to pytanie do innego użytkownika. Sprawdź tutaj:

Answer to similar question

Aby odpowiedzieć szybko tu zrobić:

x = true_value jeśli warunek else false_value

Powiązane problemy