Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python def函数:如何指定函数的结尾?_Python_Syntax - Fatal编程技术网

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

Python def函数:如何指定函数的结尾?,python,syntax,Python,Syntax,我只是在学习python,对函数的“def”何时结束感到困惑 我看到的代码示例如下: def myfunc(a=4,b=6): sum = a + b return sum myfunc() 我知道它不会因为返回而结束(因为我看到了if语句……if FOO比return BAR,else return FOOBAR)。Python如何知道这不是一个调用自身的递归函数?当函数运行时,它是否会继续遍历程序,直到找到返回值?这会导致一些有趣的错误 谢谢空格很重要。块完成时,即函数定

我只是在学习python,对函数的“def”何时结束感到困惑

我看到的代码示例如下:

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

myfunc()
我知道它不会因为返回而结束(因为我看到了if语句……if FOO比return BAR,else return FOOBAR)。Python如何知道这不是一个调用自身的递归函数?当函数运行时,它是否会继续遍历程序,直到找到返回值?这会导致一些有趣的错误


谢谢

空格很重要。块完成时,即函数定义完成时

当函数运行时,它会一直运行,直到它完成,或者直到遇到
return
yield
语句。如果函数结束时未遇到
返回
产生
语句,则隐式返回


在Python中有更多的信息。

在Python中,空格非常重要。当缩进变小(更小)时,函数结束

此外,还可以使用分号,但不建议使用分号:

def f(): pass; pass
上述三种形式显示了函数的结尾是如何按语法定义的。至于语义,在Python中有三种退出函数的方法:

  • 使用
    return
    语句。这与您可能知道的任何其他命令式编程语言的工作原理相同

  • 使用
    产生
    语句。这意味着该函数是一个生成器。解释它的语义超出了这个答案的范围。看看

  • 只需执行最后一条语句。如果没有更多的语句,并且最后一条语句不是
    return
    语句,则该函数的存在就如同最后一条语句是
    returnnone
    一样。也就是说,如果没有显式的
    return
    语句,函数将返回
    None
    。此函数返回
    None

    def f():
        pass
    
    这一个也是:

    def f():
        42
    

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

它使用缩进

 def func():
     funcbody
     if cond: 
         ifbody
     outofif

 outof_func 

精确地说,当一个块遇到一条非空行时,它就结束了,这条非空行的缩进程度与起始位置最多相同。此非空行不是该块的一部分 例如,以下打印同时结束两个块:

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函数声明处于同一点时,您的函数就结束了。请记住,在Python中不能混合使用制表符和空格。大多数编辑器都支持这一点。

有趣的是,如果您只是在python交互式解释器中键入,则必须遵循带有空行的函数。这不起作用:

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

虽然它是文件中完全合法的python语法。在向解释器输入时,也存在其他语法差异,因此要小心。

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

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

关键是某些子例程非常长,不便于向上滚动编辑器以检查哪个函数结束。此外,如果使用升华,可以右键单击->转到定义,它将自动跳转到子程序声明。

Wow。。。我没想到。从来没有听说过缩进只用于可读性。谢谢这是一个非常好的评论。任何对Python的介绍都会提到重要的空白是最早的东西之一,如果不是最早的话——毕竟这是Python最独特的特性之一。到目前为止,我只是在使用这个备忘单:尝试学习语法。如果你有很好的教程建议,我是开放的。谷歌的任何教程。他们可能稍微好一点。备忘单上说“块是由以冒号(:)结尾的语句后面的缩进表示的,如…”,因此它不会误导您。最好的方法是深入研究Python。我认为这是编写Python函数的明智方法。没有空行的“缩进”似乎是一种麻烦。这与其说是与解释器的“语法”差异,不如说是一种实际差异——唯一的原因是,否则就无法在解释器中编写多行函数,解释器清楚地表明,您仍然在使用前面的
编写函数定义的一部分。事实上,在函数定义之后不应该有空行,也不应该有空行。
def foo(x):
  return x+1
print "last"
def func():
     # funcbody
     ## end of subroutine func ##