【问题标题】:Printing using list comprehension使用列表理解打印
【发布时间】:2016-05-07 03:39:02
【问题描述】:

从我的 Python 控制台

>>> numbers = [1,2,3]
>>> [print(x) for x in numbers]
1
2
3
[None, None, None]

为什么最后会打印三个无?

【问题讨论】:

  • 因为print()是python3中返回None的函数
  • Python 解释器总是打印您输入的任何表达式的值。如果您将其更改为r = [print(x) for x in numbers],您会看到r 现在包含[None, None, None]

标签: python


【解决方案1】:

您应该重组循环以将参数发送到print()

>>> numbers = [1,2,3]
>>> print(*(x for x in numbers), sep='\n')

请注意,您不需要显式生成器。只需解压list 本身:

>>> numbers = [1,2,3]
>>> print(*numbers, sep='\n')

【讨论】:

  • 这比 for 循环更快 toplevel_Search = glob("*.py") recursive_search = glob("**/*.py",recursive=True) begin = time.time() print (*toplevel_Search,sep="\n") end = time.time() print("Time taken without a loop: ", end-begin) begin = time.time() for i in toplevel_Search: print(i) end = time.time() print("Time taken with a loop: ", end-begin) 输出:: pathlibDemo.py main.py pathlibDemo_COPY.py globDemo.py Time taken without a loop: 0.00017619 pathlibDemo.py main.py pathlibDemo_COPY.py globDemo.py Time taken with a loop: 0.0001959
【解决方案2】:

列表理解不是手头工作的正确工具。它总是会返回一个列表,并且鉴于print() 的计算结果为None,列表中填充了None 值。当我们对创建值列表不感兴趣时​​,一个简单的for 循环效果更好,只对没有返回值的函数求值:

for x in numbers:
    print(x)

【讨论】:

  • 如果你想在一行中使用for x in numbers: print(x)
【解决方案3】:

[print(x) for x in numbers] 是一个没有值的列表。所以它没有返回。 您可以简单地执行以下操作:

print(*numbers)

1 2 3 或

for x in numbers:
 print(x)

1 2 3

【讨论】:

    【解决方案4】:

    print 函数返回None。列表推导将该函数应用于列表的每个元素(输出结果),但将这些 None 对象收集到结果数组中。 Python 解释器正在打印该数组。

    【讨论】:

      【解决方案5】:

      print 是 Python 3 中的一个函数,它返回一个 None。由于您调用了 3 次,因此它构造了一个包含三个 None 元素的列表。

      【讨论】:

        【解决方案6】:

        List comprehensions 总是返回 list

        基于此信息,您的 print() 语句必须包含整个列表理解参数:

        Numbers = [1, 2, 3]
        
        print([x for x in Numbers])
        

        如果你想一个一个地打印一个列表的项目,for循环更适合这件事。

        【讨论】:

          【解决方案7】:

          使用列表组合打印的 3 种方法:

          1. 在外面打印

          print([(i) or i for i in range(4)])

          1. 创建函数

          def printVal(val): 打印(“验证:”,验证) 返回值

          [printVal(i) or i for i in range(4)]

          1. 使用“或”

          [print(i) or i for i in range(4)]

          【讨论】:

            【解决方案8】:

            应该明确指出,您不需要使用列表推导来实现使用内联 for 循环打印列表值的目标。 TigerhawkT3 的回答中已经提到了替代方案。

            【讨论】:

              【解决方案9】:

              print是一个函数,就像

              >>>def f(x):
              ...:   pass
              >>>[f(x) for x in numbers]
              

              【讨论】:

                【解决方案10】:

                这样做的丑陋方式是_=[print(i) for i in somelist] 它确实有效,但不被鼓励:)

                【讨论】:

                  【解决方案11】:

                  如果 Print 函数的这种行为困扰,我建议你不要在列表推导中使用 Print 函数,只需使用以下简洁且更 Pythonic 的单行:

                  >>> [x for x in [1,2,3]]
                  [1, 2, 3]
                  

                  【讨论】:

                    【解决方案12】:

                    您可以使用 String Join() 方法并打印字符串。例如:

                    >>> print('\n'.join(numbers))
                    1
                    2
                    3
                    >>> print(', '.join(numbers))
                    1, 2, 3
                    >>> print(',\n'.join(numbers))
                    1,
                    2,
                    3
                    

                    【讨论】:

                      【解决方案13】:

                      为了完整起见,* 运算符也可以与 f-Strings 结合使用

                      print(*(f'this is {x}' for x in [1,2,3]), sep='\n')
                      
                      this is 1
                      this is 2
                      this is 3
                      

                      【讨论】:

                        【解决方案14】:

                        您会得到一个 None 值列表,因为 print 函数返回 None 并且列表解析使用表达式的值,而不是打印的值。

                        但是,您可以使用下面的代码(谨慎)在列表推导中获得所需的行为:

                        >>> [i for i in range(3) if print(i) or True]
                        0
                        1
                        2
                        [0, 1, 2]
                        

                        i 值在评估 if 语句时打印。这个if 保证调用print 函数并返回True,因此它不会区分列表中的值。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2018-06-04
                          • 2013-12-16
                          • 1970-01-01
                          • 2017-01-08
                          相关资源
                          最近更新 更多