我正在尝试这个
while True:
break if input() == 'q' else input()
这会导致语法错误。
break if input() == 'q' else input()
^
SyntaxError: invalid syntax
我知道有其他方法可以做到这一点,但我想知道为什么这种方法不起作用。
谢谢!
我正在尝试这个
while True:
break if input() == 'q' else input()
break if input() == 'q' else input()
^
SyntaxError: invalid syntax
我知道有其他方法可以做到这一点,但我想知道为什么这种方法不起作用。
谢谢!
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 ::= 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
并返回其值。x
和y
应该是可以被评估的内容,但是break
是控制流语句,无法被评估。条件表达式应该与表达式一起使用,而不是与语句一起使用。
此外,代码对于非q
输入调用了两次input
。这是你的意思吗?
while True:
in_ = input()
if in_ == 'q':
break
# Do something with in_
break
。 - Kidusbreak
不是表达式,而是语句。 - falsetru<something> if <condition> else <other thing>
的东西是一个表达式,它会计算出某个特定的值,也就是说,可以将其分配给变量。这个想法不是把逻辑放在 <something>
和 <other thing>
中。你必须坚持使用更传统的方法:while True:
if input() == 'q':
break
"q"
,你可以使用iter
:for x in iter(input,"q"):
print (x)
或者只是:
while input() != "q":