6. 式—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.6/reference/expressions
移動先:案内検索

6.6。 式

この章では、Pythonでの式の要素の意味について説明します。

構文上の注意:この章と次の章では、拡張BNF表記を使用して、字句解析ではなく構文を記述します。 構文ルール(の1つの選択肢)が次の形式の場合

名前 ::=  othername

セマンティクスが指定されていない場合、この形式のnameのセマンティクスはothernameの場合と同じです。

6.1。 算術変換

以下の算術演算子の説明で「数値引数は共通の型に変換されます」という句を使用すると、組み込み型の演算子の実装は次のように機能します。

  • どちらかの引数が複素数の場合、もう一方は複素数に変換されます。
  • それ以外の場合、いずれかの引数が浮動小数点数の場合、もう一方は浮動小数点に変換されます。
  • それ以外の場合は、両方とも整数である必要があり、変換は必要ありません。

特定の演算子には、いくつかの追加の規則が適用されます(たとえば、「%」演算子の左引数としての文字列)。 拡張機能は、独自の変換動作を定義する必要があります。


6.2。 原子

アトムは式の最も基本的な要素です。 最も単純なアトムは識別子またはリテラルです。 括弧、角かっこ、または中括弧で囲まれたフォームも、構文的にアトムとして分類されます。 アトムの構文は次のとおりです。

原子      ::=  identifier | literal | enclosure
囲い ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom

6.2.1。 識別子(名前)

アトムとして出現する識別子は名前です。 字句の定義についてはセクション識別子とキーワードを、命名とバインディングのドキュメントについてはセクション命名とバインディングを参照してください。

名前がオブジェクトにバインドされている場合、アトムを評価するとそのオブジェクトが生成されます。 名前がバインドされていない場合、その名前を評価しようとすると、 NameError 例外が発生します。

プライベート名マングリング:クラス定義でテキストで出現する識別子が2つ以上のアンダースコア文字で始まり、2つ以上のアンダースコアで終わらない場合、プライベート名と見なされます。そのクラス。 プライベート名は、コードが生成される前に、より長い形式に変換されます。 トランスフォーメーションは、名前の前に、先頭の下線を削除し、単一の下線を挿入したクラス名を挿入します。 たとえば、Hamという名前のクラスで発生する識別子__spamは、_Ham__spamに変換されます。 この変換は、識別子が使用される構文コンテキストとは無関係です。 変換された名前が非常に長い(255文字より長い)場合、実装で定義された切り捨てが発生する可能性があります。 クラス名がアンダースコアのみで構成されている場合、変換は行われません。


6.2.2。 リテラル

Pythonは、文字列とバイトのリテラル、およびさまざまな数値リテラルをサポートしています。

リテラル ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber

リテラルを評価すると、指定されたタイプ(文字列、バイト、整数、浮動小数点数、複素数)のオブジェクトが指定された値で生成されます。 浮動小数点および虚数(複素数)リテラルの場合、値は概算される場合があります。 詳細については、セクションリテラルを参照してください。

すべてのリテラルは不変のデータ型に対応しているため、オブジェクトのIDはその値ほど重要ではありません。 同じ値(プログラムテキスト内の同じオカレンスまたは異なるオカレンス)を持つリテラルの複数の評価は、同じオブジェクトまたは同じ値を持つ異なるオブジェクトを取得する場合があります。


6.2.3。 括弧で囲まれたフォーム

括弧で囲まれた形式は、括弧で囲まれたオプションの式リストです。

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

括弧で囲まれた式リストは、その式リストが生成するものをすべて生成します。リストに少なくとも1つのコンマが含まれている場合、タプルが生成されます。 それ以外の場合は、式リストを構成する単一の式が生成されます。

括弧の空のペアは、空のタプルオブジェクトを生成します。 タプルは不変であるため、リテラルのルールが適用されます(つまり、空のタプルが2回出現すると、同じオブジェクトが生成される場合と生成されない場合があります)。

タプルは括弧ではなく、コンマ演算子を使用して形成されることに注意してください。 例外は空のタプルで、括弧である必要があります。式で括弧なしの「何も」を許可すると、あいまいさが生じ、一般的なタイプミスがキャッチされないまま通過する可能性があります。


6.2.4。 リスト、セット、辞書の表示

リスト、セット、または辞書を作成するために、Pythonは「ディスプレイ」と呼ばれる特別な構文を提供し、それぞれに2つのフレーバーがあります。

  • コンテナの内容が明示的にリストされているか、
  • これらは、理解と呼ばれる一連のループおよびフィルタリング命令を介して計算されます。

内包表記の一般的な構文要素は次のとおりです。

理解 ::=  expression comp_for
  comp_for      ::=  [ASYNC] "for" target_list "in" or_test [comp_iter]
  comp_iter     ::=  comp_for | comp_if
  comp_if       ::=  "if" expression_nocond [comp_iter]

内包表記は、単一の式と、それに続く少なくとも1つの for 句と0個以上の for または if 句で構成されます。 この場合、新しいコンテナの要素は、 for または if 句のそれぞれをブロックと見なし、左から右にネストし、式を評価することによって生成される要素です。最も内側のブロックに到達するたびに要素を生成します。

理解は別のスコープで実行されるため、ターゲットリストで割り当てられた名前は、囲んでいるスコープに「リーク」しないことに注意してください。

Python 3.6以降、 async def 関数では、 async for 句を使用して非同期イテレーターを反復処理できます。 async def 関数の内包表記は、先頭の式に続く for または async for 句で構成され、追加の for が含まれる場合があります。または async for 句、および await 式を使用することもできます。 内包表記に async for 句または await 式のいずれかが含まれている場合、それは非同期内包表記と呼ばれます。 非同期理解は、それが現れるコルーチン関数の実行を一時停止する場合があります。 PEP 530 も参照してください。


6.2.5。 リスト表示

リスト表示は、角括弧で囲まれた空の一連の式です。

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

リスト表示により、新しいリストオブジェクトが生成されます。内容は、式のリストまたは内包表記のいずれかによって指定されます。 式のコンマ区切りリストが指定されている場合、その要素は左から右に評価され、その順序でリストオブジェクトに配置されます。 理解度が指定されると、リストは理解度から得られた要素から作成されます。


6.2.6。 ディスプレイを設定する

セット表示は中括弧で示され、キーと値を区切るコロンがないことで辞書表示と区別できます。

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

セット表示は、新しい可変セットオブジェクトを生成します。内容は、一連の式または内包表記のいずれかによって指定されます。 式のコンマ区切りリストが指定されている場合、その要素は左から右に評価され、セットオブジェクトに追加されます。 理解が提供されると、セットは理解から生じる要素から構築されます。

{}で空のセットを作成することはできません。 このリテラルは空の辞書を作成します。


6.2.7。 辞書が表示されます

辞書の表示は、中括弧で囲まれた空の一連のキー/データムのペアです。

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

ディクショナリ表示により、新しいディクショナリオブジェクトが生成されます。

キー/データムペアのコンマ区切りシーケンスが指定されている場合、それらは左から右に評価されてディクショナリのエントリが定義されます。各キーオブジェクトは、対応するデータムを格納するためのディクショナリへのキーとして使用されます。 これは、キー/データムリストで同じキーを複数回指定でき、そのキーの最終的なディクショナリの値が最後に指定されることを意味します。

二重アスタリスク**は、辞書の解凍を示します。 そのオペランドは mapping でなければなりません。 各マッピング項目が新しい辞書に追加されます。 後の値は、前のキー/データムペアおよび以前のディクショナリアンパックによってすでに設定されている値を置き換えます。

バージョン3.5の新機能:辞書表示への解凍。元々は PEP 448 によって提案されました。


リスト内包表記やセット内包表記とは対照的に、辞書内包表記には、コロンで区切られた2つの式と、それに続く通常の「for」句と「if」句が必要です。 理解が実行されると、結果のキー要素と値要素が、生成された順序で新しいディクショナリに挿入されます。

キー値のタイプに関する制限は、セクション標準タイプ階層で前述されています。 (要約すると、キータイプは hashable である必要があります。これにより、すべての可変オブジェクトが除外されます。)重複キー間の衝突は検出されません。 特定のキー値に対して格納されている最後のデータ(テキストではディスプレイの右端)が優先されます。


6.2.8。 ジェネレータ式

ジェネレータ式は、括弧内のコンパクトなジェネレータ表記です。

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

ジェネレータ式は、新しいジェネレータオブジェクトを生成します。 その構文は、括弧や中括弧の代わりに括弧で囲まれていることを除いて、内包表記の場合と同じです。

ジェネレーター式で使用される変数は、 __ next __()メソッドがジェネレーターオブジェクトに対して呼び出されると(通常のジェネレーターと同じ方法で)遅延評価されます。 ただし、左端の for 句はすぐに評価されるため、ジェネレータ式を処理するコードで発生する可能性のある他のエラーの前に、この句によって生成されたエラーを確認できます。 後続の for 句は、前の for ループに依存している可能性があるため、すぐに評価することはできません。 例:(x*y for x in range(10) for y in bar(x))

引数が1つしかない呼び出しでは、括弧を省略できます。 詳細については、セクション呼び出しを参照してください。

Python 3.6以降、ジェネレーターが async def 関数に表示される場合、 async for 句と await 式は非同期理解と同様に許可されます。 ジェネレータ式に async for 句または await 式が含まれている場合、非同期ジェネレータ式と呼ばれます。 非同期ジェネレーター式は、非同期イテレーターである新しい非同期ジェネレーターオブジェクトを生成します(非同期イテレーターを参照)。


6.2.9。 降伏式

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

イールド式は、ジェネレーター関数または非同期ジェネレーター関数を定義するときに使用されるため、関数定義の本体でのみ使用できます。 関数の本体でyield式を使用すると、その関数がジェネレーターになり、 async def 関数の本体で使用すると、そのコルーチン関数が非同期ジェネレーターになります。 例えば:

def gen():  # defines a generator function
    yield 123

async def agen(): # defines an asynchronous generator function
    yield 123

ジェネレーター関数については以下で説明しますが、非同期ジェネレーター関数については、セクション非同期ジェネレーター関数で個別に説明します。

ジェネレーター関数が呼び出されると、ジェネレーターと呼ばれるイテレーターが返されます。 次に、そのジェネレーターがジェネレーター関数の実行を制御します。 ジェネレータのメソッドの1つが呼び出されると、実行が開始されます。 その時点で、実行は最初のyield式に進み、そこで再び中断され、 expression_list の値がジェネレーターの呼び出し元に返されます。 一時停止とは、ローカル変数の現在のバインディング、命令ポインター、内部評価スタック、および例外処理の状態を含む、すべてのローカル状態が保持されることを意味します。 ジェネレーターのメソッドの1つを呼び出して実行を再開すると、関数は、yield式が単なる別の外部呼び出しであるかのように正確に続行できます。 再開後のyield式の値は、実行を再開したメソッドによって異なります。 __ next __()が使用されている場合(通常は for または next()組み込みのいずれかを介して)、結果は None になります。 それ以外の場合、 send()が使用されると、結果はそのメソッドに渡される値になります。

これらすべてにより、ジェネレーター関数はコルーチンと非常によく似たものになります。 それらは複数回生成され、複数のエントリポイントがあり、実行を一時停止できます。 唯一の違いは、ジェネレーター関数は、生成後に実行を続行する場所を制御できないことです。 制御は常にジェネレーターの呼び出し元に転送されます。

降伏式は、 try コンストラクトのどこでも許可されます。 ジェネレーターがファイナライズされる前に再開されない場合(参照カウントがゼロになるか、ガベージコレクションされることにより)、ジェネレーターイテレーターの close()メソッドが呼び出され、保留中の最終的に[ X220X]実行する句。

yield from <expr>を使用すると、指定された式がサブイテレーターとして扱われます。 そのサブイテレーターによって生成されたすべての値は、現在のジェネレーターのメソッドの呼び出し元に直接渡されます。 send()で渡された値、および throw()で渡された例外は、適切なメソッドがある場合、基になるイテレーターに渡されます。 そうでない場合、 send()AttributeError または TypeError を発生させますが、 throw()は合格を発生させますすぐに例外。

基になるイテレータが完了すると、発生した StopIteration インスタンスのvalue属性がyield式の値になります。 StopIteration を上げるときに明示的に設定することも、サブイテレータがジェネレータであるときに自動的に設定することもできます(サブジェネレータから値を返すことによって)。

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


代入ステートメントの右側にあるyield式が唯一の式である場合は、括弧を省略できます。

も参照してください

PEP 255 -シンプルなジェネレーター
ジェネレーターと yield ステートメントをPythonに追加するための提案。
PEP 342 -拡張ジェネレーターを介したコルーチン
ジェネレーターのAPIと構文を拡張して、単純なコルーチンとして使用できるようにする提案。
PEP 380 -サブジェネレーターに委任するための構文
yield_from構文を導入し、サブジェネレーターへの委任を容易にする提案。
PEP 525 -非同期発電機
コルーチン機能にジェネレーター機能を追加することにより、 PEP 492 を拡張した提案。


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

このサブセクションでは、ジェネレータイテレータのメソッドについて説明します。 これらは、ジェネレーター関数の実行を制御するために使用できます。

ジェネレーターがすでに実行されているときに以下のジェネレーターメソッドのいずれかを呼び出すと、 ValueError 例外が発生することに注意してください。

generator.__next__()

ジェネレーター関数の実行を開始するか、最後に実行されたyield式で再開します。 __ next __()メソッドを使用してジェネレーター関数を再開すると、現在のyield式は常に None と評価されます。 その後、実行は次のyield式に進み、ジェネレーターが再び中断され、 expression_list の値が __ next __()の呼び出し元に返されます。 ジェネレータが別の値を生成せずに終了すると、 StopIteration 例外が発生します。

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

generator.send(value)
実行を再開し、値をジェネレーター関数に「送信」します。 value 引数は、現在のyield式の結果になります。 send()メソッドは、ジェネレーターによって生成された次の値を返すか、ジェネレーターが別の値を生成せずに終了した場合は StopIteration を発生させます。 send()を呼び出してジェネレーターを起動する場合、値を受け取ることができるyield式がないため、引数として None を指定して呼び出す必要があります。
generator.throw(type[, value[, traceback]])
ジェネレーターが一時停止した時点でタイプtypeの例外を発生させ、ジェネレーター関数によって生成された次の値を返します。 ジェネレータが別の値を生成せずに終了すると、 StopIteration 例外が発生します。 ジェネレーター関数が渡された例外をキャッチしない場合、または別の例外を発生させる場合、その例外は呼び出し元に伝播します。

generator.close()
ジェネレーター関数が一時停止した時点で GeneratorExit を発生させます。 その後、ジェネレーター関数が正常に終了するか、すでに閉じられているか、 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の使用例については、「Pythonの新機能」の PEP 380:サブジェネレーターに委任するための構文を参照してください。


6.2.9.3。 非同期発電機機能

async def を使用して定義された関数またはメソッドにyield式が存在すると、その関数は非同期ジェネレーター関数としてさらに定義されます。

非同期ジェネレーター関数が呼び出されると、非同期ジェネレーターオブジェクトと呼ばれる非同期イテレーターが返されます。 次に、そのオブジェクトがジェネレーター関数の実行を制御します。 非同期ジェネレーターオブジェクトは通常、コルーチン関数の async for ステートメントで使用されます。これは、ジェネレーターオブジェクトが for ステートメントで使用される方法と同様です。

非同期ジェネレーターのメソッドの1つを呼び出すと、 awaitable オブジェクトが返され、このオブジェクトが待機されると実行が開始されます。 その時点で、実行は最初のyield式に進み、そこで再び中断され、 expression_list の値が待機中のコルーチンに返されます。 ジェネレーターと同様に、一時停止とは、ローカル変数の現在のバインディング、命令ポインター、内部評価スタック、および例外処理の状態を含む、すべてのローカル状態が保持されることを意味します。 非同期ジェネレーターのメソッドによって返される次のオブジェクトを待機することによって実行が再開されると、関数は、yield式が単なる別の外部呼び出しであるかのように正確に続行できます。 再開後のyield式の値は、実行を再開したメソッドによって異なります。 __anext__()を使用すると、結果は None になります。 それ以外の場合、asend()が使用されると、結果はそのメソッドに渡される値になります。

非同期ジェネレーター関数では、yield式は try コンストラクトのどこでも許可されます。 ただし、非同期ジェネレーターがファイナライズされる前に再開されない場合(参照カウントがゼロになるか、ガベージコレクションされることにより)、 try コンストラクト内のyield式により、pending [の実行に失敗する可能性があります。 X245X]最後に句。 この場合、非同期ジェネレーターを実行するイベントループまたはスケジューラーは、非同期ジェネレーター-イテレーターのaclose()メソッドを呼び出し、結果のコルーチンオブジェクトを実行する責任があります。これにより、保留中の最終的にが許可されます。実行する句。

ファイナライズを処理するには、イベントループで finalizer 関数を定義する必要があります。この関数は、非同期ジェネレータイテレータを受け取り、おそらくaclose()を呼び出してコルーチンを実行します。 このファイナライザーは、 sys.set_asyncgen_hooks()を呼び出すことで登録できます。 最初に繰り返されるとき、非同期ジェネレーター-イテレーターは、ファイナライズ時に呼び出される登録済みのファイナライザーを格納します。 finalizer メソッドの参照例については、:source: `Lib / asyncio / base_events.py`asyncio.Loop.shutdown_asyncgensの実装を参照してください。

yield from <expr>は、非同期ジェネレーター関数で使用される場合の構文エラーです。


6.2.9.4。 非同期のジェネレーター-イテレーターメソッド

このサブセクションでは、ジェネレーター関数の実行を制御するために使用される非同期ジェネレーターイテレーターのメソッドについて説明します。


6.3。 予備選挙

プライマリーは、言語の最も緊密にバインドされた操作を表します。 それらの構文は次のとおりです。

主要な ::=  atom | attributeref | subscription | slicing | call

6.3.1。 属性参照

属性参照は、プライマリの後にピリオドと名前が続きます。

attributeref ::=  primary "." identifier

プライマリは、ほとんどのオブジェクトが行う属性参照をサポートするタイプのオブジェクトに評価する必要があります。 次に、このオブジェクトは、名前が識別子である属性を生成するように求められます。 このプロダクションは、__getattr__()メソッドをオーバーライドすることでカスタマイズできます。 この属性が使用できない場合、例外 AttributeError が発生します。 それ以外の場合、生成されるオブジェクトのタイプと値はオブジェクトによって決定されます。 同じ属性参照を複数回評価すると、異なるオブジェクトが生成される場合があります。


6.3.2。 サブスクリプション

サブスクリプションは、シーケンス(文字列、タプル、またはリスト)またはマッピング(辞書)オブジェクトのアイテムを選択します。

サブスクリプション ::=  primary "[" expression_list "]"

プライマリは、サブスクリプションをサポートするオブジェクト(リストや辞書など)に評価する必要があります。 ユーザー定義オブジェクトは、__getitem__()メソッドを定義することにより、サブスクリプションをサポートできます。

組み込みオブジェクトの場合、サブスクリプションをサポートするオブジェクトには次の2つのタイプがあります。

プライマリがマッピングの場合、式リストは、値がマッピングのキーの1つであるオブジェクトに評価される必要があり、サブスクリプションは、そのキーに対応するマッピング内の値を選択します。 (式リストは、項目が1つしかない場合を除いて、タプルです。)

プライマリがシーケンスの場合、式リストは整数またはスライスに評価される必要があります(次のセクションで説明します)。

正式な構文では、シーケンス内の負のインデックスについて特別な規定はありません。 ただし、組み込みシーケンスはすべて、シーケンスの長さをインデックスに追加することによって負のインデックスを解釈する__getitem__()メソッドを提供します(x[-1]xの最後の項目を選択するように) )。 結果の値は、シーケンス内のアイテムの数よりも小さい非負の整数である必要があり、サブスクリプションは、インデックスがその値であるアイテムを選択します(ゼロから数えます)。 負のインデックスとスライスのサポートはオブジェクトの__getitem__()メソッドで発生するため、このメソッドをオーバーライドするサブクラスは、そのサポートを明示的に追加する必要があります。

文字列の項目は文字です。 文字は個別のデータ型ではなく、1文字だけの文字列です。


6.3.3。 スライス

スライスは、シーケンスオブジェクト内のアイテムの範囲(文字列、タプル、リストなど)を選択します。 スライスは、式として、または代入または del ステートメントのターゲットとして使用できます。 スライスの構文:

スライス      ::=  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
ストライド       ::=  expression

ここでの正式な構文にはあいまいさがあります。式リストのように見えるものはすべてスライスリストのようにも見えるため、サブスクリプションはスライスとして解釈できます。 構文をさらに複雑にするのではなく、この場合、サブスクリプションとしての解釈がスライスとしての解釈よりも優先されることを定義することで、これを明確にします(これは、スライスリストに適切なスライスが含まれていない場合です)。

スライスのセマンティクスは次のとおりです。 プライマリは、次のように、スライスリストから作成されたキーで(通常のサブスクリプションと同じ__getitem__()メソッドを使用して)インデックス付けされます。 スライスリストに少なくとも1つのコンマが含まれている場合、キーはスライスアイテムの変換を含むタプルです。 それ以外の場合は、単独のスライスアイテムの変換が重要です。 式であるスライスアイテムの変換は、その式です。 適切なスライスの変換は、startstop、およびstep属性がの値であるスライスオブジェクト(セクション標準タイプ階層を参照)です。欠落している式をNoneに置き換えて、それぞれ下限、上限、ストライドとして指定された式。


6.3.4。 呼び出し

呼び出しは、空の可能性のある一連の引数を使用して呼び出し可能オブジェクト(関数など)を呼び出します。

電話                 ::=  primary "(" [argument_list [","] | comprehension] ")"
  arguments_list        ::=  positional_arguments ["," starred_and_keywords]
                            ["," keywords_arguments]
                          | starred_and_keywords ["," keywords_arguments]
                          | keywords_arguments
  positional_arguments ::=  ["*"] expression ("," ["*"] expression)*
  starred_and_keywords ::=  ("*" expression | keyword_item)
                          ("," "*" expression | "," keyword_item)*
  keywords_arguments   ::=  (keyword_item | "**" expression)
                          ("," keyword_item | "," "**" expression)*
 キーワード_アイテム         ::=  identifier "=" expression

オプションの末尾のコンマは、positional引数とkeyword引数の後に存在する場合がありますが、セマンティクスには影響しません。

プライマリは呼び出し可能なオブジェクトに評価する必要があります(ユーザー定義関数、組み込み関数、組み込みオブジェクトのメソッド、クラスオブジェクト、クラスインスタンスのメソッド、および__call__()メソッドを持つすべてのオブジェクトが呼び出し可能です)。 すべての引数式は、呼び出しが試行される前に評価されます。 正式なパラメータリストの構文については、セクション関数定義を参照してください。

キーワード引数が存在する場合、次のように、最初に位置引数に変換されます。 最初に、仮パラメータ用に埋められていないスロットのリストが作成されます。 N個の位置引数がある場合、それらは最初のN個のスロットに配置されます。 次に、キーワード引数ごとに、識別子を使用して対応するスロットを決定します(識別子が最初の仮パラメーター名と同じである場合は、最初のスロットが使用されます)。 スロットがすでに埋められている場合、 TypeError 例外が発生します。 それ以外の場合、引数の値はスロットに配置されて埋められます(式がNoneの場合でも、スロットが埋められます)。 すべての引数が処理されると、まだ埋められていないスロットは、関数定義からの対応するデフォルト値で埋められます。 (デフォルト値は、関数の定義時に一度計算されます。したがって、デフォルト値として使用されるリストやディクショナリなどの可変オブジェクトは、対応するスロットの引数値を指定しないすべての呼び出しで共有されます。これは、通常は回避されます。)デフォルト値が指定されていないスロットが埋められていない場合、 TypeError 例外が発生します。 それ以外の場合は、埋められたスロットのリストが呼び出しの引数リストとして使用されます。

仮パラメータスロットよりも多くの位置引数がある場合、構文*identifierを使用する仮パラメータが存在しない限り、 TypeError 例外が発生します。 この場合、その仮パラメーターは、過剰な位置引数を含むタプル(または、過剰な位置引数がなかった場合は空のタプル)を受け取ります。

キーワード引数が仮パラメータ名に対応していない場合、構文**identifierを使用する仮パラメータが存在しない限り、 TypeError 例外が発生します。 この場合、その仮パラメーターは、過剰なキーワード引数を含むディクショナリ(キーワードをキーとして使用し、引数値を対応する値として使用)を受け取るか、過剰なキーワード引数がない場合は(新しい)空のディクショナリを受け取ります。

構文*expressionが関数呼び出しに含まれている場合、expressioniterable と評価される必要があります。 これらの反復可能要素の要素は、追加の位置引数であるかのように扱われます。 呼び出しf(x1, x2, *y, x3, x4)の場合、 y がシーケンス y1 、…、 yM と評価される場合、これはM +4を使用した呼び出しと同等です。位置引数 x1x2y1 、…、 yMx3 、 x4 [X229X ]。

この結果、*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 <module>
TypeError: f() got multiple values for keyword argument 'a'
>>> f(1, *(2,))
1 2

キーワード引数と*expression構文の両方が同じ呼び出しで使用されることは珍しいため、実際にはこの混乱は発生しません。

構文**expressionが関数呼び出しに含まれている場合、expressionmapping に評価される必要があり、その内容は追加のキーワード引数として扱われます。 キーワードがすでに存在する場合(明示的なキーワード引数として、または別のアンパックから)、 TypeError 例外が発生します。

構文*identifierまたは**identifierを使用する仮パラメーターは、位置引数スロットまたはキーワード引数名として使用できません。

バージョン3.5で変更:関数呼び出しは任意の数の*および**アンパックを受け入れ、位置引数は反復可能なアンパック(*)の後に続く場合があり、キーワード引数辞書の解凍(**)に従う場合があります。 PEP 448 によって最初に提案されました。


呼び出しは、例外が発生しない限り、常に何らかの値、場合によってはNoneを返します。 この値の計算方法は、呼び出し可能なオブジェクトのタイプによって異なります。

もしそれが-

ユーザー定義関数:
関数のコードブロックが実行され、引数リストが渡されます。 コードブロックが最初に行うことは、仮パラメーターを引数にバインドすることです。 これについては、セクション関数定義で説明されています。 コードブロックが return ステートメントを実行するとき、これは関数呼び出しの戻り値を指定します。
組み込み関数またはメソッド:
結果は通訳次第です。 組み込み関数とメソッドの説明については、組み込み関数を参照してください。
クラスオブジェクト:
そのクラスの新しいインスタンスが返されます。
クラスインスタンスメソッド:
対応するユーザー定義関数が呼び出され、呼び出しの引数リストより1つ長い引数リストが使用されます。インスタンスが最初の引数になります。
クラスインスタンス:
クラスは__call__()メソッドを定義する必要があります。 その場合、効果はそのメソッドが呼び出された場合と同じになります。


6.4。 式を待つ

awaitable オブジェクトでのコルーチンの実行を一時停止します。 コルーチン関数内でのみ使用できます。

  await_expr ::=  "await" primary

バージョン3.5の新機能。


6.5。 電力事業者

べき乗演算子は、左側の単項演算子よりも緊密に結合します。 右側の単項演算子よりも緊密に結合しません。 構文は次のとおりです。

パワー ::=  (await_expr | primary) ["**" u_expr]

したがって、括弧なしの累乗演算子と単項演算子のシーケンスでは、演算子は右から左に評価されます(これは、オペランドの評価順序を制約しません)。-1**2-1になります。

累乗演算子は、2つの引数を指定して呼び出された場合、組み込みの pow()関数と同じセマンティクスを持ちます。つまり、左の引数を右の引数の累乗で累乗します。 数値引数は最初に共通の型に変換され、結果はその型になります。

intオペランドの場合、2番目の引数が負でない限り、結果はオペランドと同じ型になります。 その場合、すべての引数がfloatに変換され、floatの結果が配信されます。 たとえば、10**2100を返しますが、10**-20.01を返します。

0.0を負の累乗にすると、 ZeroDivisionError が発生します。 負の数を小数の累乗にすると、複素数の数になります。 (以前のバージョンでは、 ValueError が発生しました。)


6.6。 単項算術およびビット演算

すべての単項算術演算とビット演算には同じ優先順位があります。

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

単項-(マイナス)演算子は、その数値引数の否定を生成します。

単項+(plus)演算子は、数値引数を変更せずに生成します。

単項~(反転)演算子は、整数引数のビット単位の反転を生成します。 xのビット単位の反転は、-(x+1)として定義されます。 整数にのみ適用されます。

3つのケースすべてで、引数に適切な型がない場合、 TypeError 例外が発生します。


6.7。 2進算術演算

2進算術演算には、従来の優先度レベルがあります。 これらの操作の一部は、特定の非数値型にも適用されることに注意してください。 電力演算子を除いて、2つのレベルしかありません。1つは乗法演算子用で、もう1つは加法演算子用です。

  m_expr ::=  u_expr | m_expr "*" u_expr | m_expr "@" m_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

*(乗算)演算子は、その引数の積を生成します。 引数は両方とも数値であるか、一方の引数が整数でもう一方がシーケンスである必要があります。 前者の場合、数値は共通の型に変換されてから乗算されます。 後者の場合、シーケンスの繰り返しが実行されます。 負の繰り返し係数は空のシーケンスを生成します。

@(at)演算子は、行列の乗算に使用することを目的としています。 組み込みのPython型はこの演算子を実装していません。

バージョン3.5の新機能。


/(除算)および//(床除算)演算子は、引数の商を生成します。 数値引数は、最初に共通の型に変換されます。 整数の除算はfloatを生成し、整数のフロア除算は整数を生成します。 結果は、結果に「floor」関数が適用された数学的除算の結果です。 ゼロ除算では、 ZeroDivisionError 例外が発生します。

%(モジュロ)演算子は、最初の引数を2番目の引数で除算した余りを生成します。 数値引数は、最初に共通の型に変換されます。 右ゼロの引数は、 ZeroDivisionError 例外を発生させます。 引数は浮動小数点数にすることができます。たとえば、3.14%0.70.34に等しい(3.144*0.7 + 0.34に等しいため)。モジュロ演算子は常に同じ結果を生成します。 2番目のオペランド(またはゼロ)として符号を付けます。 結果の絶対値は、第2オペランド 1 の絶対値よりも厳密に小さくなります。

床分割演算子とモジュロ演算子は、x == (x//y)*y + (x%y)というIDで接続されています。 床分割とモジュロも組み込み関数 divmod()divmod(x, y) == (x//y, x%y)に接続されています。 2

数値に対してモジュロ演算を実行することに加えて、%演算子は、古いスタイルの文字列フォーマット(補間とも呼ばれます)を実行するために文字列オブジェクトによってオーバーロードされます。 文字列フォーマットの構文は、Pythonライブラリリファレンスのセクション printf-style String Formatting で説明されています。

床分割演算子、モジュロ演算子、および divmod()関数は、複素数に対して定義されていません。 代わりに、必要に応じて abs()関数を使用して浮動小数点数に変換してください。

+(加算)演算子は、その引数の合計を生成します。 引数は、両方が数値であるか、両方が同じタイプのシーケンスである必要があります。 前者の場合、数値は共通の型に変換されてから加算されます。 後者の場合、シーケンスは連結されます。

-(減算)演算子は、その引数の差を生成します。 数値引数は、最初に共通の型に変換されます。


6.8。 シフト演算

シフト演算は、算術演算よりも優先度が低くなります。

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

これらの演算子は、引数として整数を受け入れます。 これらは、最初の引数を2番目の引数で指定されたビット数だけ左または右にシフトします。

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

ノート

現在の実装では、右側のオペランドは最大で sys.maxsize である必要があります。 右側のオペランドが sys.maxsize より大きい場合、 OverflowError 例外が発生します。


6.9。 バイナリビット演算

3つのビット演算のそれぞれには、異なる優先度レベルがあります。

  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を生成します。これは整数でなければなりません。


6.10。 比較

Cとは異なり、Pythonのすべての比較演算の優先度は同じであり、算術演算、シフト演算、またはビット演算の優先順位よりも低くなっています。 また、Cとは異なり、a < b < cのような式には、数学で一般的な解釈があります。

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

比較すると、ブール値TrueまたはFalseが得られます。

比較は任意に連鎖させることができます。たとえば、x < y <= zx < y and y <= zと同等ですが、yは1回だけ評価されます(ただし、どちらの場合もzは評価されません)。 x < yがfalseであることが判明した場合は、まったくありません)。

正式には、 abc 、…、 yz が式であり、の場合op1op2 、…、 opN は比較演算子であり、a op1 b op2 c ... y opN za op1 b and b op2 c and ... y opN zと同等ですが、各式はで評価されます。ほとんど一度。

a op1 b op2 cは、 ac の比較を意味するものではないため、たとえば、x < y > zは完全に合法であることに注意してください(おそらくきれいではありません)。

6.10.1。 値の比較

演算子<>==>=<=、および!=は、2つのオブジェクトの値を比較します。 オブジェクトは同じタイプである必要はありません。

オブジェクト、値、およびタイプには、オブジェクトには(タイプとIDに加えて)値があると記載されています。 オブジェクトの値は、Pythonではかなり抽象的な概念です。たとえば、オブジェクトの値に対する正規のアクセス方法はありません。 また、オブジェクトの値を特定の方法で作成する必要はありません。 すべてのデータ属性で構成されます。 比較演算子は、オブジェクトの値が何であるかという特定の概念を実装します。 それらは、比較の実装によって、オブジェクトの値を間接的に定義するものと考えることができます。

すべてのタイプはオブジェクトの(直接または間接)サブタイプであるため、オブジェクトからデフォルトの比較動作を継承します。 タイプは、基本的なカスタマイズで説明されている__lt__()のような豊富な比較メソッドを実装することにより、比較動作をカスタマイズできます。

同等性比較のデフォルトの動作(==および!=)は、オブジェクトのIDに基づいています。 したがって、同じIDを持つインスタンスの同等性の比較は同等性をもたらし、異なるIDを持つインスタンスの同等性の比較は不平等をもたらします。 このデフォルトの動作の動機は、すべてのオブジェクトが反射的である必要があるという願望です(つまり、 x is yx == yを意味します)。

デフォルトの順序比較(<><=、および>=)は提供されていません。 試行すると TypeError が発生します。 このデフォルトの動作の動機は、平等と同様の不変条件がないことです。

異なるIDを持つインスタンスは常に等しくないというデフォルトの等価比較の動作は、オブジェクト値と値ベースの等価の適切な定義を持つタイプが必要とするものとは対照的である可能性があります。 このような型は、比較動作をカスタマイズする必要があります。実際、多くの組み込み型がそれを行っています。

次のリストは、最も重要な組み込み型の比較動作について説明しています。

  • 組み込みの数値型(数値型— int、float、complex )および標準ライブラリ型 fractions.Fraction および decimal.Decimal の数は次のようになります。複素数は順序比較をサポートしないという制限付きで、タイプ内およびタイプ間で比較されます。 関係するタイプの制限内で、精度を失うことなく数学的に(アルゴリズム的に)正確に比較します。

    数値以外の値float('NaN')およびDecimal('NaN')は特別です。 それらはそれら自体と同一です(x is xはtrue)が、それらと等しくありません(x == xはfalse)。 さらに、任意の数値を非数値と比較すると、Falseが返されます。 たとえば、3 < float('NaN')float('NaN') < 3の両方がFalseを返します。

  • バイナリシーケンス( bytes または bytearray のインスタンス)は、それらのタイプ内およびタイプ間で比較できます。 それらは、要素の数値を使用して辞書式に比較します。

  • 文字列( str のインスタンス)は、文字の数値Unicodeコードポイント(組み込み関数 ord()の結果)を使用して辞書式に比較します。 3

    文字列とバイナリシーケンスを直接比較することはできません。

  • シーケンス(タプルリスト、または範囲のインスタンス)は、各タイプ内でのみ比較できますが、範囲は順序比較をサポートしないという制限があります。 これらのタイプ間の同等性の比較は不平等をもたらし、これらのタイプ間の順序比較は TypeError を発生させます。

    シーケンスは、対応する要素の比較を使用して辞書式に比較します。これにより、要素の再帰性が適用されます。

    要素の再帰性を強制する場合、コレクションの比較では、コレクション要素xの場合、x == xが常に真であると想定しています。 その仮定に基づいて、要素の同一性が最初に比較され、要素の比較は個別の要素に対してのみ実行されます。 このアプローチでは、比較された要素が反射的である場合、厳密な要素の比較と同じ結果が得られます。 非再帰要素の場合、結果は厳密な要素比較の場合とは異なり、驚くべき場合があります。たとえば、非再帰の非数値は、リストで使用すると次の比較動作になります。

    >>> nan = float('NaN')
    >>> nan is nan
    True
    >>> nan == nan
    False                 <-- the defined non-reflexive behavior of NaN
    >>> [nan] == [nan]
    True                  <-- list enforces reflexivity and tests identity first

    組み込みコレクション間の辞書式比較は、次のように機能します。

    • 2つのコレクションを等しく比較するには、それらが同じタイプであり、同じ長さであり、対応する要素の各ペアが等しく比較される必要があります(たとえば、[1,2] == (1,2)は、タイプが同じではないためfalseです)。

    • 順序比較をサポートするコレクションは、最初の等しくない要素と同じ順序になります(たとえば、[1,2,x] <= [1,2,y]の値はx <= yと同じです)。 対応する要素が存在しない場合、短いコレクションが最初に順序付けられます(たとえば、[1,2] < [1,2,3]はtrueです)。

  • マッピング( dict のインスタンス)は、(key、value)のペアが等しい場合にのみ、等しいと比較されます。 キーと値の同等性の比較により、再帰性が強化されます。

    順序の比較(<><=、および>=)は、 TypeError を発生させます。

  • セット( set または frozenset のインスタンス)は、タイプ内およびタイプ間で比較できます。

    それらは、サブセットおよびスーパーセットテストを意味する順序比較演算子を定義します。 これらの関係は、合計の順序を定義しません(たとえば、2つのセット{1,2}{2,3}は等しくなく、相互のサブセットでも、相互のスーパーセットでもありません)。 したがって、セットは、全順序に依存する関数の適切な引数ではありません(たとえば、 min()max()、および sorted()は未定義を生成します)入力としてセットのリストが与えられた結果)。

    セットの比較は、その要素の再帰性を強制します。

  • 他のほとんどの組み込み型には比較メソッドが実装されていないため、デフォルトの比較動作を継承します。

比較動作をカスタマイズするユーザー定義クラスは、可能であれば、いくつかの整合性ルールに従う必要があります。

  • 平等の比較は反射的でなければなりません。 言い換えれば、同一のオブジェクトは同等に比較する必要があります。

    x is yx == yを意味します

  • 比較は対称的である必要があります。 つまり、次の式でも同じ結果になるはずです。

    x == yおよびy == x

    x != yおよびy != x

    x < yおよびy > x

    x <= yおよびy >= x

  • 比較は推移的である必要があります。 次の(網羅的ではない)例は、次のことを示しています。

    x > y and y > zx > zを意味します

    x < y and y <= zx < zを意味します

  • 逆比較を行うと、ブール否定が発生します。 つまり、次の式でも同じ結果になるはずです。

    x == yおよびnot x != y

    x < yおよびnot x >= y(合計注文用)

    x > yおよびnot x <= y(合計注文用)

    最後の2つの式は、完全に順序付けられたコレクションに適用されます(例: シーケンスには適用されますが、セットやマッピングには適用されません)。 total_ordering()デコレータも参照してください。

  • hash()の結果は、等式と一致している必要があります。 等しいオブジェクトは、同じハッシュ値を持つか、ハッシュ不可としてマークする必要があります。

Pythonはこれらの整合性ルールを強制しません。 実際、not-a-number値は、これらのルールに従わない場合の例です。


6.10.2。 会員試験業務

演算子 in および not in はメンバーシップをテストします。 x in sxs のメンバーである場合はTrueと評価され、それ以外の場合はFalseと評価されます。 x not in sは、x in sの否定を返します。 すべての組み込みシーケンスとセットタイプは、辞書と同様にこれをサポートします。 in は、辞書に特定のキーがあるかどうかをテストします。 list、tuple、set、frozenset、dict、collections.dequeなどのコンテナータイプの場合、式x in yany(x is e or x == e for e in y)と同等です。

文字列およびバイトタイプの場合、 xy のサブストリングである場合に限り、x in yTrueです。 同等のテストはy.find(x) != -1です。 空の文字列は常に他の文字列のサブ文字列と見なされるため、"" in "abc"Trueを返します。

__contains__()メソッドを定義するユーザー定義クラスの場合、x in yy.__contains__(x)が真の値を返す場合はTrueを返し、それ以外の場合はFalseを返します。

__contains__()を定義しないが、__iter__()を定義するユーザー定義クラスの場合、値zx == zは、yを繰り返しながら生成されます。 反復中に例外が発生した場合、 in がその例外を発生したかのようになります。

最後に、古いスタイルの反復プロトコルが試されます。クラスが__getitem__()を定義する場合、x in yTrueであり、非負の整数インデックスがある場合に限ります。 x == y[i]、およびすべての下位整数インデックスが IndexError 例外を発生させないようなi 。 (他の例外が発生した場合は、 in がその例外を発生したかのようになります)。

にない演算子は、にあるの逆の真の値を持つように定義されています。


6.10.3。 アイデンティティの比較

演算子であり、はオブジェクトの同一性をテストしませんx is yは、 x および y の場合にのみ真です。同じオブジェクトです。 オブジェクトIDは、 id()関数を使用して決定されます。 x is not yは、逆真理値を生成します。 4


6.11。 ブール演算

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

ブール演算のコンテキストで、また式が制御フローステートメントで使用される場合、次の値はfalseとして解釈されます:FalseNone、すべてのタイプの数値ゼロ、および空の文字列とコンテナー(文字列、タプル、リスト、辞書、セット、および凍結セットを含む)。 他のすべての値はtrueとして解釈されます。 ユーザー定義オブジェクトは、__bool__()メソッドを提供することにより、真理値をカスタマイズできます。

演算子 not は、引数がfalseの場合はTrueを生成し、それ以外の場合はFalseを生成します。

x and yは、最初に x を評価します。 x がfalseの場合、その値が返されます。 それ以外の場合は、 y が評価され、結果の値が返されます。

x or yは、最初に x を評価します。 x がtrueの場合、その値が返されます。 それ以外の場合は、 y が評価され、結果の値が返されます。

またはも、FalseTrueに返す値とタイプを制限せず、最後に評価された引数を返すことに注意してください。 これは便利な場合があります。たとえば、sが文字列であり、空の場合はデフォルト値に置き換える必要がある場合、式s or 'foo'は目的の値を生成します。 not は新しい値を作成する必要があるため、引数のタイプに関係なくブール値を返します(たとえば、not 'foo'は [ではなくFalseを生成します)。 X173X]。)


6.12。 条件式

  conditional_expression ::=  or_test ["if" or_test "else" 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.13。 ラムダ

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

ラムダ式(ラムダフォームと呼ばれることもあります)は、無名関数を作成するために使用されます。 式lambda parameters: expressionは、関数オブジェクトを生成します。 名前のないオブジェクトは、次のように定義された関数オブジェクトのように動作します。

def <lambda>(parameters):
    return expression

パラメータリストの構文については、セクション関数定義を参照してください。 ラムダ式で作成された関数には、ステートメントやアノテーションを含めることができないことに注意してください。


6.14。 式リスト

  expression_list    ::=  expression ("," expression)* [","]
  starred_list       ::=  starred_item ("," starred_item)* [","]
  starred_expression ::=  expression | (starred_item ",")* [starred_item]
  starred_item       ::=  expression | "*" or_expr

リストまたはセットの一部が表示される場合を除いて、少なくとも1つのコンマを含む式リストはタプルを生成します。 タプルの長さは、リスト内の式の数です。 式は左から右に評価されます。

アスタリスク*は、反復可能なアンパックを示します。 そのオペランドは iterable でなければなりません。 iterableは、アンパックのサイトで、新しいタプル、リスト、またはセットに含まれる一連のアイテムに展開されます。

バージョン3.5の新機能:式リストでの反復可能なアンパック。元々は PEP 448 によって提案されました。


末尾のコンマは、単一のタプル(別名 シングルトン); それ以外の場合はオプションです。 末尾にコンマがない単一の式はタプルを作成しませんが、その式の値を生成します。 (空のタプルを作成するには、空の括弧のペア()を使用します。)


6.15。 評価順序

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.16。 演算子の優先順位

次の表は、Pythonでの演算子の優先順位を、最低の優先順位(最小のバインディング)から最高の優先順位(最大のバインディング)までまとめたものです。 同じボックス内の演算子の優先順位は同じです。 構文が明示的に指定されていない限り、演算子はバイナリです。 同じボックス内の演算子は左から右にグループ化します(右から左にグループ化するべき乗を除く)。

比較セクションで説明されているように、比較、メンバーシップテスト、およびIDテストはすべて同じ優先順位を持ち、左から右へのチェーン機能を備えていることに注意してください。

オペレーター 説明
lambda ラムダ式
ifelse 条件式
or ブールOR
and ブールAND
not x ブールNOT
innot inisis not<<=、[X82X ] 、>=!=== メンバーシップテストとIDテストを含む比較
ビットごとのOR
^ ビット単位のXOR
& ビットごとのAND
<<>> シフト
+- 加減
*@///% 乗算、行列乗算、除算、フロア除算、剰余 5
+x-x~x 正、負、ビット単位ではありません
** べき乗 6
await x 式を待つ
x[index]x[index:index]x(arguments...)x.attribute サブスクリプション、スライス、呼び出し、属性参照
(expressions...)[expressions...]{key: value...}{expressions...} バインディングまたはタプル表示、リスト表示、辞書表示、セット表示

脚注

1

abs(x%y) < abs(y)は数学的には真ですが、浮動小数点数の場合、四捨五入のために数値的には真ではない場合があります。 たとえば、Python浮動小数点数がIEEE 754倍精度数であるプラットフォームを想定すると、-1e-100 % 1e1001e100と同じ符号を持つために、計算結果は [になります。 X185X]、これは1e100と数値的に正確に等しくなります。 関数 math.fmod()は、代わりに最初の引数の符号と符号が一致する結果を返すため、この場合は-1e-100を返します。 どちらのアプローチがより適切かは、アプリケーションによって異なります。

2

xがyの正確な整数倍に非常に近い場合、丸めのためにx//y(x-x%y)//yより1大きい可能性があります。 このような場合、Pythonは、divmod(x,y)[0] * y + x % yxに非常に近いことを維持するために、後者の結果を返します。

3

Unicode標準は、コードポイントを区別します(例: U + 0041)および抽象文字(例: 「ラテン大文字A」)。 Unicodeのほとんどの抽象文字は、1つのコードポイントを使用してのみ表されますが、複数のコードポイントのシーケンスを使用してさらに表すことができる抽象文字がいくつかあります。 たとえば、抽象文字「LATIN CAPITAL LETTER C WITH CEDILLA」は、コード位置U + 00C7で単一の合成済み文字として、または基本文字のシーケンスとして表すことができます。コード位置U + 0043(LATIN CAPITAL LETTER C)の後に、コード位置U + 0327(COMBINING CEDILLA)に結合文字が続きます。

文字列の比較演算子は、Unicodeコードポイントのレベルで比較します。 これは人間にとって直感に反するかもしれません。 たとえば、"\u00C7" == "\u0043\u0327"Falseですが、両方の文字列が同じ抽象文字「LATIN CAPITAL LETTER CWITHCEDILLA」を表しています。

抽象文字のレベルで(つまり、人間にとって直感的な方法で)文字列を比較するには、 unicodedata.normalize()を使用します。

4

自動ガベージコレクション、フリーリスト、および記述子の動的な性質により、 is 演算子の特定の使用法では、インスタンスメソッドや定数間の比較など、一見異常な動作に気付く場合があります。 詳細については、ドキュメントを確認してください。

5

%演算子は、文字列のフォーマットにも使用されます。 同じ優先順位が適用されます。

6

べき乗演算子**は、右側の算術演算子またはビット単位の単項演算子よりも緊密に結合しません。つまり、2**-10.5です。