【问题标题】:List Comprehension: why is this a syntax error?列表理解:为什么这是一个语法错误?
【发布时间】:2011-01-09 14:40:08
【问题描述】:

为什么print(x) 在下面的列表理解中无效(SyntaxError)?

my_list=[1,2,3]
[print(my_item) for my_item in my_list]

相比之下,以下内容不会出现语法错误:

def my_func(x):
    print(x)
[my_func(my_item) for my_item in my_list]

【问题讨论】:

    标签: python list-comprehension python-2.6


    【解决方案1】:

    因为 print 不是一个函数,它是一个语句,你不能在表达式中使用它们。如果您使用普通的 Python 2 语法,这会变得更加明显:

    my_list=[1,2,3]
    [print my_item for my_item in my_list]
    

    看起来不太对劲。 :) my_item 周围的括号会欺骗您。

    这在 Python 3 中发生了变化,顺便说一句,其中 print 一个函数,您的代码可以正常工作。

    【讨论】:

    • 您可以从未来导入此功能:from __future__ import print_function
    • @THC4k - 我同意,这将确保代码可以在 2.6 和 3.0 中编译
    • 对,因为它特别提到了2.6,这是一个好点。
    • FWIW,在 2.7 和使用未来的导入上面的代码对我不起作用。 a) 我需要使用大括号语法,print(x) 以避免语法错误消息,b) 它在打印列表项后发出一个尾随列表:gist.github.com/maphew/67c88807bf97bf67fbf9
    • @mattwilkie:看看你的要点,这是预期的输出。 a) 因为print 现在是一个函数,你需要使用大括号语法,b) 你返回一个Nones 的列表,因为print 没有返回任何东西。
    【解决方案2】:

    列表推导旨在创建一个列表。因此,无论我们在 2.7 或 3.x 中使用 print() 还是 print,在其中使用 print 都会出错。代码

    [my_item for my_item in my_list] 
    

    创建一个列表类型的新对象。

    print [my_item for my_item in my_list]
    

    将这个新列表作为一个整体打印出来

    参考:here

    【讨论】:

    • “不管我们在 2.7 或 3.x 中使用 print() 还是 print” 这仅适用于 python 2.x,不适用于 python 3.x。 [print(char) for char in "abc"] 在 python 3.x 中有效(但不鼓励)
    【解决方案3】:

    这是一个语法错误,因为print 不是函数。这是一个声明。既然你显然不关心来自print 的返回值(因为它没有),那么只需编写正常循环:

    for my_item in my_list:
        print my_item
    

    【讨论】:

      【解决方案4】:

      python 3 中的 print 使得如何使用它更加明显。

      列表理解中的方括号表示输出实际上是一个列表。 L1=['a','ab','abc'] print([item for item in L1]) 这应该可以解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多