avec un filtre simple qui teste l’entrée sur une plage de 0-100.
def foo(foo_input):
if 0 <= foo_input <= 100:
return f_input
Ceci ne renvoie aucun si foo_input is > 100
. Mais pourrait-il réellement "ne" rien retourner? ou une fonction doit-elle toujours renvoyer quelque chose?
Les fonctions retournent toujours quelque chose (au moins None
, lorsqu'aucune instruction return n'a été atteinte pendant l'exécution et que la fin de la fonction est atteinte).
Un autre cas est celui où ils sont interrompus par des exceptions. Dans ce cas, la gestion des exceptions "dominera sur la pile" et vous retournerez à la variable except
appropriée ou obtiendrez une mauvaise erreur :)
En ce qui concerne votre problème, je dois dire qu’il ya deux possibilités: Vous avez quelque chose à retourner ou vous n’avez pas.
None
dira à l'appelant que c'était le cas ( Il n'y a pas de meilleur moyen de lui dire que rien "est retourné ensuite par None
, alors vérifiez-le et tout ira bien)Non. Si une instruction return
n'est pas atteinte avant la fin de la fonction, une None
implicite est renvoyée.
Si aucune instruction return n'est atteinte, la fonction renvoie None
.
def set_x():
x = 2
Je ne suis pas sûr de ce que vous essayez vraiment de faire. Voici quelques points qui pourraient vous intéresser:
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]"
Attendez, vous avez dit "filtrer". Filtrez-vous une série de valeurs et souhaitez-vous simplement extraire celles qui répondent à un critère? C'est facile en Python:
def foo_check(x):
return 0 <= x <= 100
filtered_list = [x for x in unfiltered_sequence if foo_check(x)]
Et vous avez dit "fonctions d'enchaînement". Encore une fois, c’est facile si nous parlons de filtrer une séquence:
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: Voici une bonne introduction aux itérateurs et aux générateurs en Python. http://www.learningpython.com/2009/02/23/iterators-iterables-and-generators-oh-my/