Python和Javascript中的理解只是非常基础?

时间:2009-10-09 13:39:14

标签: javascript python haskell list-comprehension

看看Python和Javascript中的理解,到目前为止,我看不到我认为在Haskell等语言中理解最强大的一些主要特性。

他们是否允许多个发电机之类的东西?或者它们只是一个基本的地图过滤器形式?

如果他们不允许使用多台发电机,我发现它们非常令人失望 - 为什么会遗漏这些东西呢?

4 个答案:

答案 0 :(得分:12)

Python允许多个生成器:

>>> [(x,y,x*y) for x in range(1,5) for y in range(1,5)]
[(1, 1, 1), (1, 2, 2), (1, 3, 3), (1, 4, 4), 
 (2, 1, 2), (2, 2, 4), (2, 3, 6), (2, 4, 8), 
 (3, 1, 3), (3, 2, 6), (3, 3, 9), (3, 4, 12),
 (4, 1, 4), (4, 2, 8), (4, 3, 12), (4, 4, 16)]

还有限制:

>>> [(x,y,x*y) for x in range(1,5) for y in range(1,5) if x*y > 8]
[(3, 3, 9), (3, 4, 12), (4, 3, 12), (4, 4, 16)]

更新:Javascript的语法类似(在Firefox上使用javascript shell的结果):

var nums = [1, 2, 3, 21, 22, 30];
var s = eval('[[i,j] for each (i in nums) for each (j in [3,4]) if (i%2 == 0)]');
s.toSource();
[[2, 3], [2, 4], [22, 3], [22, 4], [30, 3], [30, 4]]

(由于某种原因,在javascript shell中评估上下文内容的某些内容需要eval间接使列表推导工作。<script>标记内的Javascript当然不需要这样做

答案 1 :(得分:3)

是的,您可以在Python list comprehension中使用多个迭代:

>>> [(x,y) for x in range(2) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]

答案 2 :(得分:1)

也添加一个if语句......

>>> [(x,y) for x in range(5) for y in range(6) if x % 3 == 0 and y % 2 == 0]
[(0, 0), (0, 2), (0, 4), (3, 0), (3, 2), (3, 4)]

答案 3 :(得分:1)

Haskell中的理解在很大程度上是非常强大的,因为Haskell是功能性的,所以它对它们来说非常有意义。 Python不具备功能,因此不太有意义。

你可以用Python中的理解来制作很多复杂的东西,但它很快就会变得难以阅读,从而破坏了整个目的(意味着你应该以其他方式去做)。

然而,正如这里所指出的,python确实允许多个生成器进行理解。