Python 函数中的缩进未按预期工作

Python 函数中的缩进未按预期工作,python,python-2.7,Python,Python 2.7,我发现了一些对我来说毫无意义的东西。我希望有人能解释一下 def test(word): total = 0 for l in word: print l test('python') 结果是“p y t h o n”(每个字母都显示在自己的行上) 结果就是‘p’ 为什么添加return语句会产生这种效果?两个代码块不应该做同样的事情吗?这是否意味着它只经过for循环一次,然后执行return语句?我100%确定第二个函数中的return total与prin

我发现了一些对我来说毫无意义的东西。我希望有人能解释一下

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

test('python')
结果是“p y t h o n”(每个字母都显示在自己的行上)

结果就是‘p’


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

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

获得您看到的行为的唯一方法是缩进
返回total
作为
for
循环的一部分。如果编辑器中不是这样,那是因为您在
返回
行中使用了制表符:

>>> code_as_posted = '''\
... def test(word):
...     total = 0
...     for l in word:
...         print l
...     return total
... '''
>>> code_as_posted.splitlines()[-1]
'\treturn total'
看到那里的
\t
字符转义了吗?这是一个,当用Python解释时,它最多可扩展到8个空格;请参见Python参考文档中的:

首先,制表符(从左到右)替换为1到8个空格,这样替换之前(包括替换之后)的字符总数是8的倍数(这与Unix使用的规则相同)。第一个非空白字符前面的空格总数决定行的缩进

由于
返回
提前退出循环,您只能看到打印的
'p'
字符

编辑器和堆栈溢出标记实现都将选项卡显示为四个空格,因此很难在此处发现此特定错误。使用运行Python以在混合选项卡和空格上引发异常

您需要将编辑器配置为将选项卡扩展到空间,或专门使用选项卡。不要把这两种风格混在一起。强烈建议您仅使用空格:

空格是首选的缩进方法

制表符应仅用于与已缩进制表符的代码保持一致

许多编辑器还可以使选项卡显式可见。在“升华文字”中,选择文字时,空格显示为暗点,制表符显示为线:


再加上其他人的诊断,对于一个新的Python程序员,我建议他们使用IDLE来开发他们的应用程序。它应该与您的解释器捆绑在一起,它具有自动选项卡扩展到空格的功能,以及其他有用的Python开发功能,如if/for/def/class等语句后的自动缩进、多行缩进和取消缩进(ctrl[/]),以及使用F5快速启动程序。使用它可能比配置另一个文本编辑器来识别Python习惯用法更容易,而且肯定比记事本或REPL更容易使用

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

C:\file\python -tt myscript.py

此选项扫描代码中是否混合了制表符和空格,如果遇到异常,将引发异常。请注意,这是Python 3中的一项强制性功能,因此使用此选项可以帮助您将来验证代码。

总变量中没有值的增量。您确定您的
return
没有像
print l
那样缩进吗?return语句不应影响此处的代码。我无法重现这个问题。你确定没有其他东西阻止打印字符吗?是的。你是对的。非常感谢你。我花了一个小时才把它贴出来。很抱歉打扰你是的。你是对的。非常感谢你。我花了一个小时才把它贴出来。很抱歉打扰您“通常的建议是,使用
-tt
运行Python以在混合制表符和空格使用时引发异常,但也没有抓住这个特定示例。”-您确定吗
-tt
在我尝试时发现问题。@user2357112:hrm,不确定我的测试出了什么问题;我现在重新测试时确实报告了。压痕没有混合,那一行上没有空格<代码>-tt未捕获此案例。如果您将
print l
替换为`print(l),您会注意到所发布的代码在Python3中运行良好。
IDLE
工作正常,是一个不错的第一个编辑器,但它也有它的怪癖和问题。例如,尝试打印一个非常大的字符串。BeautifulSoup和unicode(无限递归)存在问题,Tkinter GUI非常笨重。我不推荐这么高。
C:\file\python -tt myscript.py