pytho****@googl*****
pytho****@googl*****
2011年 11月 7日 (月) 18:16:03 JST
Revision: 7e67e8f714be Author: Arihiro TAKASE <hinac****@gmail*****> Date: Mon Nov 7 01:14:08 2011 Log: 差分翻訳 2.7.2: reference/expressions http://code.google.com/p/python-doc-ja/source/detail?r=7e67e8f714be Modified: /reference/expressions.rst ======================================= --- /reference/expressions.rst Sun May 22 06:11:37 2011 +++ /reference/expressions.rst Mon Nov 7 01:14:08 2011 @@ -56,7 +56,7 @@ .. productionlist:: atom: `identifier` | `literal` | `enclosure` enclosure: `parenth_form` | `list_display` - : | `generator_expression` | `dict_display` + : | `generator_expression` | `dict_display` | `set_display` : | `string_conversion` | `yield_atom` @@ -174,6 +174,37 @@ 節を左から右の順にネストしたブロックとみなして実行し、ネストの最内ブロック に到達する度に式を評価した値となります。 [#]_ +.. _comprehensions: + +集合と辞書の表現 +---------------- + +Python は、集合や辞書を構成するために、"表現 (display)" と +呼ばれる特殊な構文を、それぞれ二種類づつ提供していて、コンテナの内容は: + +* 明示的に列挙される、または + +* :dfn:`内包表記 (comprehension)` と呼ばれる、 + ループ処理とフィルター処理の命令の組み合わせを通じて計算されます。 + +内包表記の共通の構文要素はこの通りです: + +.. productionlist:: + comprehension: `expression` `comp_for` + comp_for: "for" `target_list` "in" `or_test` [`comp_iter`] + comp_iter: `comp_for` | `comp_if` + comp_if: "if" `expression_nocond` [`comp_iter`] + +内包表記はまず単一の式、続いて :keyword:`for` 節、 +さらに続いて 0 個以上の :keyword:`for` 節や :keyword:`if` 節からなります。 +この場合、新たなコンテナの各要素は、各々の :keyword:`for` や :keyword:`if` +節を、左から右にネストしたブロックとみなして実行し、ネストの最内のブロック に +到達する度に式を評価することで作成されたものになります。 + +なお、これらの内包表記は別のスコープで実行されるので、対象のリスト内で +代入された名前が外側のスコープに "漏れる" ことはありません。 + + .. _genexpr: ジェネレータ式 @@ -186,24 +217,19 @@ ジェネレータ式 (generator expression) とは、丸括弧を使ったコンパクトなジェ ネレータ表記法です: .. productionlist:: - generator_expression: "(" `expression` `genexpr_for` ")" - genexpr_for: "for" `target_list` "in" `or_test` [`genexpr_iter`] - genexpr_iter: `genexpr_for` | `genexpr_if` - genexpr_if: "if" `old_expression` [`genexpr_iter`] - -.. index:: object: generator - -ジェネレータ式は新たなジェネレータオブジェクトを生み出します。 ジェネレー タ式は単一の式の後ろに少なくとも一つの :keyword:`for` -節と、場合によりさらに複数の :keyword:`for` または :keyword:`if` 節を続けた ものです。 -新たなジェネレータが繰り返す値は、各 :keyword:`for` および :keyword:`if` 節 をブロックとして、左から右へとネストし、 -その最内ブロックの中で式を評価した結果を出力しているものとみなせます。 - -ジェネレータ式の使う変数の評価は、独立したスコープでジェネレータオブジェク トに対して -:meth:`next` メソッドを呼び出すまで遅延されます。とはいえ、最も左に位置する -:keyword:`for` 節の :keyword:`in` はカレントスコープで直ちに評価されるた め、 -ジェネレータ式の最左 :keyword:`for` 節のエラーは、ジェネレータ式を使ってい る -コードの他のエラーに先立って起きることがあります。その後に続 く :keyword:`for` や -:keyword:`if` 節は、その前の :keyword:`for` ループに依存しているため、直ち には評価されません。 + generator_expression: "(" `expression` `comp_for` ")" + +ジェネレータ式は新たなジェネレータオブジェクトを与えます。 +この構文は内包表記とほぼ同じですが、角括弧や波括弧ではなく、 +丸括弧で囲まれます。 + +ジェネレータ式で使われる変数は、ジェネレータオブジェクトに +:meth:`next` メソッドが呼び出されたときに遅延評価されます (通常の +ジェネレータと同じ流儀です)。しかし、最も左に位置する +:keyword:`for` 節は直ちに評価されるため、そこで生じたエラーは、 +ジェネレータ式を扱うコードで起こりえる他のエラーの前に現れることがありま す。 +その後に続く :keyword:`for` 節は、その前の +:keyword:`for` ループに依存しているため、直ちには評価されません。 例: ``(x*y for x in range(10) for y in bar(x))`` 関数の唯一の引数として渡す場合には、丸括弧を省略できます。詳しく は :ref:`calls` 節を参照してください。 @@ -215,33 +241,59 @@ -------- .. index:: pair: dictionary; display - -.. index:: - single: key - single: datum - single: key/datum pair + key, datum, key/datum pair + object: dictionary 辞書表現は、波括弧で囲われた、キーと値のペアからなる系列です。系列は空の系 列であってもかまいません: .. productionlist:: - dict_display: "{" [`key_datum_list`] "}" + dict_display: "{" [`key_datum_list` | `dict_comprehension`] "}" key_datum_list: `key_datum` ("," `key_datum`)* [","] key_datum: `expression` ":" `expression` - -.. index:: object: dictionary + dict_comprehension: `expression` ":" `expression` `comp_for` 辞書表現は、新たな辞書オブジェクトを表します。 -キー/データのペアは、左から右へと評価され、その結果が辞書の各エントリを決定 します: 各キーオブジェクトは、対応するデータを -辞書に記憶するためのキーとして用いられます。 +カンマ区切りの一連のキー/データの対が与えられたときは、その要素は +左から右へ評価され、辞書の項目を定義します。すなわち、それぞれの +キーオブジェクトが、辞書内で対応するデータを保存するキーとして使われます。 +これにより、キー/データリストの中で同じキーを複数回指定することができ、 +そのキーに対する最終的な辞書の値は、最後に与えられたものになります。 + +辞書内包表記は、リストや集合の内包表記とは対照的に、通常の "for" や "if" 節 の +前に、コロンで分けられた 2 つの式が必要です。内包表記が起動すると、 +結果のキーと値の要素が、作られた順に新しい辞書に挿入されます。 .. index:: pair: immutable; object + hashable キーの値として使える型に関する制限は :ref:`types` 節ですでに列挙していま す。(一言でいうと、キーは変更可能なオブジェクトを 全て排除した :term:`hashable` でなければなりません。) 重複するキー間で衝突 が起きても、衝突が検出されることはありません; あるキーに対して、最後に渡され たデータ (プログラムテキスト上では、辞書表記の最も右側値となるもの) が使われます。 +.. _set: + +集合表現 +-------- + +.. index:: pair: set; display + object: set + +集合表現は波括弧で表され、キーと値を分けるコロンがないことで +辞書表現と区別されます: + +.. productionlist:: + set_display: "{" (`expression_list` | `comprehension`) "}" + +集合表示は、一連の式または内包表記によって指定された内容の、ミュータブルな +集合オブジェクトを与えます。カンマ区切りの一連の式が与えられたときは、 +その要素は左から右へ順に評価され、集合オブジェクトに加えられます。 +内包表記が与えられたときは、内包表記の結果となる要素で集合が構成されます。 + +空集合は ``{}`` で構成できません。このリテラルは空の辞書を構成します。 + + .. _string-conversions: 文字列変換 @@ -809,6 +861,11 @@ *n* ビットの右シフトは ``pow(2,n)`` による除算として定義されています。 *n* ビットの左シフトは ``pow(2,n)`` による乗算として定義されます。負のビット数でシフトを行う と :exc:`ValueError` 例外を送出します。 +.. note:: + + 現在の実装では、右辺被演算子は最大でも :attr:`sys.maxsize` でなければ + なりません。右辺被演算子が :attr:`sys.maxsize` よりも大きいと、 + :exc:`OverflowError` 例外が送出されます。 .. _bitwise: @@ -1157,7 +1214,7 @@ .. [#] ``abs(x%y) < abs(y)`` は数学的には真となりますが、浮動小数点に対する 演算の場合には、値丸め (roundoff) のために数値計算的に 真にならない場合があります。例えば、Python の浮動小数点型が IEEE754 倍精 度数型になっているプラットフォームを仮定すると、 ``-1e-100 % 1e100`` は ``1e100`` と同じ符号になるはずなのに、計算結果は ``-1e-100 + 1e100`` となります。これは - 数値計算的には厳密に ``1e100`` と等価です。 :mod:`math` モジュールの関 数 :func:`fmod` は、最初の引数と符号が一致する + 数値計算的には厳密に ``1e100`` と等価です。関数 :func:`math.fmod` は、最 初の引数と符号が一致する ような値を返すので、上記の場合には ``-1e-100`` を返します。どちらのアプ ローチが適切かは、アプリケーションに依存します。 .. [#] x が y の整数倍に非常に近い場合、丸め誤差によって ``floor(x/y)`` は ``(x-x%y)/y`` よりも大きな値になる可能性があります。 @@ -1181,6 +1238,8 @@ 一見すると普通ではない振る舞いだと気付くかもしれません。 詳細はそれぞれのドキュメントを確認してください。 +.. [#] ``%`` 演算子は文字列フォーマットにも使われ、同じ優先順位が当てはまり ます。 + .. [#] べき乗演算子 ``**`` はその右側にある単項演算子かビット単位演算子より も優先して束縛されます。 つまり ``2**-1`` は ``0.5`` になります。