使用一个简单的过滤器来测试 0-100 范围内的输入。
def foo(foo_input):
if 0 <= foo_input <= 100:
return f_input
如果 ,这将返回无foo_input is > 100
。但它真的可以“不”返回任何东西吗?还是一个函数总是必须返回一些东西?
函数总是返回一些东西(至少None
,当在执行过程中没有到达返回语句并且到达函数的末尾时)。
另一种情况是当它们被异常中断时。在这种情况下,异常处理将“支配堆栈”,您将返回适当的except
或得到一些讨厌的错误:)
关于你的问题,我必须说有两种可能性:要么你有东西要退货,要么你没有。
None
将告诉调用者这是这种情况(没有更好的方法来告诉调用者“没有”返回,然后None
,所以检查一下,你会没事的)否。如果return
在函数结束之前未到达语句,None
则返回隐式。
如果未到达 return 语句,则函数返回None
。
def set_x():
x = 2
我不确定你真正想要做什么。以下是您可能喜欢的几件事:
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/
我有点喜欢隐式return None
但pylint将其标记为不良风格,警告:
函数中的所有 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 语句(如果可以访问)。