繁体   English   中英

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

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

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

我看到的代码示例如下:

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

myfunc()

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

谢谢

在 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语句。 这意味着该函数是一个生成器。 解释其语义超出了本答案的范围。 看看有人可以向我解释 python yield 语句吗?

  • 通过简单地执行最后一条语句。 如果没有更多语句并且最后一个语句不是return语句,则该函数存在,就好像最后一个语句是return None 也就是说,如果没有明确的return语句,函数将返回None 此函数返回None

     def f(): pass

    这个也是如此:

     def f(): 42

Python 在缩进方面对空格敏感。 一旦缩进级别回落到定义函数的级别,函数就结束了。

准确地说,当遇到与开头缩进至多相同级别的非空行时,块就结束了。 这个非空行不是那个块的一部分 例如,下面的打印同时结束两个块:

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"

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

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

有趣的是,如果您只是在 python 交互式解释器中键入,则必须在函数后面加上一个空行。 这不起作用:

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

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

空白很重要。 当块完成时,就是函数定义完成的时候。

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

教程中有更多信息。

它使用缩进

 def func():
     funcbody
     if cond: 
         ifbody
     outofif

 outof_func 

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

在我看来,最好通过注释明确标记函数的结尾

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

重点是有些子程序很长,不方便向上滚动编辑器查看哪个函数结束了。 另外,如果你使用Sublime,你可以右键-> Goto Definition,它会自动跳转到子程序声明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM