看看Python和Javascript中的理解,到目前为止,我看不到我认为在Haskell等语言中理解最强大的一些主要特性。
他们是否允许多个发电机之类的东西?或者它们只是一个基本的地图过滤器形式?
如果他们不允许使用多台发电机,我发现它们非常令人失望 - 为什么会遗漏这些东西呢?
答案 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当然不需要这样做/ p>
答案 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确实允许多个生成器进行理解。