在循环中使用break if循环中的语句会导致语法错误

时间:2014-10-03 11:29:52

标签: python python-3.x

我正在尝试这个

while True:
    break if input() == 'q' else input()

这会导致语法错误

    break if input() == 'q' else input()
           ^
SyntaxError: invalid syntax

我知道还有其他方法可以做到这一点,但我想知道为什么这样做不起作用。

谢谢!

5 个答案:

答案 0 :(得分:3)

这称为条件表达式,Grammer for this定义为this

conditional_expression ::=  or_test ["if" or_test "else" expression]

or_test定义如下

or_test  ::=  and_test | or_test "or" and_test

and_test定义如下

and_test ::=  not_test | and_test "and" not_test

not_test定义如下

not_test ::=  comparison | "not" not_test

comparison定义如下

comparison    ::=  or_expr ( comp_operator or_expr )*

comp_operator定义如下

comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="
                   | "is" ["not"] | ["not"] "in"

or_expr定义如下

or_expr  ::=  xor_expr | or_expr "|" xor_expr

xor_expr定义如下

xor_expr ::=  and_expr | xor_expr "^" and_expr

and_expr定义如下

and_expr ::=  shift_expr | and_expr "&" shift_expr

shift_expr定义如下

shift_expr ::=  a_expr | shift_expr ( "<<" | ">>" ) a_expr

a_expr定义如下

a_expr ::=  m_expr | a_expr "+" m_expr | a_expr "-" m_expr

m_expr定义如下

m_expr ::=  u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr
            | m_expr "%" u_expr

u_expr定义如下

u_expr ::=  power | "-" u_expr | "+" u_expr | "~" u_expr

power定义如下

power ::=  primary ["**" u_expr]

primary定义如下

primary ::=  atom | attributeref | subscription | slicing | call

语法中不允许break语句,这就是编译时错误失败的原因。

从文档引用,

  

表达式x if C else y首先评估条件C而不是x。如果C为真,则计算x并返回其值;否则,将评估y并返回其值。

因此,xy应该是可以评估的东西,但是break是一个无法评估的控制流语句。

答案 1 :(得分:1)

Conditional expression应该与表达式一起使用,而不是与语句一起使用。

并且,代码会针对非input输入调用q两次。那是你的意思吗?

while True:
    in_ = input()
    if in_ == 'q':
        break
    # Do something with in_

答案 2 :(得分:1)

这种语法不能像那样使用。整个<something> if <condition> else <other thing>事物是一个表达式,它评估某个特定值,即可赋值给变量的东西。我们的想法不是将逻辑放在<something><other thing>中。你将不得不坚持使用更传统的东西:

while True:
  if input() == 'q':
    break

答案 3 :(得分:1)

内联if语句 - 也称为conditional assignment - 是python等同于其他语言的tenary运算符。因此,它用于根据表达式的布尔值为变量赋值,例如:

greeting = 'Mrs.' if person.female else 'Mr.'

显然,两个可能的值实际上必须是值。这适用于所有文字(1,&#39;字符串&#39;,...),变量和函数调用,但不适用于break等语句。

我希望这解释了为什么这是一个语法错误。

答案 4 :(得分:0)

如果您想在用户输入"q"之前继续接受输入,则可以使用iter

for x in iter(input,"q"):
    print (x)

或者只是:

while input() != "q":