Python def函数:如何指定函数的结尾?

时间:2009-10-15 16:32:53

标签: python syntax

我只是学习python并且在函数的“def”结束时感到困惑?

我看到代码示例如:

def myfunc(a=4,b=6):
    sum = a + b
    return sum

myfunc()

我知道它不会因为返回而结束(因为我看过if语句......如果FOO比返回BAR,否则返回FOOBAR)。 Python如何知道这不是一个自称的递归函数?当函数运行时,它只是继续通过程序直到它找到返回?这会导致一些有趣的错误。

由于

8 个答案:

答案 0 :(得分:60)

在Python中,空白是重要的。当压痕变小(小)时,该功能结束。

def f():
    pass # first line
    pass # second line
pass # <-- less indentation, not part of function f.

请注意,单行函数可以在没有缩进的情况下编写,在一行中:

def f(): pass

然后是使用分号,但不推荐

def f(): pass; pass

上面的三个表单显示了如何定义函数的结尾语法。至于语义,在Python中有三种退出函数的方法:

  • 使用return语句。这与您可能知道的任何其他命令式编程语言相同。

  • 使用yield语句。这意味着该功能是一个发电机。解释其语义超出了本答案的范围。请查看Can somebody explain me the python yield statement?

  • 只需执行最后一个语句即可。如果没有更多语句且最后一个语句不是return语句,则该函数就像最后一个语句是return None一样存在。也就是说,如果没有明确的return语句,函数将返回None。该函数返回None

    def f():
        pass
    

    这个也是如此:

    def f():
        42
    

答案 1 :(得分:29)

Python在缩进方面是白空间敏感的。一旦缩进级别回落到定义函数的级别,函数就会结束。

答案 2 :(得分:9)

准确地说,一个块在遇到非空行的情况下结束,该非空行最多与开始时相同。此非空行不是该块的一部分 例如,以下打印同时结束两个块:

def foo():
    if bar:
        print "bar"

print "baz" # ends the if and foo at the same time

缩进级别小于或等于def和if,因此它们两者都结束。

没有陈述的行,无论缩进,都无关紧要

def foo():
    print "The line below has no indentation"

    print "Still part of foo"

但是标记块结束的语句必须缩进到与现有缩进相同的级别。以下是错误:

def foo():
    print "Still correct"
   print "Error because there is no block at this indentation"

一般来说,如果你习惯于花括号语言,只需缩进代码就可以了。你会没事的。

顺便说一句,缩进的“标准”方式只有空格,但当然只有标签是可能的,但请不要将它们混合在一起。

答案 3 :(得分:4)

有趣的是,如果您只是在python交互式解释器中输入,则必须使用空行跟随函数。这不起作用:

def foo(x):
  return x+1
print "last"

虽然它在文件中是完全合法的python语法。在输入解释器时还有其他语法差异,所以要小心。

答案 4 :(得分:2)

白色空间很重要。当块完成时,就是功能定义完成时。

当函数运行时,它会一直运行直到完成,或者直到遇到returnyield语句。如果函数完成而未遇到returnyield语句None则会隐式返回。

the tutorial中有更多信息。

答案 5 :(得分:1)

它使用缩进

 def func():
     funcbody
     if cond: 
         ifbody
     outofif

 outof_func 

答案 6 :(得分:1)

所以它的缩进很重要。正如其他用户向您指出的那样,当缩进级别与def函数声明处于同一点时,您的函数已经结束。请记住,您不能在Python中混合制表符和空格。大多数编辑都为此提供支持。

答案 7 :(得分:0)

我认为最好通过注释来明确标记函数的结尾

def func():
     # funcbody
     ## end of subroutine func ##

问题在于某些子例程很长,不方便向上滚动编辑器来检查哪个函数结束了。另外,如果使用Sublime,则可以右键单击->转到定义,它将自动跳转到子例程声明。

相关问题