あと味

たくさん情報を食べて、たくさん発信すると、あとになって味わい深い。

配列内包表記

最近、エキスパートPythonプログラミングをぼちぼち読み進めてます。自分には難しい内容で読み応えがあります。

Pythonのリスト内包表記っていうのがありますが、これコードを簡潔にしようと思うと、割と自然に使い始める代物で、Firefox限定でPythonからJavaScriptに輸入されてたりします。

配列から配列を作る時なんかに非常に便利で、Coolな記法です。これ標準になるとうれしいなー。

配列内包表記の使い方

例えば、配列の中の数値を10倍にした配列が欲しいと思った場合、配列内包表記がない場合は、以下のように書いたりします。

<script type="text/javascript">
var arr = [1,2,3,4,5]
for (var i = 0; i < arr.length; i++) { 
  arr[i] *= 10;
}
</script>

これを配列内包表記に置き換えると以下のような感じです。

<script type="text/javascript;version=1.7">
var arr = [x * 10 for each(x in [1,2,3,4,5])]
</script>

配列内包表記はJavaScriptのversion1.7以降のサポートなので、script要素のtype属性にバージョンを指定することが必須で、かつ、Firefox限定になります。もしくはSpiderMonkeyとか、Rhino上で試すこともできます。

HTMLファイルを用意するのが面倒だったらjsdo.it - Share JavaScript, HTML5 and CSSのHTMLエリアで試してみるのも良いかもしれません。

このfor each ... in文もFirefox限定です。厳密にはE4Xにて使える構文で、E4XをサポートしているFirefoxでは使えるということです。

配列内包表記はPythonのリスト内包表記と瓜二つなので、Python使ってる人なら違和感なく使えるんだろうなーと思います。

Pythonで同じ処理
arr = [x * 10 for x in [1,2,3,4,5]]

MDCの例にあるrange関数を用いて、FizzBuzzなんかも書いてみます。*1

<script type="text/javascript;version=1.7">
/* https://developer.mozilla.org/ja/New_in_JavaScript_1.7 */
function range(begin, end) {
  for (let i = begin; i < end; ++i) {
    yield i;
  }
}

for each(let x in [(i%15==0) ? 'fizzbuzz' : (i%3==0) ? 'fizz' : (i%5==0) ? 'buzz' : i for each(i in range(1, 101))]) {
  console.log(x);
}
</script>

配列内包表記、簡潔でカッコいいなー。

*1:yieldはまた別件で書くかも