在早期版本的Python中,引入了列表推导的概念来消除这两种代码模式:
# Go through each item in a list and run a test on them
# build a new list containing only items that pass the test
results = []
for item in somelist:
if sometest(item):
results.add(item)
and
# build a new list by changing every item in a list in the
# same way
results = []
for item in somelist:
results.add(2 * item)
通过添加一个新语法,包括将所有三个事物合二为一 – 更改项目和/或测试它们以仅在结果中包含一些项目,并创建结果列表:
results = [2 * item for item in somelist if sometest(item)]
# results is a list
此功能使用[]语法在Python中指示“list”,并在内存中立即构建列表.
有时候你不需要或者不需要内存中建立的整个列表,所以后来的Python版本引入了生成器表达式 – 相同的想法,但它们通过快速返回一个你可以迭代的生成器来节省内存,就像它是一个列表一样,并在您使用它时构建列表.
但它们不能具有相同的语法并且可以直接换出,因为它们的行为略有不同,因此它们使用()代替[],例如:
somelist = [1,2,3,4,5]
results = (2 * item for item in somelist if sometest(item))
# results is a generator
如果您尝试使用此函数调用函数,则会得到两层括号:
function((2 * item for item in somelist))
这看起来很傻,所以你可以留下一个:
function(2 * item for item in somelist)
这似乎是循环独立的循环,但实际上并非如此.
所以用括号你可以这样写:
>>> print (item for item in [1,2,3])
at 0x7fe31b8663c0>
哪个是你写的最接近的东西,它是Python 2.x中的有效语法,但它不能达到预期的效果,^^就是它的作用和原因.
或这个:
>>> print [item for item in [1,2,3]]
[1,2,3]
它生成一个列表并打印列表,另一个与你写的内容相近,但仍然不是你所期望的.
– (在我写这篇文章的时候,我的帖子确实没有太多意义,但是呃).