为什么打印不能与python 2/3中的同一行使用?

时间:2015-12-30 20:18:00

标签: python

我很想实现以下内容:

print(i) for i in xrange(10)

但是,这在python2和python3中都不起作用。这种语言有什么限制?或者我做错了什么?

4 个答案:

答案 0 :(得分:3)

像这样:

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

你也可以这样做,但只在Python 3中print是一个函数。但这是滥用生成器表达式。

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

答案 1 :(得分:1)

Set builder notation(在Python中称为生成器表达式)仅在构建集合时有效。您使用的表示法是设置构建器表示法(生成器表达式)(类似{{1 }})。话虽这么说,你可以使用常规的循环

x for x in range(10) if ...

或设置构建器表示法构建一个空集:

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

该集合具有所有无值的原因是因为您永远不会添加到集合中,而只会打印出来。

答案 2 :(得分:1)

表单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 Enhancement Proposal 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()不返回任何有用的内容,新建的列表或生成器无关紧要并立即丢弃。

这种结构让读取代码的人感到困惑/误导,当你不想建立一个列表时,你明确地使用了“我想建立一个列表”格式。

它也反对列表理解的原始概念及其在函数式编程中的起源 - 当它们没有副作用时,更容易推理出事物。

来自Zen of Python

  • 明确胜于隐性。

如果要迭代序列并打印某些内容,请显式迭代列表并打印它(for item in sequence: print(item))。不要以“我要建立一个新的清单,哦,我偷偷打印出一些副作用,然后扔掉清单”开头。

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

更难解释 - 这段代码有什么作用? “它构建了一个新的None列表,它是打印列表项的返回值”。这将把重点放在所有错误的地方。

答案 3 :(得分:0)

你的尝试在语法上是不正确的但你可以使用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))))