我很想实现以下内容:
print(i) for i in xrange(10)
但是,这在python2和python3中都不起作用。这种语言有什么限制?或者我做错了什么?
答案 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()不返回任何有用的内容,新建的列表或生成器无关紧要并立即丢弃。
这种结构让读取代码的人感到困惑/误导,当你不想建立一个列表时,你明确地使用了“我想建立一个列表”格式。
它也反对列表理解的原始概念及其在函数式编程中的起源 - 当它们没有副作用时,更容易推理出事物。
如果要迭代序列并打印某些内容,请显式迭代列表并打印它(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))))