关于语法:python def函数:如何指定函数的结尾?

Python def function: How do you specify the end of the function?

我只是在学习python,当函数的"def"结束时会感到困惑?

我看到的代码示例如下:

1
2
3
4
5
def myfunc(a=4,b=6):
    sum = a + b
    return sum

myfunc()

我知道它不会因为回报而结束(因为我看过if语句…如果foo大于返回栏,则返回foo bar)。python怎么知道这不是一个调用自身的递归函数?当函数运行时,它是否继续执行程序,直到找到返回?这会导致一些有趣的错误。

谢谢


在Python中,空白非常重要。当缩进变小(变小)时,函数结束。

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

请注意,一行函数可以在一行上不缩进地编写:

1
def f(): pass

另外,还有使用分号,但不建议这样做:

1
def f(): pass; pass

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

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

  • 使用yield语句。这意味着函数是一个生成器。解释它的语义超出了这个答案的范围。看看有人能给我解释一下python yield语句吗?

  • 只需执行最后一条语句。如果没有更多的语句,并且最后一条语句不是return语句,那么函数的存在就好像最后一条语句是return None语句一样。也就是说,如果没有显式的return语句,函数将返回None。此函数返回None

    1
    2
    def f():
        pass

    这个也是:

    1
    2
    def f():
        42

python对缩进很敏感。一旦缩进级别回落到定义函数的级别,函数就结束了。


准确地说,当一个块遇到一个非空行时,它将结束,该行最多与起始行缩进相同的级别。此非空行不是该块的一部分例如,以下打印同时结束两个块:

1
2
3
4
5
def foo():
    if bar:
        print"bar"

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

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

没有语句的行,无论是缩进,都不重要

1
2
3
4
def foo():
    print"The line below has no indentation"

    print"Still part of foo"

但标记块结尾的语句必须缩进到与任何现有缩进相同的级别。那么,以下是一个错误:

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

通常,如果您习惯大括号语言,只需像它们一样缩进代码,就可以了。

顺便说一句,缩进的"标准"方式只使用空格,但当然只使用制表符,但请不要将两者混合使用。


有趣的是,如果您只是在python交互式解释器中键入内容,那么您必须遵循一个带有空行的函数。这不起作用:

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

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


空白很重要。当块完成时,即函数定义完成时。

当函数运行时,它会一直运行直到完成,或者直到遇到returnyield语句为止。如果函数在没有遇到returnyield语句的情况下完成,则隐式返回None语句。

在本教程中有更多的信息。


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


它使用缩进

1
2
3
4
5
6
7
 def func():
     funcbody
     if cond:
         ifbody
     outofif

 outof_func