[英]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 语法。 在向解释器输入时也有其他语法差异,所以要小心。
空白很重要。 当块完成时,就是函数定义完成的时候。
当函数运行时,它会一直运行直到完成,或者直到遇到return
或yield
语句。 如果函数在没有遇到return
或yield
语句的情况下完成,则隐式返回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.