[英]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()不会返回任何有用的信息,新创建的列表或生成器无关紧要,并且立即被丢弃。
这种结构会使阅读您的代码的人感到困惑/误导,当您不想构建列表时,您明确使用了“我要构建列表”格式。
这也与列表理解的原始思想及其在函数式编程中的起源背道而驰-当事情没有副作用时,就更容易进行推理了。
如果要遍历序列并打印某些内容,请显式遍历列表并进行打印( 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.