2015-10-15 13 views
6

mi sento molto confuso su qualche codice come questo [non scritto da me]:come utilizzare pitone di qualsiasi

version = any(func1(), func2()) # wrong, should be any([func1(), func2()]) 

def func1(): 
    if something: 
     return 1 
    else: 
     return None 

def func2(): 
    if something: 
     return 2 
    else: 
     return 3 

version deve essere un num. quando [func1(), func2()] è [1, None], dovrebbe restituire 1, quando è [None, 2], dovrebbe restituire 2, quando [1, 2], dovrebbe restituire 1.

quindi penso che sia sbagliato usare any() in questo codice, perché any() basta tornare True o False. Se rewirte questa logica usando un altro modo, non riesco a trovare un modo aggraziato come un pitone.

Voglio sapere se any() può raggiungere la logica, se non, come ottenerlo con garbo?

+1

Stai chiedendo su quale scenario usare 'any()', o come semplificare questo pezzo di codice? – Nayuki

+0

@NayukiMinase Voglio sapere se 'any()' può raggiungere la logica, se no, come ottenerlo con garbo? –

risposta

12

Qui puoi semplicemente utilizzare or.

version = func1() or func2() 

Assicurarsi che le funzioni siano definite prima di provare a chiamarle.

Questo funziona perché or restituisce il primo valore di tipo Vero o l'ultimo valore (se nessun valore è di tipo Vero). E 'Nessuno' è considerato falso come nel contesto booleano.

+2

Questo è un buon modo, grazie. –

5

@ La risposta di AnandSKumar è ottimale. Ma solo per darvi qualche informazione su qualsiasi, se siete interessati:

Prendete questo esempio:

>>> def foo(): 
... return 2 
... 
>>> def boo(): 
... return 3 
... 
>>> def doo(): 
... return 4 
... 
>>> f = [foo, boo, doo] 

>>> any(i() < 3 for i in f) 
True 

In definitiva ciò che sta accadendo all'interno del qualunque sia, iterare la gamma di metodi j, e indica se ogni elemento è inferiore a 3, ciò che "any" farà in questo caso è la condizione "ANY" che restituisce quella corrispondenza. Quindi, anche se ne trovi uno che è False, verrà comunque restituito True.

C'è un altro metodo simile a questo chiamato "tutto", che assicurerà che TUTTE le condizioni siano soddisfatte in base alla condizione che si sta controllando. Ecco l'esempio:

>>> all(i() < 3 for i in f) 
False 

Quindi, come puoi vedere, perché una condizione non è riuscita, restituirà False.

4

Per il caso di lunghezza arbitraria (dove concatenamento esplicitamente or non ha senso), si può fare una versione di any che restituisce il primo valore truthy o un determinato valore quando tutti i risultati sono falsy con:

# If on Py2, you'll want to do this to get shortcircuiting behavior 
from future_builtins import filter 

result = next(filter(None, iterable_to_check), False) # False can be replaced with a chosen default 

Il filter produce solo valori "veri" e i due argomenti next ottiene il primo valore "verità" o il valore predefinito se filter non trova valori "attendibili".

Se il iterable_to_check è un non-vuoto Sequence (piuttosto che semplicemente Iterable), è possibile corrispondere esattamente il comportamento di incatenato or s (il risultato "falsy" è l'ultimo valore, non un valore specifico come False o None) con:

result = next(filter(None, sequence_to_check), sequence_to_check[-1]) 

per utilizzare l'elemento finale ("truthy" o "falsy") come il risultato quando tutti gli elementi erano "falsy".

Per essere chiari, se il set di cose da testare è fisso e piccolo, il or esplicito per risposta di Anand è il modo migliore per andare.