我正在学习Python,但是当一个函数的"def"结束时我感到困惑。
我看到像这样的代码示例:
def myfunc(a=4,b=6):
sum = a + b
return sum
myfunc()
因为我看到过类似 if FOO 就返回 BAR,否则返回 FOOBAR 的语句,所以我知道这个函数不会因为 return 而结束。Python 如何知道这不是一个递归函数调用自身?当函数运行时,它只是继续执行程序直到找到 return 吗?这可能导致一些有趣的错误。
谢谢
我正在学习Python,但是当一个函数的"def"结束时我感到困惑。
我看到像这样的代码示例:
def myfunc(a=4,b=6):
sum = a + b
return sum
myfunc()
因为我看到过类似 if FOO 就返回 BAR,否则返回 FOOBAR 的语句,所以我知道这个函数不会因为 return 而结束。Python 如何知道这不是一个递归函数调用自身?当函数运行时,它只是继续执行程序直到找到 return 吗?这可能导致一些有趣的错误。
谢谢
在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
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"
一般来说,如果你习惯于花括号语言,只需像它们那样缩进代码就可以了。
顺便说一下,“标准”的缩进方式是只用空格,但当然也可以只用制表符,但请不要混合使用。
def foo(x):
return x+1
print "last"
虽然在文件中使用Python语法是完全合法的,但在与解释器交互时还存在其他语法差异,请注意。
...
编写函数定义的一部分。事实上,PEP8大致概述了在函数定义后应该或不应该有空行的情况。 - MoxieBall空格很重要。当块结束时,函数定义也随之结束。
当函数运行时,它会一直运行直到完成,或者遇到return
或yield
语句为止。如果函数在没有遇到return
或yield
语句的情况下完成,则隐式返回None
。
在教程中还有更多信息。
因此缩进很重要。正如其他用户在这里向您指出的那样,当缩进级别与def函数声明的位置相同时,您的函数已经结束。请记住,在Python中不能混合使用制表符和空格。大多数编辑器都提供此功能的支持。
它使用缩进
def func():
funcbody
if cond:
ifbody
outofif
outof_func
def func():
# funcbody
## end of subroutine func ##
sum = a + b
前面有空格。你试过不在那里使用空格吗?如果这样做会发生什么?这能给一些暗示吗? - Karl Knechtel