2012-04-08 28 views
11

con un filtro simple que prueba la entrada en un rango de 0-100.¿es posible no devolver nada desde una función en python?

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

Esto no devuelve ninguno si foo_input is > 100. Pero, ¿podría realmente 'no' devolver nada? o una función siempre tiene que devolver algo?

+0

¿Por qué te molesta la función devuelve 'None'? –

+0

encadenamiento de funciones, y si iba a tener que escribir Proveedores: excepto cláusulas para cada uno de ellos (debido a la nada que se pasa) – beoliver

+0

use969617: ¿Qué pasaría si se devuelve ningún resultado? Si se saltó la ejecución, puede obtener la misma funcionalidad usando una declaración if para verificar '' None'', aunque si es más probable que obtenga un resultado que None, capturar excepciones es una mejor idea, ya que Python sigue el principio de 'pedir perdón, no permiso'. –

Respuesta

15

funciones siempre devuelven algo (al menos None, cuando se llegó a ningún return durante la ejecución y se llega al final de la función).

Otro caso es cuando se interrumpen por excepciones. En este caso la manipulación excepción será "dominar sobre la pila" y volverá a la adecuada except o conseguir algún error desagradable :)

respecto a su problema hay que decir que hay dos posibilidades: O tienes algo para volver o no tienes

  • Si tiene algo que devolver, hágalo, de lo contrario, no lo haga.
  • Si confía en algo devuelto que tiene cierto tipo pero no puede devolver nada significativo de este tipo, entonces None le dirá a la persona que llama que este fue el caso ( ) No hay mejor manera de decirle a la persona que llama que "nada" se devuelve luego por None, a fin de comprobar por ella y se le multa)
12

No. Si no se alcanza un comunicado return antes del final de la función se devuelve una implícita None.

5

Si no se llega a una instrucción de retorno, la función devuelve None.

def set_x(): 
    x = 2 
3

No estoy seguro de lo que realmente está tratando de hacer. Aquí hay algunas cosas que le pueden gustar:

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]" 

Espere, usted dijo "filtro". ¿Está filtrando una serie de valores y solo quiere extraer los que cumplen un criterio? Eso es fácil en Python:

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

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

Y dijiste "funciones de encadenamiento". Una vez más, eso es fácil si estamos hablando de filtrar una secuencia:

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: Aquí es una buena introducción a los iteradores y generadores en Python. http://www.learningpython.com/2009/02/23/iterators-iterables-and-generators-oh-my/

+0

y esto estaría bien si estuviera filtrando 100 o menos por segundo? – beoliver

+0

No hay ninguna razón para usar una función allí, es más claro simplemente hacerlo como '' [x para x en secuencia si 0 <= x <= 100] ''. –

+0

@steveha: ¿por qué usar una lista de comprensión cuando hay una función incorporada de 'filtro'? 'filtered_list = filtro (foo_filter, unfiltered_sequence)' – Nobody

Cuestiones relacionadas