Python是如何知道函数结束的位置的?
我正在学习Python,但对函数的“def”到底什么时候结束感到困惑。
我看到一些代码示例,比如:
def myfunc(a=4,b=6):
sum = a + b
return sum
myfunc()
我知道它不是因为有返回值而结束的(因为我见过if语句……如果FOO就返回BAR,否则返回FOOBAR)。那么,Python是怎么知道这不是一个自我调用的递归函数呢?当函数运行时,它会一直执行下去,直到找到一个返回值吗?这样的话可能会导致一些有趣的错误。
谢谢
8 个回答
具体来说,一个代码块在遇到一个非空行时结束,这个非空行的缩进级别最多和开始的缩进级别一样。这条非空行不属于这个代码块。
比如,下面的代码同时结束了两个代码块:
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编程中,空格和缩进是很重要的。也就是说,当你写代码时,缩进的层级会影响代码的结构。如果缩进回到定义函数时的那个层级,就意味着这个函数的内容写完了。
在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