Python如何知道函数的结尾在哪里?

v09wglhw  于 2022-12-10  发布在  Python
关注(0)|答案(8)|浏览(276)

我刚刚学习Python,当函数的“def”结束时感到困惑?
我看到的代码示例如下:

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

myfunc()

我知道它不会因为返回而结束(因为我看过if语句... if FOO than return BAR,else return FOOBAR)。Python怎么知道这不是一个调用自身的递归函数?当函数运行时,它会一直遍历程序直到找到一个返回吗?这会导致一些有趣的错误。
谢谢

gdrx4gfi

gdrx4gfi1#

在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
yyhrrdl8

yyhrrdl82#

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

iqjalb3h

iqjalb3h3#

确切地说,当一个块遇到一个非空行时,它就结束了。这个非空行的缩进最多与开始的缩进相同。这个非空行不是该块的一部分。例如,下面的打印同时结束了两个块:

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"

一般来说,如果你习惯了花括号语言,只要像它们一样缩进代码就可以了。
顺便说一句,缩进的“标准”方式是只使用空格,但当然也可以只使用制表符,但请不要将两者混合使用。

yvgpqqbh

yvgpqqbh4#

有趣的是,如果你只是在python交互式解释器上输入,你必须在函数后面加上一个空行,这是行不通的:

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

虽然它在文件中是完全法律的的Python语法。在向解释器键入时也有其他语法差异,所以要小心。

wr98u20j

wr98u20j5#

白色很重要。当块完成时,函数定义也就完成了。
当函数运行时,它会一直运行,直到完成,或者直到遇到returnyield语句如果函数完成时没有遇到returnyield语句,则隐式返回None
教程中有很多详细信息。

7gyucuyw

7gyucuyw6#

所以缩进才是最重要的。正如其他用户所指出的,当缩进级别与def函数声明的位置相同时,你的函数就结束了。请记住,在Python中不能混用制表符和空格。大多数编辑器都支持这一点。

zbwhf8kr

zbwhf8kr7#

它使用缩进

def func():
     funcbody
     if cond: 
         ifbody
     outofif

 outof_func
zpf6vheq

zpf6vheq8#

在我看来,最好用注解显式地标记函数的结尾

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

关键是有些子例程很长,不方便在编辑器中向上滚动查看哪个函数结束。另外,如果使用Sublime,可以右键单击-〉后藤Definition,它会自动跳转到子例程声明。

相关问题