1

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

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

这是我不明白的“[v for v”部分。这段代码到底在做什么?

提前致谢!

4

2 回答 2

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}

和听写理解:

{k:v for k,v in iterable_that_yields_2_tuples}

因此,这是创建所有值为 1 的字典的低效方法:

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

最后,python 还支持生成器表达式(它们至少在 python2.6 中可用——我不确定它们是什么时候引入的):

(x for x in iterable)

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

于 2013-02-14T16:47:40.733 回答
4

这是一个列表理解。它有点像带有内联 for 循环的表达式,用于动态创建快速列表。在这种情况下,它正在创建由sublime.active_window().views().

当您需要转换每个值时,列表推导式真的很出色。例如,这里有一个快速的列表理解来获得前十个完美的正方形:

[x*x for x in range(1,11)]
于 2013-02-14T16:50:22.037 回答