是不是可以从python中的函数返回任何内容?

时间:2012-04-08 22:17:27

标签: python function

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

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

如果foo_input is > 100,则返回none。但它真的“不”会返回任何东西吗?或者功能总是必须返回一些东西?

6 个答案:

答案 0 :(得分:21)

当在执行期间没有达到return语句并且到达函数结束时,函数总是返回一些东西(至少None。)

另一种情况是他们被例外打断。 在这种情况下,异常处理将“占据堆栈”并且您将返回到相应的except或者得到一些令人讨厌的错误:)

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

  • 如果你有什么东西可以归还,那么就这样做,如果没有,那就不要。
  • 如果您依赖某些类型的返回内容,但您无法返回此类型的任何有意义的内容,则None会告诉来电者情况属实( 没有更好的方法告诉来电者None然后返回“无”,所以检查一下,你会没事的。)

答案 1 :(得分:14)

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

答案 2 :(得分:6)

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

def set_x():
    x = 2

答案 3 :(得分:3)

我不确定你到底想要做什么。以下是您可能会喜欢的一些事项:

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/

答案 4 :(得分:0)

我们可以使用pass

def foo(input):
    pass

它不会返回任何内容。

答案 5 :(得分:0)

我有点像隐式rootfs_update_timestamp,但pylint将其标记为不良样式,警告:

  

函数中的所有return语句都应返回   表达,或者都不表达   should.pylint(不一致的退货声明)

因此

return None

即使功能上相同,也可能是更好的样式。


更多信息可用here,其中Pylint更改日志指出:

  

添加了新的Python检查器以警告   不一致的退货陈述。函数或方法具有   如果返回显式和返回值不一致的返回语句   隐式值...

     

根据PEP8,如果任何return语句返回一个表达式,则任何   不返回任何值的return语句应明确声明   这作为return None,并且明确的return语句应该是   在功能末尾显示(如果可以访问)。