2012-04-08 19 views
11

con un semplice filtro che prova l'ingresso su un range 0-100.è possibile non restituire nulla da una funzione in python?

def foo(foo_input): 
    if 0 <= foo_input <= 100: 
     return f_input 

Restituisce nessuno se foo_input is > 100. Ma potrebbe davvero 'non' restituire nulla? o una funzione deve sempre restituire qualcosa?

+0

Perché ti dà fastidio la funzione restituisce 'Nessuna'? –

+0

concatenando le funzioni, e se dovessi scrivere provare: tranne clausole per ognuna di esse (a causa del none che è passato) – beoliver

+0

use969617: Cosa accadrebbe se non fosse restituito alcun output? Se è stata saltata l'esecuzione, è possibile ottenere la stessa funzionalità utilizzando un'istruzione if per verificare la presenza di '' None'' - anche se è più probabile che otterrai un risultato di None, prendere le eccezioni è un'idea migliore, come Python segue il principio per il perdono, non per il principio del permesso. –

risposta

15

Le funzioni restituiscono sempre qualcosa (almeno None, quando non è stata raggiunta alcuna istruzione di ritorno durante l'esecuzione e viene raggiunta la fine della funzione).

Un altro caso è quando vengono interrotti dalle eccezioni. In questo caso la gestione eccezione sarà "dominare la pila" e si tornerà alla appropriata except o ottenere qualche brutto errore :)

Per quanto riguarda il problema devo dire che ci sono due possibilità: O si hanno qualcosa da restituire o non hai.

  • Se avete qualcosa da restituire, fatelo, altrimenti non farlo.
  • Se si fa affidamento su qualcosa che viene restituito che ha un determinato tipo ma non è possibile restituire qualcosa di significativo di questo tipo, allora None dirà al chiamante che questo era il caso ( Non c'è modo migliore per dire al chiamante che "niente" viene restituito poi da None, in modo da controllare per esso e vi andrà bene)
12

No. Se una dichiarazione return non viene raggiunto prima della fine della funzione quindi un implicito None viene restituito.

5

Se non viene raggiunta un'istruzione di reso, la funzione restituisce None.

def set_x(): 
    x = 2 
3

Non sono sicuro di quello che stai provando a fare. Qui ci sono alcune cose che potrebbero piacerti:

def foo(foo_input, foo_default): 
    if 0 <= foo_input <= 100: 
     return f_input 
    else: 
     return foo_default 


def foo(foo_input): 
    if 0 <= foo_input <= 100: 
     return f_input 
    raise ValueError, "foo_input was not in range [0, 100]" 

Aspetta, hai detto "filtro". Stai filtrando una serie di valori e vuoi solo estrarre quelli che soddisfano un criterio? È semplice in Python:

def foo_check(x): 
    return 0 <= x <= 100 

filtered_list = [x for x in unfiltered_sequence if foo_check(x)] 

E hai detto "funzioni di concatenamento". Ancora una volta questo è facile, se stiamo parlando di filtrare una sequenza:

def foo_filter(seq): 
    for x in seq: 
     if 0 <= x <= 100: 
      yield x 

def other_filter(seq): 
    for x in seq: 
     if meets_criterion(x): 
      yield x 


def do_the_task(seq): 
    for x in other_filter(foo_filter(seq)): 
     do_something(x) 

EDIT: Ecco una bella introduzione di iteratori e generatori in Python. http://www.learningpython.com/2009/02/23/iterators-iterables-and-generators-oh-my/

+0

e questo andrebbe bene se stavo filtrando 100 o giù di lì un secondo? – beoliver

+0

Non c'è motivo di usare una funzione lì, è più chiaro solo per farlo come '' [x per x in sequenza se 0 <= x <= 100] ''. –

+0

@steveha: perché usare una comprensione di lista quando esiste una funzione 'filter' incorporata? 'filtered_list = filter (foo_filter, unfiltered_sequence)' – Nobody

Problemi correlati