【问题标题】:Run multiline for loop in a single line在单行中运行多行 for 循环
【发布时间】:2015-06-04 12:25:34
【问题描述】:
>>> query='';for var in xrange(9):\n\tquery+=str(var)
  File "<stdin>", line 1
    query='';for var in xrange(9):\n\tquery+=str(var)
               ^
SyntaxError: invalid syntax


>>> query='';for var in xrange(9): query+=str(var)
  File "<stdin>", line 1
    query='';for var in xrange(9): query+=str(var)
               ^
SyntaxError: invalid syntax

为什么上面的代码不起作用?但以下工作

>>> query=""
>>> for var in xrange(9): query+=str(var)
... 
>>> query
'012345678'
>>> 

【问题讨论】:

  • 你为什么要把 for 和 query='' 放在同一行?这不是 C。Python 不使用分号,您应该使用空格来分隔命令,而不是将它们全部塞到一行中。
  • @JosephGagliardo:实际情况是另一回事。这只是一个例子
  • 我不明白你的评论。您提供的代码无法编译,因为它不是有效的 Python 语法。不要尝试将 query = '' 放在同一行,将其放在自己的行上就可以了。
  • 这远非“好的” Pythonic 代码,你想做什么?
  • 下一个问题:你为什么execing 来自外部文件的代码?

标签: python python-2.7 multiline


【解决方案1】:

; 只允许组合“小语句”。这些是表达式,打印等。另一方面,for 循环是复合语句。见Full Grammar Specification

simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
small_stmt: (expr_stmt | print_stmt  | del_stmt | pass_stmt | flow_stmt |
             import_stmt | global_stmt | exec_stmt | assert_stmt)
...
compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated

在您的示例中,如果这不仅仅是为了说明您的问题,您可以将其重写为

query = ''.join(str(var) for var in xrange(9))

或者如果你真的真的需要exec那个多行语句,你可以在赋值和for循环之间添加一个\n(就像你已经在另一个地方所做的那样):

>>> exec("query=''\nfor var in xrange(9):\n\tquery+=str(var)\nprint query")
012345678

但请注意,这仅在 exec 中有效,不能直接在交互式 shell 中:

>>> query=''\nfor var in xrange(9):\n\tquery+=str(var)\nprint query
SyntaxError: unexpected character after line continuation character

【讨论】:

    【解决方案2】:

    也许你想要一个生成器表达式:

    >>> query  = "".join(str(var) for var in xrange(9))
    >>> query
    '012345678'
    

    【讨论】:

      【解决方案3】:

      for 语句是复合语句,根据定义不能跟在分号之后

      引用python文档

      Compound statements

      复合语句由一个或多个“子句”组成。一个子句由一个标题和一个“套​​件”组成。特定复合语句的子句标题都处于相同的缩进级别。每个子句标题都以唯一标识关键字开头,并以冒号结尾。套件是由子句控制的一组语句。 一个套件可以是一个或多个分号分隔的简单语句,与标题在同一行,在标题的冒号之后,或者它可以是一个或多个在后续行中缩进的语句。只有后一种形式的套件可以包含嵌套复合语句;以下是非法的,主要是因为不清楚后面的 else 子句属于哪个 if 子句:

      碰巧for语句是Python中的复合语句

      compound_stmt ::=  if_stmt
                          | while_stmt
                          | for_stmt
                          | try_stmt
                          | with_stmt
                          | funcdef
                          | classdef
                          | decorated
      

      所以它不能跟在分号后面

      【讨论】:

      • 那么解决方法是什么?我怎样才能使这个 for 循环工作?
      【解决方案4】:

      绝大多数 Python 程序员只使用换行符来分隔语句,我怀疑大多数人甚至不知道分号是一种可能性。

      而且(正如 Abhijit 所说)该功能是有限的:它仅适用于变量赋值和函数调用等简单语句,不适用于“if”、“for”、“while”等控制语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-04
        • 2016-11-14
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多