这是一个python语法问题。
为什么无法在python中一行运行if test: for list: one-statement
?例如:
a=1
b=[1, 2]
if a: for x in b: print(x)
File "<ipython-input-52-8abcd450fc7a>", line 3
if a: for x in b: print(x)
^
SyntaxError: invalid syntax
我知道,如果要紧跟2条以上的语句,那么缩进是一个问题,但是一条语句不会产生歧义。我错了吗?
拆分单线工作,因为它消除了歧义:
a=1
b=[1, 2]
if a:
for x in b: print(x)
1
2
看the python grammar,我们有:
if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt |
import_stmt | global_stmt | nonlocal_stmt | assert_stmt)
以下对if_stmt
的更改是否会允许在一行中包含这样的简单嵌套语句?
simple_for_stmt: 'for' exprlist 'in' testlist ':' simple_stmt
if_stmt: 'if' test ':' (suite ('elif' test ':' suite)* ['else' ':' suite] | simple_for_stmt)
^ ^^^^^^^^^^^^^^^^^^
除了更改if_stmt
外,我还定义了一个新令牌simple_for_stmt
。
当然,这仅适用于for
语句,但是可以针对while
和其他语句进行调整。
我当然理解,也许保持简单是python领域中的最佳方法-添加该死的新行!
注意:这不是一个帮助我制作我的代码的问题。该代码示例仅用于说明问题,无需修复/改进。因此,请避免提出如何以其他方式重写示例代码的建议。谢谢。
我正在使用python 3.6.6。
答案 0 :(得分:1)
我认为您提出的解决方案暗示了从未实施的原因。所做的更改会使语法增加很多复杂性,而带来的实际好处却很小。可以将一些简单的语句放在同一行中,但是此更改将产生许多令人困惑的边缘情况。
Python docs明确地说
if test1: if test2: print(x)
必须是非法的,因为尚不清楚后面if
子句属于哪个else
。 (显然,可以执行任意决定,但这仍然会使代码阅读者感到困惑。)此参数也适用于for
语句(和其他复合语句),因为在Python中,for
语句也可以有一个else
子句。
答案 1 :(得分:0)
问题不是if语句,而是for语句。 您想做的事情可以做如下
a = True
b = [1,2,3]
if a: [print(x) for x in b]