2013-03-14 21 views
5
>>> def foo(a): 
     print "called the function" 
     if(a==1): 
      return 1 
     else: 
      return None 
>>> a=1 

>>> if(foo(a) != None and foo(a) ==1): 
    print "asdf" 

called the function 
called the function 
asdf 

Ciao. come posso evitare di chiamare la funzione due volte senza usare una variabile extra.python se condizione e "e"

+1

è possibile salvare il risultato di 'foo (a) 'in una variabile. Quindi controlla il valore della variabile nella clausola 'if()'. – Raptor

+5

if (foo (a) == 1): – jimifiki

+1

Esattamente, perché la seconda condizione sia 'True', la prima deve essere. Si noti inoltre che le parentesi attorno alla condizione sono considerate in cattivo stato in Python. 'if (a == 1):' dovrebbe essere solo 'if a == 1:'. –

risposta

12

è possibile concatenare i confronti come questo

if None != foo(a) == 1: 

Questo funziona come

if (None != foo(a)) and (foo(a) == 1): 

tranne che valuta solo foo (a) una volta.

+0

È possibile concatenare ** confronti di uguaglianza **? Beh, guarda quello! – slezica

+0

@ uʍop ǝpısdn, sì funziona lo stesso (con un implicito 'e') come gli altri confronti nella tua risposta –

+2

Mentre questa è una buona risposta _general_, il primo controllo è ancora ridondante nel caso dato. –

7

Come evitare di chiamare la funzione due volte senza utilizzare una variabile extra.

Qui, si può semplicemente sostituire

if(foo(a) != None and foo(a) ==1): 

con

if foo(a) == 1: 

Il foo(a) != None è ridondante: se foo(a) == 1, è garantito per non essere None.

+0

Forse il codice pubblicato non è il codice reale ma solo un esempio. if (foo (a)! = None e foo (a) == 1): suona come soluzione migliore – jimifiki

+1

@jimifiki Se la funzione ha effetti collaterali, ciò potrebbe causare problemi. Inoltre, questa è la migliore risposta alla domanda fatta. Se l'OP lo ha semplificato eccessivamente, allora deve fare una nuova domanda. –

+0

Questo non sta rispondendo alla domanda. Sono d'accordo con @jimifiki. E no non è il massimo, vedi sotto – slezica

1

la seguente dichiarazione

if foo(a) == 1: 

si occuperà di entrambe le condizioni.

+0

Perché il downvote? Spiega per favore. –

1

se foo (a) == 1, quindi foo (a) non sarà None,

quindi semplificare il codice per:

if foo(a): 
    print('asdf') 
+0

Supponendo che intenda "Qualsiasi valore che valga per vero" è un po 'incerto, penso. –

+0

Non penso che ci sia una differenza tra if foo (a) e se foo (a) == 1, qui. –