Python序列语法

时间:2013-02-14 16:46:06

标签: python plugins sublimetext2 sequences

我是python的新手,正在阅读Sublime Text插件的一些代码,并且遇到了一些我不熟悉的代码。

views = [v for v in sublime.active_window().views()]

它是“[v for v”部分,我不明白。这段代码在做什么呢?

提前致谢!

2 个答案:

答案 0 :(得分:9)

这是列表理解。它相当于(但效率更高):

views = []
for v in sublime.active_window().views():
    views.append(v)

请注意,在这种情况下,他们应该刚刚使用list

views = list(sublime.active_window().views())

python2.7中引入了其他类型的理解:

设置理解:

{x for x in iterable}

和dict理解:

{k:v for k,v in iterable_that_yields_2_tuples}

因此,这是一种创建字典的低效方法,其中所有值都是1:

{k:1 for k in ("foo","bar","baz")}

最后,python还支持generator expressions(它们至少在python2.6中可用 - 我不确定它们何时被引入):

(x for x in iterable)

这类似于列表推导,但它返回一个可迭代对象。在你实际迭代它们之前,生成器并不是特别有用。优点是生成器可以动态计算值(而不是将值存储在列表中,然后可以在以后迭代)。它们的内存效率更高,但在某些情况下它们的执行速度比list-comps慢 - 在其他情况下,它们比列表理解更胜一筹,因为它很容易说 - 请给我前3个元素 - 而列表理解,你必须预先计算所有元素,这有时是一个昂贵的程序。

答案 1 :(得分:4)

这是list comprehension。它有点像带有内联循环的表达式,用于动态创建快速列表。在这种情况下,它正在创建sublime.active_window().views()返回的列表的浅表副本。

当您需要转换每个值时,列表推导真的很闪耀。例如,这是一个快速列表理解,以获得前十个完美的正方形:

[x*x for x in range(1,11)]