有时我喜欢滥用python语法,特别是使用短if
块:
if True : print 'Hello'
else : print 'Bye'
现在我尝试用函数定义做同样的事情:
if True : def a(): return 'a'
else : def a(): return 'b'
print a()
但令人惊讶的是我无法做到这一点:
File "xxx.py", line 1
if True : def a(): return 'a'
^
SyntaxError: invalid syntax
以下(相当于我,但不是python)版本很好:
if True :
def a(): return 'a'
else :
def a(): return 'b'
print a()
为什么呢?似乎有一条规则可以在if
语句中加入内联。 if-colon之后可能没有冒号吗?这条规则在哪里指定?或许我打破了更普遍的规则?哪一个?
答案 0 :(得分:2)
您可以在此处if
if
的语法
根据语法"if" expression ":" suite
允许
suite
和suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
定义为
stmt_list
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
定义为
statement
stmt_list NEWLINE | compound_stmt
定义为
compound_stmt
compound_stmt ::= if_stmt
| while_stmt
| for_stmt
| try_stmt
| with_stmt
| funcdef
| classdef
| decorated
定义为
funcdef
我们发现compound_stmt
是if
之一。因此,在def
条件下,如果我们必须定义一个函数,NEWLINE
必须在此之前有INDENT
和def a():
return "a" if True else "b"
。这就是为什么你所尝试的无效。
但这又好又简单呢
{{1}}
答案 1 :(得分:2)
语法规则在此处定义:http://docs.python.org/2.7/reference/compound_stmts.html
请注意,虽然技术上合法,但同一行上的多个语句被视为不良风格(参见pep08)。
答案 2 :(得分:1)
它给你一个错误,因为它现在被语法所允许。以下只是语法的相关部分。
if_stmt ::= "if" expression ":" suite
suite ::= stmt_list NEWLINE
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
simple_stmt ::= expression_stmt
| assert_stmt
| assignment_stmt
| augmented_assignment_stmt
| pass_stmt
| del_stmt
| print_stmt
| return_stmt
| yield_stmt
| raise_stmt
| break_stmt
| continue_stmt
| import_stmt
| global_stmt
| exec_stmt
如果您从上面的定义中看到,则没有“funcdef”,其定义如下:
funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite
Python的语法很漂亮,为什么要试着让它变丑,只是为了节省一些线条? :)
答案 3 :(得分:1)
一般情况下,您不能在内联而不是套件的语句中启动套件。
例如
if 1: 2
有效,但
if 1: if 2: 3
无效。
除非极其简单的情况,否则不要在同一行上使用代码。
目标是更易于阅读的代码,而不是更短的代码。