我正在尝试这个
while True:
break if input() == 'q' else input()
这会导致语法错误
break if input() == 'q' else input()
^
SyntaxError: invalid syntax
我知道还有其他方法可以做到这一点,但我想知道为什么这样做不起作用。
谢谢!
答案 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
并返回其值。
因此,x
和y
应该是可以评估的东西,但是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":