6

Python と Javascript の内包表記を見てみると、Haskell のような言語の内包表記で最も強力だと私が考える主要な機能のいくつかは今のところ見当たりません。

複数のジェネレーターなどを許可しますか? それとも、基本的なマップ フィルター形式ですか?

複数のジェネレーターが許可されていない場合、私は非常に残念だと思います。

4

4 に答える 4

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 シェルを使用した結果):

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 間接化が必要です。<script>もちろん、タグ内の Javascript はそれを必要としません)

于 2009-10-09T13:44:43.603 に答える
3

はい、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)]
于 2009-10-09T13:42:04.977 に答える
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)]
于 2009-10-09T13:58:33.853 に答える
1

Haskell は関数型であるため、Haskell では内包表記が非常に強力です。Python は機能的ではないため、あまり意味がありません。

Python では内包表記を使用して多くの複雑なものを作成できますが、すぐに読みにくくなり、目的全体が無効になります (つまり、別の方法で行う必要があります)。

ただし、ここで指摘したように、python では複数のジェネレーターを内包表記で使用できます。

于 2009-10-09T14:04:48.680 に答える