繁体   English   中英

为什么在python 2/3的同一行上不能使用for打印?

[英]Why print cannot be used with for on the same line in python 2/3?

我很想实现以下目标:

print(i) for i in xrange(10)

但是,这在python2和python3中都不起作用。 语言的局限性是什么? 还是我做错了什么?

像这样:

for i in xrange(10): print(i)

您也可以执行类似的操作,但只能在Python 3中使用print作为函数。 但是,这是对生成器表达式的滥用。

any(print(i) for i in range(10))

集构建器符号 (在Python中称为生成器表达式)仅在构建集时起作用。 您使用的表示法是set builder表示法(生成器表达式)(类似于x for x in range(10) if ... )。 话虽如此,您可以使用常规的for循环

for i in xrange(10):
    print(i)

或构建空集的集构建器符号:

>>> x = [print(i) for i in xrange(10)]
0
1
2
3
4
5
6
7
8
9
>>> x
[None, None, None, None, None, None, None, None, None, None]
>>> 

集合具有所有none值的原因是因为您从不添加到集合,而仅打印出东西。

x for x in <sequence>形式旨在产生一个列表。 原来是这样的:

>>> [i for i in range(10)] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

在Python 2.0中引入的Python增强建议202 ,来自对map()和filter()的用法变化。 这些功能和列表理解源于功能编程环境,该环境倾向于无副作用和无意外状态变化等。

在列表推导支持函数调用的情况下,它打算用于这种简单的转换:

>>> [math.sin(x) for x in whatever]
[0.1, 0.2, ...]

该功能旨在将一个列表项更改为新的列表项-输出仍然是列表。

几年后, PEP289中这种语法丢失了方括号[ ] ,因为它们在Python 2.4中变得对内存效率更高的Generator Comprehensions。 它们用于不需要完整列表作为列表的情况,因为您一获得所有内容就立即对其进行处理-例如sum(i for i in range(10))可以将所有数字加起来为它们出现,而无需等待整个序列先完成计算。

您要使用它的方式- print(x) for x in <sequence>采用生成器理解的形式,但是您不希望生成器,列表和序列。 您只希望这样做,以免在调用该函数时发生副作用。

这并非不可能,您可以在Python 2中执行此操作

import sys
[sys.stdout.write(str(i) + '\n') for i in range(10)]

正如@wim在注释中指出的那样,这在Python 3中:

[print(i) for i in range(10)]

但是,print()不会返回任何有用的信息,新创建的列表或生成器无关紧要,并且立即被丢弃。

这种结构会使阅读您的代码的人感到困惑/误导,当您不想构建列表时,您明确使用了“我要构建列表”格式。

这也与列表理解的原始思想及其在函数式编程中的起源背道而驰-当事情没有副作用时,就更容易进行推理了。

Python禅宗

  • 显式胜于隐式。

如果要遍历序列并打印某些内容,请显式遍历列表并进行打印( for item in sequence: print(item) )。 不要以“我要建立一个新列表,哦,我偷偷地打印一些东西作为副作用,然后将列表扔掉”开头。

很难读懂您的意图-您是要这样做吗? 您想要它做什么?

很难解释-此代码是做什么的? “它建立了一个None的新列表,这些列表是打印列表项的返回值”。 这就是所有错误地方发生的事情的重点。

您的尝试在语法上是不正确的,但是您实际上可以使用print作为函数在一行中完成它,而无需显式的for循环:

print(*range(10), sep="\n")

等效于:

 for i in range(10):
    print(i)

并输出:

In [32]: print(*range(10),sep="\n")
0
1
2
3
4
5
6
7
8
9
In [2]: print(*range(10))
0 1 2 3 4 5 6 7 8 9

在python2中,您只需要导入print_function

from __future__ import print_function

In [3]: print(*xrange(10),sep="\n")
0
1
2
3
4
5
6
7
8
In [4]: print(*xrange(10))
0 1 2 3 4 5 6 7 8 9

或使用str.join

print("\n".join(map(str,range(10))))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM