6. 式 (expression)

この章では、Python の式における個々の要素の意味について解説します。

表記法に関する注意: この章と以降の章での拡張BNF (extended BNF) 表記は、字句解析規則ではなく、構文規則を記述するために用いられています。ある構文規則 (のある表現方法) が、以下の形式

name ::=  othername

で記述されていて、この構文特有の意味付け (semantics) が記述されていない場合、name の形式をとる構文の意味付けは othername の意味付けと同じになります。

6.1. 算術変換 (arithmetic conversion)

以下の算術演算子の記述で、「数値引数は共通の型に変換されます」と書かれているとき、組み込み型に対する演算子の実装は以下の通りにはたらきます:

  • 片方の引数が複素数型であれば、他方は複素数型に変換されます;

  • それ以外の場合で、片方の引数が浮動小数点数であれば、他方は浮動小数点型に変換されます;

  • それ以外場合は、両方の引数は整数でなければならず、変換の必要はありません。

特定の演算子 (‘%’ 演算子の左引数としての文字列) には、さらに別の規則が適用されます。拡張は、それ自身の型変換のふるまいを定義していなければなりません。

6.2. Atom (原始的要素)

atom は、式の一番基本的な要素です。もっとも単純な atom は、識別子またはリテラルです。丸括弧、角括弧、または波括弧で囲われた形式 (form) もまた、構文上アトムに分類されます。atom の構文は以下のようになります:

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom

6.2.1. 識別子 (identifier、または名前 (name))

アトムの形になっている識別子 (identifier) は名前 (name) です。字句定義については 識別子 (identifier) およびキーワード (keyword) 節を、名前付けや束縛については 名前づけと束縛 (naming and binding) 節を参照してください。

名前があるオブジェクトに束縛されている場合、名前 atom を評価するとそのオブジェクトになります。名前が束縛されていない場合、 atom を評価しようとすると NameError 例外を送出します。

プライベートな名前の名前修飾: クラス定義内に書かれた識別子で、2つ以上のアンダースコアから始まり、末尾が2つ以上のアンダースコアで終わっていないものは、そのクラスの プライベートな名前 とみなされます。プライベートな名前は、コードが生成される前により長い形式に変換されます。この変換によって、クラス名の先頭にアンダースコアがあれば除去し、先頭にアンダースコアを1つ付加し、名前の前に挿入されます。例えば、クラス名 Ham の中の識別子 __spam は、_Ham__spam に変換されます。変換は識別子が使用されている構文のコンテキストからは独立しています。変換された名前が非常に長い (255文字を超える) 場合、実装によっては名前の切り詰めが行われるかもしれません。クラス名がアンダースコアのみから成る場合は変換は行われません。

6.2.2. リテラル

Python では、文字列やバイト列リテラルと、様々な数値リテラルをサポートしています:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber

リテラルの評価は、与えられた型 (文字列、バイト列、整数、浮動小数点数、複素数) の与えられた値を持つオブジェクトを与えます。浮動小数点や虚数 (複素数) リテラルの場合、値は近似値になる場合があります。詳しくは リテラル を参照してください。

リテラルは全て変更不能なデータ型に対応します。このため、オブジェクトの同一性はオブジェクトの値ほど重要ではありません。同じ値を持つ複数のリテラルを評価した場合、(それらのリテラルがプログラムの同じ場所由来のものであっても、そうでなくても) 同じオブジェクトを指しているか、まったく同じ値を持つ別のオブジェクトになります。

6.2.3. 丸括弧形式 (parenthesized form)

丸括弧形式とは、式リストの一形態で、丸括弧で囲ったものです:

parenth_form ::=  "(" [expression_list] ")"

丸括弧で囲われた式のリストは、個々の式が表現するものになります: リスト内に少なくとも一つのカンマが入っていた場合、タプルになります; そうでない場合、式のリストを構成している単一の式自体の値になります。

中身が空の丸括弧のペアは、空のタプルオブジェクトを表します。タプルは変更不能なので、リテラルと同じ規則が適用されます (すなわち、空のタプルが二箇所で使われると、それらは同じオブジェクトになることもあるし、ならないこともあります)。

タプルは丸括弧で作成されるのではなく、カンマによって作成されることに注意してください。例外は空のタプルで、この場合には丸括弧が 必要です — 丸括弧のつかない “何も記述しない式 (nothing)” を使えるようにしてしまうと、文法があいまいなものになってしまい、よくあるタイプミスが検出されなくなってしまいます。

6.2.4. リスト、集合、辞書の表示

Python は、リスト、集合、または辞書を構成するために、”表示 (display)” と呼ばれる特殊な構文を、それぞれ二種類づつ提供していて、コンテナの内容は:

  • 明示的に列挙される、または

  • 内包表記 (comprehension) と呼ばれる、ループ処理とフィルター処理の命令の組み合わせを通じて計算されます。

内包表記の共通の構文要素はこの通りです:

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]

内包表記はまず単一の式、続いて for 節、さらに続いて 0 個以上の for 節や if 節からなります。この場合、新たなコンテナの各要素は、各々の forif 節を、左から右にネストしたブロックとみなして実行し、ネストの最内のブロックに到達する度に式を評価することで作成されたものになります。

なお、これらの内包表記は別のスコープで実行されるので、対象のリスト内で代入された名前が外側のスコープに “漏れる” ことはありません。

6.2.5. リスト表現

リスト表現は、角括弧で囲われた式の系列です。系列は空の系列であってもかまいません:

list_display ::=  "[" [expression_list | comprehension] "]"

リスト表示は、新しいリストオブジェクトを与えます。リストの内容は、式リストか、リスト内包表記 (list comprehension) で指定されます。カンマで区切られた一連の式が与えられたときは、それらの各要素は左から右へと順に評価され、その順にリスト内に配置されます。内包表記が与えられたときは、内包表記の結果の要素でリストが構成されます。

6.2.6. 集合表現

集合表現は波括弧で表され、キーと値を分けるコロンがないことで辞書表現と区別されます:

set_display ::=  "{" (expression_list | comprehension) "}"

集合表示は、一連の式または内包表記によって指定された内容の、ミュータブルな集合オブジェクトを与えます。カンマ区切りの一連の式が与えられたときは、その要素は左から右へ順に評価され、集合オブジェクトに加えられます。内包表記が与えられたときは、内包表記の結果となる要素で集合が構成されます。

空集合は {} で構成できません。このリテラルは空の辞書を構成します。

6.2.7. 辞書表現

辞書表現は、波括弧で囲われた、キーと値のペアからなる系列です。系列は空の系列であってもかまいません:

dict_display       ::=  "{" [key_datum_list | dict_comprehension] "}"
key_datum_list     ::=  key_datum ("," key_datum)* [","]
key_datum          ::=  expression ":" expression
dict_comprehension ::=  expression ":" expression comp_for

辞書表現は、新たな辞書オブジェクトを表します。

カンマ区切りの一連のキー/データの対が与えられたときは、その要素は左から右へ評価され、辞書の項目を定義します。すなわち、それぞれのキーオブジェクトが、辞書内で対応するデータを保存するキーとして使われます。これにより、キー/データリストの中で同じキーを複数回指定することができ、そのキーに対する最終的な辞書の値は、最後に与えられたものになります。

辞書内包表記は、リストや集合の内包表記とは対照的に、通常の “for” や “if” 節の前に、コロンで分けられた 2 つの式が必要です。内包表記が起動すると、結果のキーと値の要素が、作られた順に新しい辞書に挿入されます。

キーの値として使える型に関する制限は 標準型の階層 節ですでに列挙しています。(一言でいうと、キーは変更可能なオブジェクトを全て排除した hashable でなければなりません。) 重複するキー間で衝突が起きても、衝突が検出されることはありません; あるキーに対して、最後に渡されたデータ (プログラムテキスト上では、辞書表記の最も右側値となるもの) が使われます。

6.2.8. ジェネレータ式

ジェネレータ式 (generator expression) とは、丸括弧を使ったコンパクトなジェネレータ表記法です:

generator_expression ::=  "(" expression comp_for ")"

ジェネレータ式は新たなジェネレータオブジェクトを与えます。この構文は内包表記とほぼ同じですが、角括弧や波括弧ではなく、丸括弧で囲まれます。

ジェネレータ式の中で使われている変数は、 (通常のジェネレータと同じように) そのジェネレータオブジェクトに対して __next__() メソッドが呼ばれたときに遅延評価されます。ただし、最も左に位置する for 節は直ちに評価されるため、そこで生じたエラーは、 ジェネレータ式を扱うコードの中で起きる他のエラーよりも前に表示されます。前の for ループに依存するかもしれないので、後の for 節は即座に評価することができません。例えば: (x*y for x in range(10) for y in bar(x))

関数の唯一の引数として渡す場合には、丸括弧を省略できます。詳しくは 呼び出し (call) 節を参照してください。

6.2.9. Yield 式

yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]

yield 式は ジェネレータ 関数の関数定義内でのみ使用されます。関数本体中で yield 式 を使用すると、その関数はジェネレータになります。

ジェネレータ関数が呼び出された時、ジェネレータとしてのイテレータを返します。ジェネレータはその後ジェネレータ関数の実行を制御します。ジェネレータのメソッドが呼び出されると実行が開始されます。開始されると、最初の yield 式まで処理して一時停止し、呼び出し元へ expression_list の値を返します。ここで言う一時停止とは、ローカル変数の束縛、命令ポインタや内部の評価スタック、そして例外処理のを含むすべてのローカル状態が保持されることを意味します。再度、ジェネレータのメソッドが呼び出されて実行を再開した時、ジェネレータは yield 式がただの外部呼び出しであったかのように処理を継続します。再開後の yield 式の値は実行を再開するメソッドに依存します。__next__() を使用した場合 (一般に for 文や組み込み関数 next() など) の結果は None となり、send() を使用した場合はそのメソッドに渡された値が結果になります。

これまで説明した内容から、ジェネレータ関数はコルーチンにとてもよく似ています。ジェネレータ関数は何度も生成し、1つ以上のエントリポイントを持ち、その実行は一時停止されます。ジェネレータ関数は yield した後で実行の継続を制御できないことが唯一の違いです。その制御は常にジェネレータの呼び出し元へ移されます。

yield 式は try 構造内で使用できます。ジェネレータの (参照カウントがゼロに達するか、ガベージコレクションによる) 完了前に再開されない場合、ジェネレータ-イテレータの close() メソッドが呼ばれ、finally 節が実行されます。

yield from <expr> を使用した場合、与えられた式はサブイテレータとして扱われます。サブイテレータによって生成されたすべての値は現在のジェネレータのメソッドの呼び出し元へ直接渡されます。send() で渡されたあらゆる値と throw() で渡されたあらゆる例外は根底のイテレータに適切なメソッドがあれば渡されます。適切なメソッドがない場合、send()AttributeErrorTypeError を、throw() は渡された例外を即座に送出します。

根底のイテレータの完了時、引き起こされた StopIteration インスタンスの value 属性はその yield 式の値となります。 StopIteration を起こす際に明示的にセットされるか、サブイテレータがジェネレータであれば (サブイテレータからかえる値で) 自動的にセットされるかのどちらかです。

バージョン 3.3 で変更: サブイテレータに制御フローを委譲するために yield from <expr> が追加されました。

yield 式が代入文の単独の右辺式であるとき、括弧は省略できます。

参考

PEP 0255 - Simple Generators

Python へのジェネレータと yield 文の導入提案。

PEP 0342 - Coroutines via Enhanced Generators

シンプルなコルーチンとして利用できるように、ジェネレータの構文と API を拡張する提案です。

PEP 0380 - Syntax for Delegating to a Subgenerator

サブジェネレータの委譲を簡単にするための、 yield_from 構文の導入提案。

6.2.9.1. ジェネレータ-イテレータメソッド

この説ではジェネレータイテレータのメソッドについて説明します。これらはジェネレータ関数の実行制御に使用できます。

以下のジェネレータメソッドの呼び出しは、ジェネレータが既に実行中の場合 ValueError 例外を送出する点に注意してください。

generator.__next__()

ジェネレータ関数の実行を開始するか、最後に yield 式が実行されたところから再開します。ジェネレータ関数が __next__() メソッドによって再開された時、その時点の yield 式の値は常に None と評価されます。その後次の yield 式まで実行し、ジェネレータは一時停止し、expression_list の値を __next__() メソッドの呼び出し元に返します。ジェネレータが次の値を yield せずに終了した場合、StopIteration 例外が送出されます。

このメソッドは通常、例えば for ループや組み込みの next() 関数によって暗黙に呼び出されます。

generator.send(value)

ジェネレータ関数の内部へ値を “送り”、実行を再開します。引数の value はその時点の yield 式の結果になります。 send() メソッドは次にジェネレータが生成した値を返し、ジェネレータが次の値を生成することなく終了すると StopIteration を送出します。 send() が呼び出されてジェネレータが開始するときは、値を受け取る yield 式が存在しないので、 None を引数として呼び出さなければなりません。

generator.throw(type[, value[, traceback]])

ジェネレータが中断した位置で type 型の例外を発生させて、そのジェネレータ関数が生成する次の値を返します。ジェネレータが値を生成することなく終了すると StopIteration が発生します。ジェネレータ関数が渡された例外を捕捉しない、もしくは違う例外を発生させるなら、その例外は呼び出し元へ伝搬されます。

generator.close()

ジェネレータ関数が中断した位置で GeneratorExit を発生させます。ジェネレータ関数が (通常の終了または既にクローズされたことで) StopIteration 、もしくは (例外を捕捉しないことで) GeneratorExit を発生させる場合 close() は呼び出し元へ返されます。ジェネレータが値を生成する場合 RuntimeError が発生します。 close() はジェネレータが通常の終了または例外により既に終了している場合は何もしません。

6.2.9.2. 例

以下の簡単なサンプルはジェネレータとジェネレータ関数の振る舞いを実際に紹介します:

>>> def echo(value=None):
...     print("Execution starts when 'next()' is called for the first time.")
...     try:
...         while True:
...             try:
...                 value = (yield value)
...             except Exception as e:
...                 value = e
...     finally:
...         print("Don't forget to clean up when 'close()' is called.")
...
>>> generator = echo(1)
>>> print(next(generator))
Execution starts when 'next()' is called for the first time.
1
>>> print(next(generator))
None
>>> print(generator.send(2))
2
>>> generator.throw(TypeError, "spam")
TypeError('spam',)
>>> generator.close()
Don't forget to clean up when 'close()' is called.

yield from の使用例は、PEP 380: サブジェネレータへの委譲構文 in “What’s New in Python.” を参照してください。

6.3. プライマリ

プライマリは、言語において最も結合の強い操作を表します。文法は以下のようになります:

primary ::=  atom | attributeref | subscription | slicing | call

6.3.1. 属性参照

属性参照は、プライマリの後ろにピリオドと名前を連ねたものです:

attributeref ::=  primary "." identifier

プライマリの評価は、属性参照をサポートする型のオブジェクトでなければならず、これにはほとんどのオブジェクトが当てはまります。そしてこのオブジェクトは、名前が指定した識別子名であるような属性を生成しなければなりません。この生成は __getattr__() メソッドをオーバーライドすることでカスタマイズできます。その属性が得られなければ、例外 AttributeError が送出されます。そうでなければ、生成されるオブジェクトの型と値は、属性を生成したオブジェクトにより決まります。同じ属性参照を複数回評価すると、互いに異なる属性オブジェクトが得られることがあります。

6.3.2. 添字表記 (subscription)

添字表記は、シーケンス (文字列、タプルまたはリスト) やマップ (辞書) オブジェクトから、要素を一つ選択します:

subscription ::=  primary "[" expression_list "]"

プライマリの評価は、添字表記をサポートするオブジェクト (例えばリストや辞書) でなければなりません。ユーザ定義のオブジェクトは、 __getitem__() メソッドを定義することで添字表記をサポートできます。

組み込みオブジェクトでは、添字表記をサポートするオブジェクトには 2 種類あります:

プライマリがマップであれば、式リストの値評価結果はマップ内のいずれかのキー値に相当するオブジェクトにならなければなりません。添字表記は、そのキーに対応するマップ内の値 (value) を選択します。(式リストの要素が単独である場合を除き、式リストはタプルでなければなりません。)

プライマリがシーケンスであれば、式 (リスト) の評価は整数またはスライス (以下の節で論じます) でなければなりません。

形式的な構文はシーケンスの負のインデックスにいかなる特例も与えません。しかし、すべての組み込みのシーケンスが与える __getitem__() メソッドは、負のインデックスを、インデックスにシーケンスの長さを加えて解釈します (つまり、 x[-1]x の最後の要素を選択します)。結果の値はシーケンスの要素数より小さな非負の整数でなければなりません。添字表記は、(0 から数えた) インデックスを持つ要素を選択します。負のインデックスのサポートは、オブジェクトの __getitem__() メソッドに現れるので、このメソッドをオーバーライドするサブクラスは、明示的にこのサポートを追加する必要があります。

文字列型の要素は文字 (character) です。文字は個別の型ではなく、1 文字だけからなる文字列です。

6.3.3. スライス表記 (slicing)

スライス表記はシーケンスオブジェクト (文字列、タプルまたはリスト) におけるある範囲の要素を選択します。スライス表記は式として用いたり、代入や del 文の対象として用いたりできます。スライス表記の構文は以下のようになります:

slicing      ::=  primary "[" slice_list "]"
slice_list   ::=  slice_item ("," slice_item)* [","]
slice_item   ::=  expression | proper_slice
proper_slice ::=  [lower_bound] ":" [upper_bound] [ ":" [stride] ]
lower_bound  ::=  expression
upper_bound  ::=  expression
stride       ::=  expression

上記の形式的な構文法にはあいまいなところがあります: 式リストに見えるものは、スライスリストにも見えるため、添字表記はスライス表記としても解釈されうるということです。(スライスリストが適切なスライスを含まない場合)、これ以上の構文の複雑化はせず、スライス表記としての解釈よりも添字表記としての解釈が優先されるように定義することで、あいまいさを取り除いています。

スライス表記に対する意味付けは、以下のようになります。プライマリの値評価結果は、以下に述べるようにしてスライスリストから生成されたキーによって (通常の添字表記と同じ __getitem__() メソッドを使って) インデクス指定できなければなりません。スライスリストに一つ以上のカンマが含まれている場合、キーは各スライス要素を値変換したものからなるタプルになります; それ以外の場合、単一のスライス要素自体を値変換したものがキーになります。一個の式であるスライス要素は、その式に変換されます。適切なスライスは、スライスオブジェクト (標準型の階層 参照) に変換され、その start, stop および step 属性は、それぞれ指定した下境界、上境界、およびとび幅 (stride) になります。式がない場所は None で置き換えられます。

6.3.4. 呼び出し (call)

呼び出しは、呼び出し可能オブジェクト (例えば function) を arguments の系列とともに呼び出します。系列は空の系列であってもかまいません:

call                 ::=  primary "(" [argument_list [","] | comprehension] ")"
argument_list        ::=  positional_arguments ["," keyword_arguments]
                            ["," "*" expression] ["," keyword_arguments]
                            ["," "**" expression]
                          | keyword_arguments ["," "*" expression]
                            ["," keyword_arguments] ["," "**" expression]
                          | "*" expression ["," keyword_arguments] ["," "**" expression]
                          | "**" expression
positional_arguments ::=  expression ("," expression)*
keyword_arguments    ::=  keyword_item ("," keyword_item)*
keyword_item         ::=  identifier "=" expression

最後の固定引数やキーワード引数の後にカンマをつけてもかまいません。構文の意味付けに影響を及ぼすことはありません。

プライマリの評価は呼び出し可能オブジェクトでなければなりません。 (ユーザ定義関数、組み込み関数、組み込みオブジェクトのメソッド、クラスオブジェクト、クラスインスタンスのメソッド、および __call__() メソッドを持つ全てのオブジェクトが呼び出し可能です)。引数式は全て、呼び出しを試みる前に評価されます。仮引数 (formal parameter) リストの構文については 関数定義 を参照してください。

キーワード引数が存在する場合、以下のようにして最初に固定引数 (positional argument) に変換されます。まず、値の入っていないスロットが仮引数に対して生成されます。N 個の固定引数がある場合、固定引数は先頭の N スロットに配置されます。次に、各キーワード引数について、識別子を使って対応するスロットを決定します (識別子が最初の仮引数パラメタ名と同じなら、最初のスロットを使う、といった具合です)。スロットがすでにすべて埋まっていたなら TypeError 例外が送出されます。それ以外の場合、引数値をスロットに埋めていきます。 (式が None であっても、その式でスロットを埋めます)。全ての引数が処理されたら、まだ埋められていないスロットをそれぞれに対応する関数定義時のデフォルト値で埋めます。(デフォルト値は、関数が定義されたときに一度だけ計算されます; 従って、リストや辞書のような変更可能なオブジェクトがデフォルト値として使われると、対応するスロットに引数を指定しない限り、このオブジェクトが全ての呼び出しから共有されます; このような状況は通常避けるべきです。) デフォルト値が指定されていない、値の埋められていないスロットが残っている場合 TypeError 例外が送出されます。そうでない場合、値の埋められたスロットからなるリストが呼び出しの引数として使われます。

実装では、名前を持たない固定引数を受け取る組み込み関数を提供するかもしれません。そういった引数がドキュメント化のために ‘名付けられて’ いたとしても、実際には名付けられていないのでキーワードによって提供されません。 CPython では、C 言語で実装された関数の、名前を持たない固定引数を解析するために PyArg_ParseTuple() を使用します。

仮引数スロットの数よりも多くの固定引数がある場合、構文 *identifier を使って指定された仮引数がないかぎり、 TypeError 例外が送出されます; 仮引数 *identifier がある場合、この仮引数は余分な固定引数が入ったタプル (もしくは、余分な固定引数がない場合には空のタプル) を受け取ります。

キーワード引数のいずれかが仮引数名に対応しない場合、構文 **identifier を使って指定された仮引数がない限り、 TypeError 例外が送出されます; 仮引数 **identifier がある場合、この仮引数は余分なキーワード引数が入った (キーワードをキーとし、引数値をキーに対応する値とした) 辞書を受け取ります。余分なキーワード引数がない場合には、空の (新たな) 辞書を受け取ります。

関数呼び出しの際に構文 *expression が使われるなら、expression の評価はシーケンスでなくてはなりません。このシーケンスの要素は、追加の固定引数のように扱われます; すなわち、固定引数 x1 ,..., xN があり、expression の評価がシーケンス y1 ,..., yM であるなら、M+N 個の固定引数 x1 ,..., xN , y1 ,..., yM を使った呼び出しと同じになります。

*expression 構文はキーワード引数の 後ろ で指定しても良いですが、キーワード引数よりも で指定されたものとして処理されます (**expression 引数を指定したときの振る舞いは以下を参照)。従って、このようになります:

>>> def f(a, b):
...  print(a, b)
...
>>> f(b=1, *(2,))
2 1
>>> f(a=1, *(2,))
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: f() got multiple values for keyword argument 'a'
>>> f(1, *(2,))
1 2

キーワード引数と *expression 構文を同じ呼び出しで一緒に使うことはあまりないので、実際に上記のような混乱が生じることはありません。

関数呼び出しで **expression 構文が使われた場合、 expression の値評価結果はマップ型でなければなりません。辞書の内容は追加のキーワード引数として扱われます。明示的なキーワード引数が expression 内のキーワードと重複した場合には TypeError 例外が送出されます。

*identifier**identifier 構文を使った仮引数は、固定引数スロットやキーワード引数名にすることができません。

呼び出しを行うと、例外を送出しない限り、常に何らかの値を返します。None を返す場合もあります。戻り値がどのように算出されるかは、呼び出し可能オブジェクトの形態によって異なります。

これが—

ユーザ定義関数:

関数のコードブロックに引数リストが渡され、実行されます。コードブロックは、まず仮引数を実引数に結合 (bind) します; この動作については 関数定義 で記述しています。コードブロックで return 文が実行される際に、関数呼び出しの戻り値 (return value) が決定されます。

組み込み関数またはメソッド:

結果はインタプリタに依存します; 組み込み関数やメソッドの詳細は 組み込み関数 を参照してください。

クラスオブジェクト:

そのクラスの新しいインスタンスが返されます。

クラスインスタンスメソッド:

対応するユーザ定義の関数が呼び出されます。このとき、呼び出し時の引数リストより一つ長い引数リストで呼び出されます: インスタンスが引数リストの先頭に追加されます。

クラスインスタンス:

クラスで __call__() メソッドが定義されていなければなりません; __call__() メソッドが呼び出された場合と同じ効果をもたらします。

6.4. べき乗演算 (power operator)

べき乗演算は、左側にある単項演算子よりも強い結合優先順位があります; 一方、右側にある単項演算子よりは低い結合優先順位になっています。構文は以下のようになります:

power ::=  primary ["**" u_expr]

従って、べき乗演算子と単項演算子からなる演算列が丸括弧で囲われていない場合、演算子は右から左へと評価されます (この場合は演算子の評価順序を強制しません。つまり -1**2-1 になります)。

べき乗演算子の意味は、二つの引数で呼び出される組み込み関数 pow() と同じで、左引数を右引数乗して与えます。数値引数はまず共通の型に変換され、結果はその型です。

整数の被演算子では、第二引数が負でない限り、結果は被演算子と同じ型になります; 第二引数が負の場合、全ての引数は浮動小数点型に変換され、浮動小数点型が返されます。例えば 10**2100 を返しますが、10**-20.01 を返します。

0.0 を負の数でべき乗すると ZeroDivisionError を送出します。負の数を小数でべき乗した結果は複素数 (complex number) になります。 (以前のバージョンでは ValueError を送出していました)

6.5. 単項算術演算とビット単位演算(unary arithmetic and bitwise operation)

全ての単項算術演算とビット単位演算は、同じ優先順位を持っています:

u_expr ::=  power | "-" u_expr | "+" u_expr | "~" u_expr

単項演算子 - (マイナス) は、引数となる数値の符号を反転 (negation) します。

単項演算子 + (プラス) は、数値引数を変更しません。

単項演算子 ~ (反転) は、整数引数をビット単位反転 (bitwise invert) したものを与えます。x のビット単位反転は、-(x+1) として定義されています。この演算子は整数にのみ適用されます。

上記の三つはいずれも、引数が正しい型でない場合には TypeError 例外が送出されます。

6.6. 二項算術演算 (binary arithmetic operation)

二項算術演算は、慣習的な優先順位を踏襲しています。演算子のいずれかは、特定の非数値型にも適用されるので注意してください。べき乗 (power) 演算子を除き、演算子には二つのレベル、すなわち乗算的 (multiplicatie) 演算子と加算的 (additie) 演算子しかありません:

m_expr ::=  u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr
            | m_expr "%" u_expr
a_expr ::=  m_expr | a_expr "+" m_expr | a_expr "-" m_expr

* (乗算: multiplication) 演算子は、引数同士の積を与えます。引数は、両方とも数値であるか、片方が整数で他方がシーケンスかのどちらかでなければなりません。前者の場合、数値は共通の型に変換された後乗算されます。後者の場合、シーケンスの繰り返し操作が行われます。繰り返し数を負にすると、空のシーケンスを与えます。

/ (除算: division) および // (切り捨て除算: floor division) は、引数同士の商を与えます。数値引数はまず共通の型に変換されます。整数の除算結果は浮動小数点になりますが、整数の切り捨て除算結果は整数になります; この場合、結果は数学的な除算に ‘floor’ 関数 を適用したものになります。ゼロによる除算を行うと ZeroDivisionError 例外を送出します。

% (モジュロ: modulo) 演算は、第一引数を第二引数で除算したときの剰余になります。数値引数はまず共通の型に変換されます。右引数値がゼロの場合には ZeroDivisionError 例外が送出されます。引数値は浮動小数点でもよく。例えば 3.14%0.70.34 になります (3.144*0.7 + 0.34 だからです)。モジュロ演算子は常に第二引数と同じ符号 (またはゼロ) の結果になります; モジュロ演算の結果の絶対値は、常に第二引数の絶対値よりも小さくなります。 [1]

切り捨て除算演算とモジュロ演算は、恒等式: x == (x//y)*y + (x%y) の関係にあります。切り捨て除算やモジュロはまた、組み込み関数 divmod(): divmod(x, y) == (x//y, x%y) とも関係しています。 [2]

% 演算子は、数値に対するモジュロ演算を行うのに加えて、文字列 (string) オブジェクトにオーバーロードされ、旧式の文字列の書式化 (いわゆる補間) を行います。文字列の書式化の構文は Python ライブラリリファレンス printf 形式の文字列書式化 節を参照してください。

切り捨て除算演算子、モジュロ演算子、および divmod() 関数は、複素数に対しては定義されていません。目的に合うならば、代わりに abs() を使って浮動小数点に変換してください。

+ (加算) 演算は、引数同士の和を与えます。引数は双方とも数値型か、双方とも同じ型のシーケンスでなければなりません。前者の場合、数値は共通の型に変換され、加算されます。後者の場合、シーケンスは結合 (concatenate) されます。

- (減算) 演算は、引数間で減算を行った値を返します。数値引数はまず共通の型に変換されます。

6.7. シフト演算 (shifting operation)

シフト演算は、算術演算よりも低い優先順位を持っています:

shift_expr ::=  a_expr | shift_expr ( "<<" | ">>" ) a_expr

これらは整数を引数にとります。引数は共通の型に変換されます。シフト演算は第一引数を、第二引数で与えられたビット数だけ、左または右にビットシフトします。

n ビットの右シフトは pow(2,n) による除算として定義されます。n ビットの左シフトは pow(2,n) による乗算として定義されます。

注釈

現在の実装では、右辺被演算子は最大でも sys.maxsize でなければなりません。右辺被演算子が sys.maxsize よりも大きいと、 OverflowError 例外が送出されます。

6.8. ビット単位演算の二項演算 (binary bitwise operation)

以下の三つのビット単位演算には、それぞれ異なる優先順位レベルがあります:

and_expr ::=  shift_expr | and_expr "&" shift_expr
xor_expr ::=  and_expr | xor_expr "^" and_expr
or_expr  ::=  xor_expr | or_expr "|" xor_expr

& 演算子は、引数同士のビット単位の AND を与えます。引数は整数でなければなりません。

^ 演算子は、引数同士のビット単位の XOR (排他的 OR) を与えます。引数は整数でなければなりません。

| 演算子は、引数同士のビット単位の (包含的) OR を与えます。引数は整数でなければなりません。

6.9. 比較

C 言語と違って、Python における比較演算子は同じ優先順位をもっており、全ての算術演算子、シフト演算子、ビット単位演算子よりも低くなっています。また a < b < c が数学で伝統的に用いられているのと同じ解釈になる点も C 言語と違います:

comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="
                   | "is" ["not"] | ["not"] "in"

比較演算の結果はブール値: True または False になります。

比較はいくらでも連鎖することができます。例えば x < y <= zx < y and y <= z と等価になります。ただしこの場合、前者では y はただ一度だけ評価される点が異なります (どちらの場合でも、x < y が偽になると z の値はまったく評価されません)。

形式的には、a, b, c, ..., y, z が式で op1, op2, ..., opN が比較演算子である場合、a op1 b op2 c ... y opN za op1 b and b op2 c and ... y opN z と等価になります。ただし、前者では各式は多くても一度しか評価されません。

a op1 b op2 c と書いた場合、a から c までの範囲にあるかどうかのテストを指すのではないことに注意してください。例えば x < y > z は (きれいな書き方ではありませんが) 完全に正しい文法です。

演算子 <>==>=<= 、および != は、二つのオブジェクトの値を比較します。オブジェクトは同じ型である必要はありません。双方が数値であれば、共通の型に変換されます。そうでなければ、 == および != 演算子は、異なる型のオブジェクトを 常に 等しくないとみなします。 <>>= 、および <= 演算子は、与えられた型の対に対して演算子を実装していないような異なる型のオブジェクトを比較するとき TypeError を送出します。組み込み型でないオブジェクトの比較は、 __gt__() などの拡張比較メソッドを定義することで振る舞いを制御できます。これは 基本的なカスタマイズ 節で説明されています。

同じ型のオブジェクト間における比較は、型によって異なります:

  • 数値間の比較では、算術的な比較が行われます。

  • float('NaN') および Decimal('NaN') は特別です。これらは自身と同一で x is x ですが、自身と等価ではなく x != x です。さらに、非数 (not-a-number) 値といかなる値の比較も False を返します。例えば、 3 < float('NaN')float('NaN') < 3False を返します。

  • バイト列オブジェクトは、要素の数値を使って辞書的に (lexicographically) 比較されます。

  • 文字列は、各文字に相当する数値 (組み込み関数 ord() の結果) を使って辞書的に比較されます。[3] 文字列とバイト列は比較できません!

  • タプルやリスト間の比較では、対応する各要素の比較結果を使って辞書的な比較が行われます。このため、二つのシーケンスを等価にするためには、各要素が完全に等価でなくてはならず、シーケンスは同じ型で同じ長さをもっていなければなりません。

    二つのシーケンスは、等価でなければ、最初の異なる要素間の比較に従って順序付けられます。例えば [1,2,x] <= [1,2,y] の値は x <= y と等しいです。対応する要素がなければ、短い方のシーケンスが先に並びます (例えば、[1,2] < [1,2,3] です)。

  • マッピング (辞書) は、同じ (key, value) の対を持つときのみ等しくなります。順序比較 ('<', '<=', '>=', '>')TypeError を送出します。

  • 集合や凍結集合は、比較演算子を部分集合検査や上位集合検査を意味するものとして定義します。この関係は全順序を定義しません (二つの集合 {1,2}{2,3} は等しくなく、一方が他方の部分集合ではなく、一方が他方の上位集合でもありません)。従って、集合は、全順序に依存する関数の引数として適切ではありません。例えば、 min()max()sorted() は、入力として与えられた集合のリストに対して、定義されていない結果を生みます。

  • その他のほとんどの組み込み型のオブジェクト比較では、同じオブジェクトでないかぎり等価にはなりません; あるオブジェクトの他のオブジェクトに対する大小関係は任意に決定され、一つのプログラムの実行中は一貫したものとなります。

異なる型のオブジェクトの比較はデータ型が明示的に比較をサポートしているかどうかに依存します。ほとんどの数値型はその他のデータ型と比較できます。データ型間比較がサポートされていない場合、比較メソッドは NotImplemented を返します。

演算子 in および not in は、帰属 (membership) を調べます。 x in s の評価は、 xs の要素であれば真となり、そうでなければ偽となります。 x not in sx in s の否定 (negation) を返します。すべての組み込みのシーケンスと集合型に加えて、辞書も、 in を辞書が与えられたキーを持っているかを調べるものとしてサポートしています。リスト、タプル、集合、凍結集合、辞書、あるいは collection.deque のようなコンテナ型について、式 x in yany(x is e or x == e for e in y) と等価です。

文字列やバイト列型については、x in yxy の部分文字列であるとき、かつそのときに限り真になります。これは y.find(x) != -1 と等価です。空文字列は、他の任意の文字列の部分文字列とみなされます。従って "" in "abc"True を返すことになります。

__contains__() メソッドの定義されたユーザ定義クラスでは、 x in y が真となるのは y.__contains__(x) が真となるとき、かつそのときに限ります。

__contains__() を定義していないが __iter__() は定義しているユーザ定義クラスでは、 x in yx == z となるようなある値 zy 内にわたる反復で生成された場合、 true となります。もし、反復の間に例外が発生すれば、 in が例外を発生させたようにみえます。

最終的には、旧式の反復プロトコルの実行が試みられます。クラスが __getitem__() を定義していれば、 x in yx == y[i] となるような非負の整数インデックス i が存在し、それより小さなインデックスが IndexError を送出しないとき、かつそのときにかぎり真です。 (別の何らかの例外が送出された場合、例外は in から送出されたかのようになります)。

演算子 not inin の真値を反転した値として定義されています。

演算子 is および is not は、オブジェクトの同一性に対するテストを行います: x is y は、 xy が同じオブジェクトを指すとき、かつそのときに限り真になります。 x is not yis の真値を反転したものになります。 [4]

6.10. ブール演算 (boolean operation)

or_test  ::=  and_test | or_test "or" and_test
and_test ::=  not_test | and_test "and" not_test
not_test ::=  comparison | "not" not_test

ブール演算のコンテキストや、式が制御フロー文中で使われる際には、以下の値: FalseNone すべての型における数値の 0、空の文字列、空のコンテナ (文字列、タプル、リスト、辞書、集合、凍結集合など) は偽 (false) であると解釈されます。それ以外の値は真 (true) であると解釈されます。ユーザ定義のメソッドは、 __bool__() メソッドを与えることで、真理値をカスタマイズできます。

演算子 not は、引数が偽である場合には True を、それ以外の場合には False になります。

x and y は、まず x を評価します; x が偽なら x の値を返します; それ以外の場合には、y の値を評価し、その結果を返します。

x or y は、まず x を評価します; x が真なら x の値を返します; それ以外の場合には、y の値を評価し、その結果を返します。

(なお、 andor も、返す値を TrueFalse に制限せず、最後に評価した引数を返します。この仕様が便利なこともあり、例えば s が文字列で、空文字列ならデフォルトの値に置き換えたいとき、式 s or 'foo' は望んだ値を与えます。 not は引数の型に関係なく、必ずブール値を返すからです。例えば、 not 'foo' は、 '' ではなく False を与えます。)

6.11. 条件演算 (Conditional Expressions)

conditional_expression ::=  or_test ["if" or_test "else" expression]
expression             ::=  conditional_expression | lambda_expr
expression_nocond      ::=  or_test | lambda_expr_nocond

条件演算式 (しばしば、”三項演算子” と呼ばれます) は最も優先度が低いPython の操作です。

x if C else y という式は最初に条件 x ではなく C を評価します; C が true の場合 x が評価され値が返されます; それ以外の場合には y が評価され返されます。

条件演算に関してより詳しくは PEP 308 を参照してください。

6.12. ラムダ (lambda)

lambda_expr        ::=  "lambda" [parameter_list]: expression
lambda_expr_nocond ::=  "lambda" [parameter_list]: expression_nocond

ラムダ式 (lambda expression または lambda forms) は無名関数を作成するのに使います; 式 lambda arguments: expression は関数オブジェクトになります。ラムダで表される無名オブジェクトは以下の関数オブジェクト同様に動作します

def <lambda>(arguments):
    return expression

パラメータの構文の一覧は 関数定義 を参照してください。ラムダ式で作成された関数は命令文や注釈を含むことができない点に注意してください。

6.13. 式のリスト

expression_list ::=  expression ( "," expression )* [","]

少なくとも一つのカンマを含む式のリストは、タプルになります。タプルの長さは、リスト中の式の数に等しくなります。

リスト中の式は左から右へと順に評価されます。単一要素のタプル (別名 単集合 (singleton)) を作りたければ、末尾にカンマが必要です。単一の式だけで、末尾にカンマをつけない場合には、タプルではなくその式の値になります (空のタプルを作りたいなら、中身が空の丸括弧ペア: () を使います。)

6.14. 評価順序

Python は、式を左から右へと順に評価します。ただし、代入式を評価するときは、代入演算子の右側項が左側項よりも先に評価されます。

以下に示す実行文の各行での評価順序は、添え字の数字順序と同じになります:

expr1, expr2, expr3, expr4
(expr1, expr2, expr3, expr4)
{expr1: expr2, expr3: expr4}
expr1 + expr2 * (expr3 - expr4)
expr1(expr2, expr3, *expr4, **expr5)
expr3, expr4 = expr1, expr2

6.15. 演算子の優先順位

以下の表は、Python における演算子を、優先順位の最も低い (結合が最も弱い) ものから最も高い (結合が最も強い) ものへ順に並べたものです。同じボックス内の演算子の優先順位は同じです。構文が特に示されていない演算子は、二項演算子です。同じボックス内の演算子は、左から右へとグループ化されます (例外として、べき乗は右から左にグループ化されます)。

比較 で述べられているように、比較、帰属、同一性のテストは全てが同じ優先順位を持っていて、左から右に連鎖する特徴を持っていることに注意してください。

演算子

説明

lambda

ラムダ式

ifelse

条件演算

or

ブール演算 OR

and

ブール演算 AND

not x

ブール演算 NOT

in, not in, is, is not, <, <=, >, >=, !=, ==

帰属や同一性のテストを含む比較

|

ビット単位 OR

^

ビット単位 XOR

&

ビット単位 AND

<<, >>

シフト演算

+, -

加算および減算

*, /, //, %

乗算、除算、剰余 [5]

+x, -x, ~x

正符号、負符号、ビット単位 NOT

**

べき乗 [6]

x[index], x[index:index], x(arguments...), x.attribute

添字指定、スライス操作属性参照

(expressions...), [expressions...], {key: value...}, {expressions...}

式結合またはタプル表示、リスト表示、辞書表示、集合表示

脚注

[1]

abs(x%y) < abs(y) は数学的には真となりますが、浮動小数点に対する演算の場合には、値丸め (roundoff) のために数値計算的に真にならない場合があります。例えば、Python の浮動小数点型が IEEE754 倍精度数型になっているプラットフォームを仮定すると、 -1e-100 % 1e1001e100 と同じ符号になるはずなのに、計算結果は -1e-100 + 1e100 となります。これは数値計算的には厳密に 1e100 と等価です。関数 math.fmod() は、最初の引数と符号が一致するような値を返すので、上記の場合には -1e-100 を返します。どちらのアプローチが適切かは、アプリケーションに依存します。

[2]

x が y の正確な整数倍に非常に近いと、丸めのために x//y(x-x%y)//y よりも 1 だけ大きくなる可能性があります。そのような場合、Python は divmod(x,y)[0] * y + x % yx に非常に近くなるという関係を保つために、後者の値を返します。

[3]

文字列間の比較はバイトレベルでは意味があるとはいえ、ユーザにとっては直感的ではないかもしれません。例えば、文字列 "\u00C7""\u0043\u0327" は、両方の文字列が同じユニコード文字 (LATIN CAPITAL LETTER C WITH CEDILLA) で表されたとしても違うものとして比較されます。人間が分かり易い方法で文字列を比較するには unicodedata.normalize() を使用して比較してください。

[4]

自動的なガベージコレクション、フリーリスト、ディスクリプタの動的特性のために、インスタンスメソッドや定数の比較を行うようなときに is 演算子の利用は、一見すると普通ではない振る舞いだと気付くかもしれません。詳細はそれぞれのドキュメントを確認してください。

[5]

% 演算子は文字列フォーマットにも使われ、同じ優先順位が当てはまります。

[6]

べき乗演算子 ** はその右側にある単項演算子かビット単位演算子よりも優先して束縛されます。つまり 2**-10.5 になります。