【问题标题】:Indentation in function does not work as expected [duplicate]功能中的缩进不能按预期工作[重复]
【发布时间】:2015-03-17 06:26:34
【问题描述】:

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

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

test('python')

结果是 'p y t h o n'(每个字母出现在自己的行上)。

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

test('python')

结果只是'p'。

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

【问题讨论】:

  • 总变量的值没有增加。
  • 您确定您的return 不像您的print l 那样缩进吗?
  • return 语句应该不会影响这里的代码。我无法重现该问题。你确定没有其他东西可以阻止打印字符吗?

标签: python python-2.7


【解决方案1】:

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

【讨论】:

  • 是的。你说的对。太感谢了。我在发布之前花了一个小时。很抱歉打扰您
【解决方案2】:

获得所见行为的唯一方法是缩进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,当被 P​​ython 解释时,它最多扩展为 8 个空格;请参阅 Python 参考文档中的Indentation

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

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

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

您需要将编辑器配置为将制表符扩展到空格,或仅使用制表符。不要混合两种风格。 Python Style Guide 强烈建议您只使用空格:

空格是首选的缩进方法。

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

许多编辑器还可以使选项卡显式可见。在 Sublime Text 中,当您选择文本时,空格显示为暗点,制表符显示为一条线:

【讨论】:

  • 是的。你说的对。太感谢了。我在发布之前花了一个小时。很抱歉打扰您
  • “通常的建议是,使用-tt 运行 Python 以在混合使用制表符和空格时引发异常,也没有捕捉到这个具体的例子。” - 你确定? -tt 在我尝试时发现了问题。
  • @user2357112:hrm,不知道我的测试出了什么问题;我现在重新测试时确实报告了它。
【解决方案3】:

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

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

C:\file\python -tt myscript.py

此选项扫描代码以混合制表符和空格,并在遇到异常时引发异常。请注意,这是 Python 3 中的一项强制性功能,因此使用此选项可以帮助您的代码经得起未来考验。

【讨论】:

  • 缩进未混合,该行没有空格。 -tt 没有发现这种情况。如果您将print l 替换为`print(l),您会注意到发布的代码在Python 3 中运行良好。
  • IDLE 工作并且是一个不错的第一个编辑器,但它有它的怪癖和问题。例如,尝试打印一个非常大的字符串。 BeautifulSoup 和unicode(无限递归)存在问题,并且 Tkinter GUI 非常笨拙。我不会那么强烈推荐它。
猜你喜欢
  • 1970-01-01
  • 2019-01-06
  • 2013-08-29
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2021-08-27
相关资源
最近更新 更多