【问题标题】:Syntax error when defining a function on the Python command line在 Python 命令行上定义函数时出现语法错误
【发布时间】:2018-12-06 22:18:54
【问题描述】:

我正在尝试在 Python REPL 上定义一个函数。每次我尝试运行以下代码时,都会出现语法错误。

代码:

def hello():
    print ("Hello!")
hello()

错误:

C:\Users\~\Desktop>python
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> def hello():
...     print ("Hello!")
... hello()
  File "<stdin>", line 3
    hello()
        ^
SyntaxError: invalid syntax

我在 stackoverflow 上遇到的一个可能的解释是这篇文章 Python Error : File "<stdin>",它说我无法从 Python 解释器运行脚本。如果这是真的,为什么会这样? IE。如果我能够在 cmd 窗口中运行 >>>2+2,为什么我无法运行“def”函数?希望在这一点上寻求澄清 - 谢谢!

编辑:将错误放在文本中,而不仅仅是图片。

【问题讨论】:

  • 在您的图片中,当您尝试调用它时,您仍在定义hello 函数...
  • 另外,避免发布代码图片
  • 您最好将错误以文本形式发布。外部托管的图像可能会变得不可用,因此未来的 SO 用户可能会不清楚您的问题。
  • 在函数定义和调用函数之间留一条线。我不确定它为什么需要它,但它确实需要。
  • 原因是这样的:Python解释器无法预知你接下来要输入什么以及下一行是否缩进,所以它需要一些东西来告诉你缩进的块已经结束,这是一个空线;在 Python 脚本中,不需要这样的空行,因为下一行是否是预定的......

标签: python python-3.x cmd windows-10 syntax-error


【解决方案1】:

你应该在定义函数和调用它之间添加一个换行符:

def hello():
    print ("Hello!")

hello()

【讨论】:

  • 谢谢!你知道为什么在 cmd 上执行此操作需要在定义函数后额外添加一行吗?
  • 这是解释器特性:当你定义函数时,它与函数调用的行有关,因为它没有缩进(因为它认为函数没有结束)
【解决方案2】:

看起来您已将整个块作为单个语句输入。进入后需要回车:

def hello():
    print ("Hello!")

以便解释器理解这是您输入的单个定义。定义好之后,尝试运行hello() 函数。

【讨论】:

    【解决方案3】:

    定义函数后按一次回车(即输入一个空行)。从本质上讲,这让 Python 知道您已经完成了函数的定义。

    一旦你再次看到&gt;&gt;&gt;,你就可以调用你的函数了。

    查看图片,了解正确操作后的外观:

    【讨论】:

    • 成功了!太感谢了!出于兴趣,您知道为什么在 cmd 上执行此操作需要在定义函数后额外添加一行吗?
    • “基本上,这让 Python 知道你已经完成了函数的定义。”如果您没有多余的行,Python 会假定您仍在编写函数的一部分。
    • @user10002593 行首的... 表示Python 仍然认为你在功能块内。毕竟,你可以在print 之后的函数中有更多行。输入一个空行让 Python 知道你的功能块是完整的。
    • 啊,好吧,我不知道。非常感谢 Rishav + Farhan,这完全回答了我的问题。如果我有更多的声誉,我会投票给你们!
    【解决方案4】:

    如果您想了解为什么会发生这种情况,而不是仅仅学习一种出于某种神秘原因而有效的解决方法:

    交互模式通过一次读取、编译和执行一条语句来工作。这是一条非常简单的规则——除了在 C 代码中实现它非常简单之外,在你的脑海中进行操作也非常简单——一旦你理解了它,就是这样。如果要在易于解释、记录和在脑海中完成的实现与更复杂但有时更易于使用的实现之间进行选择,Python 通常会选择前者。


    如果你输入一个简单的单行语句,那很简单:该行是一个完整的语句,所以它只是编译并执行该行。

    但是如果你输入复合语句的第一行——行尾有一个:,然后是一个缩进块——直到你写一个缩进块然后再次取消缩进,语句才会完成.因此,它会打印出特殊的 ... 提示符而不是 &gt;&gt;&gt;,让您知道它会继续读取相同的语句,并一直持续到您取消缩进为止。

    如果你通过输入一个空行来取消缩进,那么语句就完成了,所以它会编译并执行它,一切都很好。

    如果您通过键入新的单行语句来取消缩进,现在它有两个语句。如果它尝试将其编译并作为单个语句运行,则会失败。

    顺便说一句,这里的def 没有什么神奇之处;任何复合语句都会发生同样的事情:

    >>> for i in range(10):
    ...     print(i)
    ... print('Done')
    

    你会得到相同的SyntaxError


    难道 Python 不能弄清楚你给了它两个语句,然后一个接一个地编译和运行它们吗?是的。事实上,如果您使用 IPython/Jupyter,它实际上就是这样做的。但这会使规则变得更加复杂——更不用说在第一条语句中处理异常之类的事情了。 Python 选择了您可以在脑海中追溯的简单规则,而不是此处的复杂规则,即使复杂规则会更频繁地执行您想要的操作。


    那么,这在模块文件中是如何工作的?好吧,模块不是一次编译一个语句,它们是一次编译的,作为一个语句列表,然后一次运行。这显然不适用于交互式终端,因为它在编译所有内容之前无法运行任何内容,并且在退出时间之前它没有所有内容。


    最后一件事:为什么连续表达式有效?

    >>> (1 +
    ...  2)
    3
    

    表达式不关心缩进。它们在所有的括号/括号/大括号在一行的末尾平衡时结束,而不是在下一行未缩进时结束。所以,只要你输入那个2),它就知道输入完成了,就可以编译了。

    反斜杠延续也是如此:

    >>> 1 + \
    ...     2
    3
    

    不需要不缩进的行;只要您键入 2 而没有反斜杠继续,输入就完成了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多