辞書:dict
>>> m = {}
>>> for e in "ABC": m[e] = ord(e)
>>> m
{'A': 65, 'C': 67, 'B': 66}
空の辞書 m に対して、演算子 []= を使って各要素を追加します。同じことはジェネレーター式を使うと、次のように簡潔に表現できます。
>>> dict((e,ord(e)) for e in "ABC")
{'A': 65, 'C': 67, 'B': 66}
組み込み関数 dict の引数に、各要素を生成するタプル式 (e,ord(e)) を指定するとともに、文字列の各要素 e を参照する方法を記述します。制御構造を表わす for を引数内に記述できるので、簡潔で見通しの良いコードを記述できるようになります。
内包を使って
組み込み関数 ord を使うと、
>>> help(ord) Help on built-in function ord in module __builtin__: ord(...) ord(c) -> integer Return the integer ordinal of a one-character string.
文字 c の ASCII コード(整数値)が得られます。そこで、任意の文字列の各要素(長さ1の文字列)の値を列挙したリストを得るには、
>>> s = []
>>> for e in "ABC": s.append(ord(e))
...
>>> s
[65, 66, 67]
空のリスト s に対して、メソッド append を使って各要素を追加します。同じことは内包を使うと、次のように簡潔に表現できます。
>>> [ord(e) for e in "ABC"] [65, 66, 67]
リスト内には、列挙したい各要素を生成する式 ord(e) を指定するとともに、文字列の各要素 e を参照する方法を記述します。制御構造を表わす for をリストに記述できるので、簡潔で見通しの良いコードを記述できるようになります。内包の代わりに、外延で表現すると、
>>> [ord("A"),ord("B"),ord("C")] [65, 66, 67]
各要素を生成する式を列挙する必要があり、かなり面倒です。
《Note》内包〔comprehension〕が導入されるのに、Python 2.0 まで待たねばなりませんでした。VDM++ では、リストだけでなく、Set/Sequence/Map に対しても、自由に内包を記述できます。さらに、Smalltalk では、内包だけでなく、より包括的な表現が早くから導入されていただけに、待ち焦がれていた機能のひとつです。□
《参考文献》
・/Python-Docs-2.0.1/ref/lists.html#l2h-271
集合:set〈第3版〉
>>> s = set()
>>> for e in "ABC": s.add(ord(e))
>>> s
set([65, 66, 67])
空の集合 s に対して、メソッド add を使って各要素を追加します。同じことはジェネレーター式を使うと、次のように簡潔に表現できます。
>>> set(ord(e) for e in "ABC")
set([65, 66, 67])
組み込み関数 set の引数に、各要素を生成する式 ord(e) を指定するとともに、文字列の各要素 e を参照する方法を記述します。制御構造を表わす for を引数内に記述できるので、簡潔で見通しの良いコードを記述できるようになります。
《Note》VDM++ では、次のように記述できます。
let s = "ABC" in {ord(e) | i in set inds s & e = s(i)} -- set : set [ord(e) | i in set inds s & e = s(i)] -- seq : list {e|->ord(e) | i in set inds s & e = s(i)} -- map : dict
□