web-dev-qa-db-fra.com

est-il possible de ne rien retourner d'une fonction en python?

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?

14
beoliver

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.

  • Si vous avez quelque chose à revenir, faites-le, sinon ne le faites pas.
  • Si vous vous fiez à quelque chose retourné qui a un certain type mais que vous ne pouvez rien retourner de significatif, alors 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)
18
Nobody

Non. Si une instruction return n'est pas atteinte avant la fin de la fonction, une None implicite est renvoyée.

14

Si aucune instruction return n'est atteinte, la fonction renvoie None.

def set_x():
    x = 2
6
Billjk

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/

3
steveha

Nous pouvons utiliser pass :

def foo(input):
    pass

Il ne retournera rien.

0
abhijeet kaurav