2017-09-20 1 views
0

Ich habe einen Abschnitt in meinem Code am Ende eines rekursiven Aufrufs, der wie folgt lautet:Kraft Python 0 zurück, wenn 0 oder Keine Rückkehr

if (condition): 
    # Some code here 
else: 
    return function_call(some_parameters) or function_call(some_parameters) 

und es kann zu

return None or 0 
bewerten

wo es 0 zurück (eine ganze Zahl, wie erwartet) oder

return 0 or None 

wo es keine zurückkehren wird (erwartete 0)

Meine Frage ist, ist es möglich, Python 0 (als INTEGER) in dem Fall unmittelbar oben zurückgegeben haben?

Hier ist etwas Code, der das Szenario

$ cat test.py 
#!/usr/bin/python3 
def test_return(): 
    return 0 or None 
def test_return2(): 
    return None or 0 
def test_return3(): 
    return '0' or None #Equivalent of `return str(0) or None` 

print(test_return()) 
print(test_return2()) 
print(test_return3()) 

$ ./test.py 
None 
0 
0 

Hinweis: 0 als eine ganze Zahl zurückgegeben werden soll.

+2

nennt Warum Sie das tun? Geben Sie nur 0 ein, dann wird immer 0 zurückgegeben. – Alperen

+1

Was sind die anderen möglichen Ergebnisse? – Fejs

+0

... 'x = Spaß(); y = f(); 'dann' return x wenn x nicht ist None sonst y '? –

Antwort

3

Das Python verhält sich ohne, 0, {}, [], '' als Falsy. Andere Werte werden als truthy betrachtet werden So sind die folgenden normales Verhalten

def test_return(): 
    return 0 or None # 0 is Falsy so None will be returned 
def test_return2(): 
    return None or 0 # None is Falsy so 0 will be returned 
def test_return3(): 
    return '0' or None # '0' is Truthy so will return '0' 
1

Sie können Dekorateure benutzen, wenn ihr einen speziellen Fall. Beispiel unten:

def test_return(f): 
    def wrapper(): 
     result = f() 
     if result == None or result == '0': 
      return 0 
     else: 
      return result 
    return wrapper 

@test_return 
def f1(): 
    return 0 or None 

@test_return 
def f2(): 
    return None or 0 

@test_return 
def f3(): 
    return '0' or None 

Ausgang:

print(f1()) 
print(f2()) 
print(f3()) 

0 
0 
0 

Klicken Sie hier für further read on decorators.

0

inline wenn sonst:

return 0 if (a == 0) + (b == 0) else None 

durch die + arithmetischen Operator sowohl a und b ausgewertet werden , nein 'shor tcircuit‘wie mit or

wo a, stehen b in für Ihre Funktion

tst = ((0, 0), (0, None), (None, 0), (None, None)) 


[0 if (a == 0) + (b == 0) else None for a, b in tst] 
Out[112]: [0, 0, 0, None]