Python过程返回值

Jam*_*mes 19 python

在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__.

  • @James:其他编译器可以使用所有代码.Python是一种动态语言.编译器没有可用的所有代码.如果没有实际运行*代码,它就无法进行这种分析.因此,不是运行代码以查看它是否返回,而是运行代码为real,它只运行代码. (8认同)
  • "编译失败"?怎么会这样?除了最微不足道的情况之外,不可能验证每个可能的逻辑路径.考虑`return someOtherFunction()`.你有编译器然后检查`someOtherFunction`是否有某种"完整性"? (2认同)

e-s*_*tis 12

Python从不检查人类的不当行为.语言哲学是假设程序员是成年人并且知道他们在做什么.

自:

  • Python是一种自动编写的语言,因此你会在一瞬间知道什么会返回一个函数;
  • Python使用duck typing,因此默认情况下获取None可以简化动态函数调用.

返回无比提出错误更容易.

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中没有这样的东西.您可以应用所有功能,并处理输出(如果有).

  • 哇,哇,容易保罗:-)来自其他语言的一些人可能会对Python感到沮丧.嘿,当我不使用Python时,我感到很沮丧!我认为我们唯一能做的就是说:这是pythonistas编码的方式,这就是为什么我们认为这很好.让其他人采取他们想要的部分,也有意义.@James:Python交易错误检查的灵活性.每个Python程序员都知道这是一个协议,我们对此感到非常高兴.你可能觉得它不适合你,你会有这样的感觉. (6认同)

Sat*_*ppy 7

嘿.从Java的角度来看,你的问题很明显.它应该抛出一个错误.

但是如果你从Perl的角度来看它,它根本不是很明显.你将变量设置为无价值,这很重要.

一切都与打字有关.与Java类似,Python是强类型的,但与Java不同,它也是动态类型的.大多数动态类型语言都允许像这样的恶作剧.