在Python中,可以创建一个没有显式返回的过程.即:
def test(val):
if 0 == val:
return 8
Run Code Online (Sandbox Code Playgroud)
此外,可以将该函数的结果分配给变量:
>>> a = test(7)
>>> print `a`
'None'
Run Code Online (Sandbox Code Playgroud)
为什么这样呢?令人困惑的设计决策背后是什么语言逻辑?为什么不简单地引发编译错误?
编辑:是的,我意识到它的工作原理.谢谢.我的问题是为什么?在您的代码中引入细微错误似乎是一种可靠的火灾方式.正如下面e-satisf所提到的那样,似乎违背了"明显更善于隐含"这一非常明智的蟒蛇格言.
那么,这有什么用呢?它只是一个设计监督或一个简化的假设或一个经过慎重考虑的决定吗?
编辑:大家都同意用这种方式表达意图要好得多:
def test(val):
if 0 == val:
return 8
else:
return None
Run Code Online (Sandbox Code Playgroud)
如果是这样,为什么Python更喜欢前一种风格来引发编译时异常?
编辑:S.Lott明确地提出了这一点(其他人也这样做,他似乎对我来说最清楚)这种行为是因为Python是一种动态语言,因此无法在编译时检查,系统的运行时行为.
由于程序(那些不返回值的函数)和函数(那些没有返回值)之间没有区别,因此在编译时没有任何内容可以强制执行.这意味着当我们遇到运行时行为时,我们要么在某些情况下发生灾难性故障(我们抛出异常),要么我们默默地假设程序员知道他们在做什么并理解默认行为.
pythonic方式是做后者,C风格的方式是做前者.
这似乎是有道理的,因为这是一个很好的理由.
S.Lott明确的理由被埋没在对已接受答案的评论中,所以我认为最好在这里总结一下.
我会暂时接受答案,看看S.Lott是否正式回答.否则,我会给SilentGhost点.
Sil*_*ost 27
虽然每个函数可能没有显式返回,但它会有一个隐式函数,也就是 None偶然的普通Python对象.此外,功能通常是return None明确的.
我认为返回无隐式只是一种易于使用的优化.
PS我想知道你建议编译在以下情况下会做什么:
def t():
if True:
return 'ham'
Run Code Online (Sandbox Code Playgroud)
PPS return语句表明需要返回某些内容,无论是None,42还是'spam'.但是,有些函数并没有真正返回任何内容,例如list.sort或者__init__,因此return None在每个函数的末尾需要一个语句是一种开销__init__.
e-s*_*tis 12
Python从不检查人类的不当行为.语言哲学是假设程序员是成年人并且知道他们在做什么.
自:
返回无比提出错误更容易.
EG:
function_stack = [func1,func2,func3]
for f in function_stack :
a = f()
if a is not None :
# do something
Run Code Online (Sandbox Code Playgroud)
无论f是f()是函数还是程序.Python中没有这样的东西.您可以应用所有功能,并处理输出(如果有).
| 归档时间: |
|
| 查看次数: |
33721 次 |
| 最近记录: |