31

使用一个简单的过滤器来测试 0-100 范围内的输入。

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

如果 ,这将返回无foo_input is > 100。但它真的可以“不”返回任何东西吗?还是一个函数总是必须返回一些东西?

4

5 回答 5

38

函数总是返回一些东西(至少None,当在执行过程中没有到达返回语句并且到达函数的末尾时)。

另一种情况是当它们被异常中断时。在这种情况下,异常处理将“支配堆栈”,您将返回适当的except或得到一些讨厌的错误:)

关于你的问题,我必须说有两种可能性:要么你有东西要退货,要么你没有。

  • 如果你有东西要退货,那就这样做,如果没有,那就不要。
  • 如果您依赖于返回的具有某种类型的东西,但您不能返回任何有意义的这种类型,那么None将告诉调用者这是这种情况(没有更好的方法来告诉调用者“没有”返回,然后None,所以检查一下,你会没事的)
于 2012-04-08T22:18:52.333 回答
27

否。如果return在函数结束之前未到达语句,None则返回隐式。

于 2012-04-08T22:19:07.003 回答
10

如果未到达 return 语句,则函数返回None

def set_x():
    x = 2
于 2012-04-08T22:21:25.770 回答
4

我不确定你真正想要做什么。以下是您可能喜欢的几件事:

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

等等,你说的是“过滤器”。您是否过滤了一系列值并且只想提取符合条件的值?这在 Python 中很容易:

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

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

你说的是“链接功能”。如果我们谈论过滤序列,这很容易:

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)

编辑:这是对 Python 中的迭代器和生成器的一个很好的介绍。 http://www.learningpython.com/2009/02/23/iterators-iterables-and-generators-oh-my/

于 2012-04-08T22:33:49.727 回答
1

我有点喜欢隐式return Nonepylint将其标记为不良风格,警告:

函数中的所有 return 语句都应该返回一个表达式,或者它们都不应该返回。pylint(inconsistent-return-statements)

因此,

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

可能是更好的风格,即使它们在功能上是相同的。


更多信息可在此处获得,其中 Pylint 更改日志指出:

添加了一个新的 Python 检查器来警告不一致的返回语句。如果函数或方法同时返回显式值和隐式值,则它的返回语句不一致...

根据PEP8,如果任何 return 语句返回一个表达式,则任何没有返回值的 return 语句都应该明确地将其声明为 return None,并且应该在函数的末尾出现一个明确的 return 语句(如果可以访问)。

于 2019-04-10T22:33:29.430 回答