我只是在学习python,当函数的"def"结束时会感到困惑?
我看到的代码示例如下:
1
2
3
4
5def myfunc(a=4,b=6):
sum = a + b
return sum
myfunc()
我知道它不会因为回报而结束(因为我看过if语句…如果foo大于返回栏,则返回foo bar)。python怎么知道这不是一个调用自身的递归函数?当函数运行时,它是否继续执行程序,直到找到返回?这会导致一些有趣的错误。
谢谢
这是一个很好的评论。对python的任何介绍都提到了重要的空白,这是第一个(如果不是第一个)东西——毕竟,它是最有特色的python特性之一。
到目前为止,我只是使用这个备忘表:ibm.com/developerworks/library/l-craitsheet3.html来尝试学习语法。如果你有好的辅导建议,我会开放的。
谷歌提供任何教程。它们可能稍微好一点。备忘单上写着"这个块是用以冒号(:)结尾的语句后面的缩进来表示的,就像在……"中那样,所以它不会主动误导你。
最好的办法是潜入Python
在Python中,空白非常重要。当缩进变小(变小)时,函数结束。
1
2
3
4def f():
pass # first line
pass # second line
pass #
请注意,一行函数可以在一行上不缩进地编写:
1def f(): pass
另外,还有使用分号,但不建议这样做:
1def f(): pass; pass
上面的三种形式显示了如何在语法上定义函数的结尾。至于语义,在Python中,退出函数有三种方法:
使用return语句。这与您可能知道的任何其他命令式编程语言的工作原理相同。
使用yield语句。这意味着函数是一个生成器。解释它的语义超出了这个答案的范围。看看有人能给我解释一下python yield语句吗?
只需执行最后一条语句。如果没有更多的语句,并且最后一条语句不是return语句,那么函数的存在就好像最后一条语句是return None语句一样。也就是说,如果没有显式的return语句,函数将返回None。此函数返回None:
1
2def f():
pass
这个也是:
1
2def f():
42
python对缩进很敏感。一旦缩进级别回落到定义函数的级别,函数就结束了。
真的。。。没想到。从来没有听说过缩进只能用于可读性。谢谢!
准确地说,当一个块遇到一个非空行时,它将结束,该行最多与起始行缩进相同的级别。此非空行不是该块的一部分例如,以下打印同时结束两个块:
1
2
3
4
5def foo():
if bar:
print"bar"
print"baz" # ends the if and foo at the same time
缩进级别小于或等于def和if,因此它将两者都结束。
没有语句的行,无论是缩进,都不重要
1
2
3
4def foo():
print"The line below has no indentation"
print"Still part of foo"
但标记块结尾的语句必须缩进到与任何现有缩进相同的级别。那么,以下是一个错误:
1
2
3def foo():
print"Still correct"
print"Error because there is no block at this indentation"
通常,如果您习惯大括号语言,只需像它们一样缩进代码,就可以了。
顺便说一句,缩进的"标准"方式只使用空格,但当然只使用制表符,但请不要将两者混合使用。
有趣的是,如果您只是在python交互式解释器中键入内容,那么您必须遵循一个带有空行的函数。这不起作用:
1
2
3def foo(x):
return x+1
print"last"
尽管它在文件中是完全合法的python语法。在给解释器输入时,还有其他的语法差异,所以要小心。
我认为这是编写Python函数的明智方法。"没有空行的去缩进看起来像是麻烦的秘诀。
这与解释器的"句法"差异远不止是实际差异——唯一的原因是,否则就无法在解释器中编写多行函数,而且解释器清楚地表明,您仍在使用前导的...编写函数定义的一部分。事实上,PEP8在函数定义之后松散地勾勒出应该和不应该有空行的时间。
空白很重要。当块完成时,即函数定义完成时。
当函数运行时,它会一直运行直到完成,或者直到遇到return或yield语句为止。如果函数在没有遇到return或yield语句的情况下完成,则隐式返回None语句。
在本教程中有更多的信息。
所以凹痕很重要。正如这里的其他用户向您指出的,当缩进级别与def函数声明处于同一点时,您的函数已经结束。请记住,不能在Python中混合制表符和空格。大多数编辑器都对此提供支持。
它使用缩进
1
2
3
4
5
6
7def func():
funcbody
if cond:
ifbody
outofif
outof_func