Python中的else和elif语句不起作用

21

我是Python的新手,目前正在学习控制流命令,例如ifelse等。

if语句运行得很好,但当我编写elseelif命令时,解释器会给出语法错误。我正在使用Python 3.2.1,并且在其本地解释器和IDLE中都出现了问题。

我按照书籍'A Byte Of Python'中所述进行操作。如您所见,elifelse均出现“无效语法”。

>> number=23
>> guess = input('Enter a number : ')
>> if guess == number:
>>    print('Congratulations! You guessed it.')
>> elif guess < number:
   **( It is giving me 'Invalid Syntax')**
>> else:
   **( It is also giving me 'Invalid syntax')**
为什么会发生这种情况?我在IDLE和交互式Python中都遇到了这个问题。我希望语法是正确的。 输入图像描述

语法看起来对我来说是正确的。你是在一个交互式的Python shell中输入这个代码,还是保存在一个文件中?你能粘贴未修改的脚本或交互会话记录吗? - cdhowie
elif/else是空的吗?如果是,就添加pass到其中。 - Jacob
你能粘贴一下你的REPL会话的“实际”完整输出吗?如果你不用像“ (它给出'无效语法')”这样的东西替换真实的输出,那么别人更容易看到你的问题。 - Ben James
请注意,guess 将是 str() 类型的实例,而 number 是 int() 类型的实例。当使用除等式或不等式运算符以外的任何比较方式进行比较时,根据您使用的 Python 版本,可能会将其解释为不安全类型操作。 - Filip Dupanović
9个回答

29

看起来您正在if语句的主体后输入一个空行。这是对交互式编译器的提示,表明您已经完成了整个代码块,因此它不会期望任何elif/else代码块。请尝试按照以下方式输入代码,并且每行只在最后按一次回车:

if guess == number:
    print('Congratulations! You guessed it.')
elif guess < number:
    pass # Your code here
else:
    pass # Your code here

2
谢谢!它解决了我的问题。 :) 你们所说的内容在我的书中没有提到。 - jayantr7
3
对于这样的测试,将所有内容都写在一个文本文件中,然后使用“python mytest.py”运行它会更容易。 - Simon Bergot
@jayantr7:没问题。请注意,如果您将此输入到文件中并通过Python运行它(如Simon建议的那样),则不会出现额外换行符的问题;这是交互式解释器特有的问题。 - cdhowie
谢谢,我已经在elif语句前删除了from语句,现在它可以正常工作了。 - Mushir

3
< p > elifelse必须紧接着跟在if块的结尾,否则Python会认为这个块已经关闭了而忽略它们。

if 1:
    pass
             <--- this line must be indented at the same level as the `pass`
else:
    pass

在您的代码中,解释器在缩进结束时完成if块,因此elifelse与其无关。它们因此被理解为独立语句,这是没有意义的。
通常情况下,请遵循样式指南,其中包括删除过多的空格。

3
问题出在你在elseelif之前输入的空行。请注意提示符,如果是>>>,那么Python正在等待一个新语句的开始。如果是...,那么它正在等待你继续上一条语句。请注意这些细节,以避免错误。

2
在IDLE和交互式Python中,输入两个连续的CRLF会使您退出if语句。 这是IDLE或交互式Python的问题。当您使用任何类型的编辑器时都可以解决,只需确保您的缩进正确即可。

1
 if guess == number:
     print ("Good")
 elif guess == 2:
     print ("Bad")
 else:
     print ("Also bad")

确保您的缩进正确。语法没问题。


1
记住,默认情况下,输入的返回值将是一个字符串而不是一个整数。你不能像使用<, >, =>, <=(除非你比较长度)一样用布尔值来比较字符串。因此,你的代码应该像这样:
number = 23
guess = int(input('Enter a number: '))  # The var guess will be an integer

if guess == number:
    print('Congratulations! You guessed it.')

elif guess != number:
    print('Wrong Number')

0

此外,您的缩进有误。代码无法正常工作。 我知道您正在使用Python 3.x版本。 我正在使用Python 2.7.3版本。 实际可用于实现您所需功能的代码如下。

number = str(23)
guess =  input('Enter a number: ')
if guess == number:
   print('Congratulations! You guessed it.')
elif guess < number:
     print('Wrong Number')
elif guess < number:
     print("Wrong Number')

唯一的区别是我会告诉Python,数字是一个字符的字符串,以便代码能够正常工作。否则它会认为这是一个整数。当有人运行代码时,他们输入的是一个字符串而不是一个整数。有很多改变这个代码的方法,但这是我想提供的简单解决方案,还有另一种方法,我无法想到除了将23转换成字符串。或者你可以用引号把"23"括起来,或者你可以在输入中使用int()函数。那样就可以把任何他们输入的东西转换成整数。


0
Python可以生成相同的“无效语法”错误,即使'elif'块的缩进与'if'块的缩进不匹配。例如,第一个是制表符,第二个是空格,或者反之亦然。

0

在Python中缩进很重要。您的if else语句应该在三个箭头(>>>)内。在Mac Python IDLE版本3.7.4中,如果在下一行输入elif语句,则缩进不正确,您必须向左移动以避免语法错误。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接