ジェネレーター式を使って〈第2版〉

さらに、内包に代わって、ジェネレーター式を使うと便利です。
《Note》ジェネレーター〔generator〕が導入されるのに、Python 2.2 まで待たねばなりませんでした。コルーチンを記述できる環境(Modula-2 など)と比べて、本格的にマルチスレッドを導入するまでもなく、軽微な問題解決を図りたいときには重宝するので、待ち焦がれていた機能のひとつです。□
《参考文献》
・/Python-Docs-2.2.3/ref/types.html#l2h-30

辞書: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

リスト:list

>>> list(ord(e) for e in "ABC")
[65, 66, 67]

組み込み関数 list の引数に、各要素を生成する式 ord(e) を指定するとともに、文字列の各要素 e を参照する方法を記述します。制御構造を表わす for を引数内に記述できるので、簡潔で見通しの良いコードを記述できるようになります。

タプル:tuple

>>> tuple(ord(e) for e in "ABC")
(65, 66, 67)

組み込み関数 tuple の引数に、各要素を生成する式 ord(e) を指定するとともに、文字列の各要素 e を参照する方法を記述します。制御構造を表わす for を引数内に記述できるので、簡潔で見通しの良いコードを記述できるようになります。

集合: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