función en función

como puedo hacer la func. ¿Mostrar todos los valores malos y no solo uno?

def get_bad_results(person_results): for i in person_results: if i[1]>i[3] or i[1]<i[2]: return i[0] test_results = [["White blood cells",8.5,2,7], ["Neutrophils",5.3,2.5,5], ["Red blood cells", 12.4, 9,15]] a = get_bad_results(test_results) print a 

mostrar White blood cells

en lugar de

 White blood cells, Neutrophils 

Como espera varios resultados por llamada, es mejor utilizar una función de generador:

 def get_bad_results(person_results): for i in person_results: if i[1]>i[3] or i[1] 

o una expresión generadora:

 def get_bad_results(person_results): return (i[0] for i in person_results if i[1]>i[3] or i[1] 

así que eso

 test_results = [["White blood cells",8.5,2,7], ["Neutrophils",5.3,2.5,5], ["Red blood cells", 12.4, 9,15]] for i in get_bad_results(test_results): print i print list(get_bad_results(test_results)) print ", ".join(get_bad_results(test_results)) 

da la salida

 White blood cells Neutrophils ['White blood cells', 'Neutrophils'] White blood cells, Neutrophils 

Para la otra función, hacer

 def count_healthy(all_results): counter = 0 for i in all_results: if len(list(get_bad_results(i))) == 0: counter += 1 return counter 

o solo

 def count_healthy(all_results): return sum(1 for i in all_results if len(list(get_bad_results(i))) == 0) 

Editar:

Para muchos get_bad_results() , convertirlo en una lista podría get_bad_results() mucha memoria.

Así que en lugar de len(list(get_bad_results(i))) == 0 podría usar

 def has_results(it): """Returns True if the iterator it yields any items.""" return next((True for _ in it), False) 

y entonces

 def count_healthy(all_results): return sum(1 for i in all_results if not has_results(get_bad_results(i))) 

Su función count_healthy() no return un valor, por lo que b es None . Dado que la función realiza una impresión, seguida de la print b , se explica la salida de None después de la salida de la función.

Básicamente, una función que se supone debe hacer un recuento probablemente no debería también imprimir el resultado, sino que debería return para que la persona que llama pueda decidir que el resultado debe imprimirse o manejarse de manera diferente.

Su función no tiene una statement de return , por lo que, de forma implícita, no devuelve None .

Intente agregar una statement de return y devuelva el valor que desea imprimir.

Estás intentando imprimir resultado de funciones

 a = get_bad_results(test_results) print a b =count_healthy(all_results) print b 

Por defecto las funciones devuelven Ninguna.

ok lo arreglé pero ahora

 def get_bad_results(person_results): for i in person_results: if i[1]>i[3] or i[1] 

mostrar White blood cells

En lugar de White blood cells, Neutrophils