Понимания в Python и Javascript только очень простые - PullRequest
6 голосов
/ 09 октября 2009

Глядя на понимание в Python и Javascript, я пока не вижу некоторых основных функций, которые я считаю наиболее мощными в понимании языков, таких как Haskell.

Они допускают такие вещи, как несколько генераторов? Или это просто базовая форма фильтра карты?

Если они не позволяют использовать несколько генераторов, я нахожу их весьма разочаровывающими - почему такие вещи были исключены?

Ответы [ 4 ]

12 голосов
/ 09 октября 2009

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 аналогичен (результат использования оболочки javascript в firefox):

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, для работы со списками требуется eval-косвенное обращение. Javascript внутри тега <script>, разумеется, этого не требует)

3 голосов
/ 09 октября 2009

Да, вы можете иметь несколько итераций в понимании списка Python :

>>> [(x,y) for x in range(2) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
1 голос
/ 09 октября 2009

Понимания в Хаскеле очень мощные, во многом потому, что Хаскель функционален, поэтому для них это очень важно. Python не функционален, поэтому он имеет меньше смысла.

Вы можете сделать много сложных вещей в Python, но он быстро становится трудным для чтения, что наносит ущерб всей цели (то есть вы должны сделать это другим способом).

Однако, как указывалось здесь, python допускает использование нескольких генераторов в понимании.

1 голос
/ 09 октября 2009

Также добавить оператор 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)]
...