功能中的缩进不能按预期工作

时间:2015-01-19 09:28:21

标签: python python-2.7

我发现了一些对我没有意义的东西。我希望有人可以解释一下。

def test(word):
    total = 0
    for l in word:
        print l

test('python')

结果是' (每个字母都出现在自己的行上)。

def test(word):
    total = 0
    for l in word:
        print l
    return total

test('python')

结果只是' p'。

为什么添加return语句会产生这种影响?两个代码块都不应该做同样的事情吗?这是否意味着它只通过for循环一次然后执行return语句?

3 个答案:

答案 0 :(得分:9)

您获得所看到的行为的唯一方法是缩进return total是否为for循环的一部分。如果它在编辑器中没有像那样,那是因为您为return行使用了TAB字符:

>>> code_as_posted = '''\
... def test(word):
...     total = 0
...     for l in word:
...         print l
...     return total
... '''
>>> code_as_posted.splitlines()[-1]
'\treturn total'

看到\t字符逃脱了吗?这是一个tab character,当由Python解释时会扩展到 8个空格;请参阅Python参考文档中的Indentation

  

首先,标签被替换(从左到右)一到八个空格,使得直到并包括替换的字符总数是八的倍数(这与Unix使用的规则相同) )。然后,第一个非空白字符前面的空格总数确定行的缩进。

return提前退出循环时,您只会看到打印出'p'个字符。

您的编辑器和Stack Overflow Markdown实现都会将选项卡显示为四个空格,因此很难在此处发现此特定错误。使用-tt command line switch运行Python以在混合制表符和空格使用时引发异常。

您需要将编辑器配置为将标签扩展为空格,或者仅使用标签。不要混合这两种风格。 Python Style Guide强烈建议您仅使用空格:

  

空格是首选的缩进方法。

     

选项卡应仅用于与已使用选项卡缩进的代码保持一致。

许多编辑人员也可以明确显示标签。在Sublime Text中,当您选择文本时,空格显示为灰色点,选项卡显示为一行:

Sublime Text editor with code from OP selected; the tab on the return line is visible as a line, spaces are shown as subtle grey dots

答案 1 :(得分:7)

我100%确定第二个函数中的return totalprint处于同一级别(精确缩进)。可能你使用混合空格字符(制表符或空格)。

答案 2 :(得分:0)

添加到其他人的诊断,对于一个新的Python程序员,我建议显而易见,并建议他们使用IDLE来开发他们的应用程序。它应该与你的解释器捆绑在一起,它开箱即用,自动标签扩展到空格,以及其他有用的Python开发功能,如if / for / def / class等语句之后的自动缩进,多-line indenting和unindenting(ctrl [/]),并使用F5快速启动程序。使用它可能比配置另一个文本编辑器来识别Python习语更容易,并且比记事本或REPL更容易使用。

我还建议当你从命令行运行脚本时,使用python -tt选项,如下所示:

C:\file\python -tt myscript.py

此选项扫描代码以混合选项卡和空格,并在遇到异常时引发异常。请注意,这是Python 3中的强制功能,因此使用此选项可以帮助您在将来验证代码。