0

查看 wwii 给出的答案时,我评论了他的缩进说这是错误的。但是,在我的 IDLE 中运行他的代码后,我发现它运行顺利。

我尝试了一些示例,以确保得到正确的结果:

>>> def foo():
    return 0

>>> foo()
0
>>> def bar():
    return foo() + 5

>>> bar()
5
>>> def foobar():
    return foo() + bar()

>>> foobar()
5
>>> 

如您所见,它们都运行良好。如果我在常规脚本中尝试相同的操作,Python 甚至会在我的程序运行之前引发错误,告诉我我忘记缩进一个块:

在此处输入图像描述

为什么在交互式 IDLE 中允许这种缩进,而在常规脚本中却不允许?我查看了 IDLE 的文档,更具体地说是第25.5.2.1 Automatic indentation部分,这对找到答案没有帮助。

此外,函数的 Python 文档指出函数体必须缩进:

关键字 def 引入了一个函数定义。它后面必须跟函数名和带括号的形式参数列表。构成函数主体的语句从下一行开始,并且必须缩进

(强调我的)

为什么在IDLE中允许这种缩进,而在正则脚本中却完全关闭?这是故意的吗?如果是这样,这种行为是否记录在某处?

4

3 回答 3

2

代码是正确的,但 IDLE REPL 不像 Python:

>>> def foo():
    return 0

IDLE 打印出来,而 Python:

>>> def foo():
...     return 0

看到 return 之前的四个空格在那里,但是由于它们与最左边的列对齐,而不是以三个点和一个空格为前缀,如果您希望代码缩进更多,空格似乎不存在。

于 2016-12-03T04:50:55.443 回答
1

您在 IDLE 中有正确的缩进,而在您的脚本中有错误。

在 IDLE 之前有 4 个空格return 0。在你的脚本中没有。

你的脚本应该是这样的:

def foo():
    return 0

def bar():
    return foo() + 5

def foobar():
    return foo() + bar()

print(foo())
print(bar())
print(foobar())

回答“为什么 IDLE 缩进是正确的?”

它使用该>>>标记作为下一个命令输入的开始。这是标准方法。它(变体)无处不在。

>>> <-start of the line. Zero spaces.
<-start of the line. Zero spaces.

所以接下来的代码会有错误的缩进:

>>> def foo():
return 0

因为它相当于脚本文件中编写的下一个代码:

def foo():
return 0

>>> <-start of the line. Zero spaces.
    <-start of the block. Indent 4 spaces.

所以下一个代码将有正确的缩进:

>>> def foo():
    return 0

因为它相当于脚本文件中编写的下一个代码:

def foo():
    return 0
于 2016-12-03T04:54:12.263 回答
1

您在 IDLE 中看到的>>>只是一个提示。这个提示恰好有四个字符长,而您的代码也恰好用四个空格缩进,这完全是巧合。

要查看和思考代码的实际工作原理,让我们删除所有>>>提示。为清楚起见,我们也会删除打印的结果。

现在它看起来像完全正常的 Python 代码:

def foo():
    return 0

foo()

def bar():
    return foo() + 5

bar()

def foobar():
    return foo() + bar()

foobar()

所以 IDLE 与任何其他 Python 解释器没有什么不同,只是它把>>>提示放在第一行的方式只是让它变得混乱。如果您考虑删除这四个字符后代码的外观,这一切都会更有意义。

于 2016-12-03T05:04:38.483 回答