5.5。 式
この章では、Pythonでの式の要素の意味について説明します。
構文上の注意:この章と次の章では、拡張BNF表記を使用して、字句解析ではなく構文を記述します。 構文ルール(の1つの選択肢)が次の形式の場合
名前 ::= othername
セマンティクスが指定されていない場合、この形式のname
のセマンティクスはothername
の場合と同じです。
5.1。 算術変換
以下の算術演算子の説明で「数値引数は共通型に変換されます」という句を使用すると、強制規則にリストされている強制規則を使用して引数が強制されます。 両方の引数が標準の数値型である場合、次の強制が適用されます。
- どちらかの引数が複素数の場合、もう一方は複素数に変換されます。
- それ以外の場合、いずれかの引数が浮動小数点数の場合、もう一方は浮動小数点に変換されます。
- それ以外の場合、いずれかの引数が長整数の場合、もう一方は長整数に変換されます。
- それ以外の場合は、両方とも単純な整数である必要があり、変換は必要ありません。
特定の演算子には、いくつかの追加の規則が適用されます(たとえば、 '%'演算子への文字列左引数)。 拡張機能は、独自の強制を定義できます。
5.2。 原子
アトムは式の最も基本的な要素です。 最も単純なアトムは識別子またはリテラルです。 逆引用符または括弧、角かっこ、中括弧で囲まれたフォームも、構文的にアトムとして分類されます。 アトムの構文は次のとおりです。
原子 ::= identifier | literal | enclosure 囲い ::= parenth_form | list_display | generator_expression | dict_display | set_display | string_conversion | yield_atom
5.2.1。 識別子(名前)
アトムとして出現する識別子は名前です。 字句の定義についてはセクション識別子とキーワードを、命名とバインディングのドキュメントについてはセクション命名とバインディングを参照してください。
名前がオブジェクトにバインドされている場合、アトムを評価するとそのオブジェクトが生成されます。 名前がバインドされていない場合、その名前を評価しようとすると、NameError
例外が発生します。
プライベート名マングリング:クラス定義でテキストで出現する識別子が2つ以上のアンダースコア文字で始まり、2つ以上のアンダースコアで終わらない場合、プライベート名と見なされます。そのクラス。 プライベート名は、コードが生成される前に、より長い形式に変換されます。 トランスフォーメーションは、名前の前に、先頭の下線を削除し、単一の下線を挿入したクラス名を挿入します。 たとえば、Ham
という名前のクラスで発生する識別子__spam
は、_Ham__spam
に変換されます。 この変換は、識別子が使用される構文コンテキストとは無関係です。 変換された名前が非常に長い(255文字より長い)場合、実装で定義された切り捨てが発生する可能性があります。 クラス名がアンダースコアのみで構成されている場合、変換は行われません。
5.2.2。 リテラル
Pythonは、文字列リテラルとさまざまな数値リテラルをサポートしています。
リテラル ::= stringliteral | integer | longinteger | floatnumber | imagnumber
リテラルを評価すると、指定されたタイプ(文字列、整数、長整数、浮動小数点数、複素数)のオブジェクトが指定された値で生成されます。 浮動小数点および虚数(複素数)リテラルの場合、値は概算される場合があります。 詳細については、セクションリテラルを参照してください。
すべてのリテラルは不変のデータ型に対応しているため、オブジェクトのIDはその値ほど重要ではありません。 同じ値(プログラムテキスト内の同じオカレンスまたは異なるオカレンス)を持つリテラルの複数の評価は、同じオブジェクトまたは同じ値を持つ異なるオブジェクトを取得する場合があります。
5.2.3。 括弧で囲まれたフォーム
括弧で囲まれた形式は、括弧で囲まれたオプションの式リストです。
parenth_form ::= "(" [expression_list] ")"
括弧で囲まれた式リストは、その式リストが生成するものをすべて生成します。リストに少なくとも1つのコンマが含まれている場合、タプルが生成されます。 それ以外の場合は、式リストを構成する単一の式が生成されます。
括弧の空のペアは、空のタプルオブジェクトを生成します。 タプルは不変であるため、リテラルのルールが適用されます(つまり、空のタプルが2回出現すると、同じオブジェクトが生成される場合と生成されない場合があります)。
タプルは括弧ではなく、コンマ演算子を使用して形成されることに注意してください。 例外は空のタプルで、括弧がである必要があります。式で括弧なしの「何も」を許可すると、あいまいさが生じ、一般的なタイプミスがキャッチされないまま通過する可能性があります。
5.2.4。 リスト表示
リスト表示は、角括弧で囲まれた空の一連の式です。
list_display ::= "[" [expression_list | list_comprehension] "]" list_comprehension ::= expression list_for list_for ::= "for" target_list "in" old_expression_list [list_iter] old_expression_list ::= old_expression [("," old_expression)+ [","]] old_expression ::= or_test | old_lambda_expr list_iter ::= list_for | list_if list_if ::= "if" old_expression [list_iter]
リスト表示により、新しいリストオブジェクトが生成されます。 その内容は、式のリストまたはリスト内包のいずれかを提供することによって指定されます。 式のコンマ区切りリストが指定されている場合、その要素は左から右に評価され、その順序でリストオブジェクトに配置されます。 リスト内包表記が指定されている場合、リスト内包表記は、単一の式と、それに続く少なくとも1つの for 句と0個以上の for または if 句で構成されます。 この場合、新しいリストの要素は、 for または if 句のそれぞれをブロックと見なし、左から右にネストし、式を評価することによって生成される要素です。最も内側のブロックに到達するたびにリスト要素を生成します 1 。
5.2.5。 セットと辞書の表示
セットまたは辞書を作成するために、Pythonは「ディスプレイ」と呼ばれる特別な構文を提供します。それぞれの構文は次の2つです。
- コンテナの内容が明示的にリストされているか、
- これらは、理解と呼ばれる一連のループおよびフィルタリング命令を介して計算されます。
内包表記の一般的な構文要素は次のとおりです。
理解 ::= 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]
内包表記は、単一の式と、それに続く少なくとも1つの for 句と0個以上の for または if 句で構成されます。 この場合、新しいコンテナの要素は、 for または if 句のそれぞれをブロックと見なし、左から右にネストし、式を評価することによって生成される要素です。最も内側のブロックに到達するたびに要素を生成します。
理解は別のスコープで実行されるため、ターゲットリストで割り当てられた名前は、囲んでいるスコープで「リーク」しないことに注意してください。
5.2.6。 ジェネレータ式
ジェネレータ式は、括弧内のコンパクトなジェネレータ表記です。
generator_expression ::= "(" expression comp_for ")"
ジェネレータ式は、新しいジェネレータオブジェクトを生成します。 その構文は、括弧や中括弧の代わりに括弧で囲まれていることを除いて、内包表記の場合と同じです。
ジェネレーター式で使用される変数は、__next__()
メソッドがジェネレーターオブジェクトに対して呼び出されると(通常のジェネレーターと同じ方法で)遅延評価されます。 ただし、左端の for 句はすぐに評価されるため、ジェネレータ式を処理するコードで発生する可能性のある他のエラーの前に、この句によって生成されたエラーを確認できます。 後続の for 句は、前の for ループに依存している可能性があるため、すぐに評価することはできません。 例:(x*y for x in range(10) for y in bar(x))
。
引数が1つしかない呼び出しでは、括弧を省略できます。 詳細については、セクション呼び出しを参照してください。
5.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
ディクショナリ表示により、新しいディクショナリオブジェクトが生成されます。
キー/データムペアのコンマ区切りシーケンスが指定されている場合、それらは左から右に評価されてディクショナリのエントリが定義されます。各キーオブジェクトは、対応するデータムを格納するためのディクショナリへのキーとして使用されます。 これは、キー/データムリストで同じキーを複数回指定でき、そのキーの最終的なディクショナリの値が最後に指定されることを意味します。
リスト内包表記やセット内包表記とは対照的に、辞書内包表記には、コロンで区切られた2つの式と、それに続く通常の「for」句と「if」句が必要です。 理解が実行されると、結果のキー要素と値要素が、生成された順序で新しいディクショナリに挿入されます。
キー値のタイプに関する制限は、セクション標準タイプ階層で前述されています。 (要約すると、キータイプは hashable である必要があります。これにより、すべての可変オブジェクトが除外されます。)重複キー間の衝突は検出されません。 特定のキー値に対して格納されている最後のデータ(テキストではディスプレイの右端)が優先されます。
5.2.8。 ディスプレイを設定する
セット表示は中括弧で示され、キーと値を区切るコロンがないことで辞書表示と区別できます。
set_display ::= "{" (expression_list | comprehension) "}"
セット表示は、新しい可変セットオブジェクトを生成します。内容は、一連の式または内包表記のいずれかによって指定されます。 式のコンマ区切りリストが指定されている場合、その要素は左から右に評価され、セットオブジェクトに追加されます。 理解が提供されると、セットは理解から生じる要素から構築されます。
{}
で空のセットを作成することはできません。 このリテラルは空の辞書を作成します。
5.2.9。 文字列変換
文字列変換は、逆に囲まれた式リストです(別名 後方)引用符:
string_conversion ::= "`" expression_list "`"
文字列変換は、含まれている式リストを評価し、そのタイプに固有のルールに従って、結果のオブジェクトを文字列に変換します。
オブジェクトが文字列、数値、None
、またはタイプがこれらのいずれかであるオブジェクトのみを含むタプル、リスト、または辞書である場合、結果の文字列は、ビルドに渡すことができる有効なPython式です。関数 eval()で、同じ値(または浮動小数点数が含まれる場合は近似値)の式を生成します。
(特に、文字列を変換すると、その周りに引用符が追加され、「面白い」文字が安全に印刷できるエスケープシーケンスに変換されます。)
再帰オブジェクト(たとえば、直接または間接的に自身への参照を含むリストまたはディクショナリ)は、...
を使用して再帰参照を示し、結果を eval()に渡すことはできません。等しい値を取得します(代わりにSyntaxError
が発生します)。
組み込み関数 repr()は、引数で括弧や逆引用符で囲むのとまったく同じ変換を実行します。 組み込み関数 str()は、同様ですが、よりユーザーフレンドリーな変換を実行します。
5.2.10。 降伏式
yield_atom ::= "(" yield_expression ")" yield_expression ::= "yield" [expression_list]
バージョン2.5の新機能。
yield 式は、ジェネレーター関数を定義するときにのみ使用され、関数定義の本体でのみ使用できます。 関数定義で yield 式を使用すると、その定義で通常の関数ではなくジェネレーター関数を作成できます。
ジェネレーター関数が呼び出されると、ジェネレーターと呼ばれるイテレーターが返されます。 次に、そのジェネレーターはジェネレーター関数の実行を制御します。 ジェネレータのメソッドの1つが呼び出されると、実行が開始されます。 その時点で、実行は最初の yield 式に進み、そこで再び中断され、 expression_list の値がジェネレーターの呼び出し元に返されます。 一時停止とは、ローカル変数の現在のバインディング、命令ポインター、内部評価スタックなど、すべてのローカル状態が保持されることを意味します。 ジェネレーターのメソッドの1つを呼び出して実行を再開すると、関数は、 yield 式が単なる別の外部呼び出しであるかのように正確に続行できます。 再開後の yield 式の値は、実行を再開したメソッドによって異なります。
これらすべてにより、ジェネレーター関数はコルーチンと非常によく似たものになります。 それらは複数回生成され、複数のエントリポイントがあり、実行を一時停止できます。 唯一の違いは、ジェネレーター関数は、生成後に実行を続行する場所を制御できないことです。 制御は常にジェネレーターの呼び出し元に転送されます。
5.2.10.1。 ジェネレータ-イテレータメソッド
このサブセクションでは、ジェネレータイテレータのメソッドについて説明します。 これらは、ジェネレーター関数の実行を制御するために使用できます。
ジェネレーターがすでに実行されているときに以下のジェネレーターメソッドのいずれかを呼び出すと、ValueError
例外が発生することに注意してください。
- generator.next()
- ジェネレーター関数の実行を開始するか、最後に実行された yield 式で再開します。 ジェネレーター関数が next()メソッドで再開されると、現在の yield 式は常に None と評価されます。 その後、実行は次の yield 式に進み、ジェネレーターが再び中断され、 expression_list の値が next()の呼び出し元に返されます。 。 ジェネレータが別の値を生成せずに終了すると、
StopIteration
例外が発生します。
- 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()は、例外または通常の終了のためにジェネレーターがすでに終了している場合は何もしません。
ジェネレーターとジェネレーター関数の動作を示す簡単な例を次に示します。
>>> def echo(value=None):
... print "Execution starts when 'next()' is called for the first time."
... try:
... while True:
... try:
... value = (yield value)
... except Exception, e:
... value = e
... finally:
... print "Don't forget to clean up when 'close()' is called."
...
>>> generator = echo(1)
>>> print generator.next()
Execution starts when 'next()' is called for the first time.
1
>>> print generator.next()
None
>>> print generator.send(2)
2
>>> generator.throw(TypeError, "spam")
TypeError('spam',)
>>> generator.close()
Don't forget to clean up when 'close()' is called.
5.3。 予備選挙
プライマリーは、言語の最も緊密にバインドされた操作を表します。 それらの構文は次のとおりです。
主要な ::= atom | attributeref | subscription | slicing | call
5.3.1。 属性参照
属性参照は、プライマリの後にピリオドと名前が続きます。
attributeref ::= primary "." identifier
プライマリは、モジュール、リスト、インスタンスなど、属性参照をサポートするタイプのオブジェクトに評価する必要があります。 次に、このオブジェクトは、名前が識別子である属性を生成するように求められます。 この属性が使用できない場合、例外AttributeError
が発生します。 それ以外の場合、生成されるオブジェクトのタイプと値はオブジェクトによって決定されます。 同じ属性参照を複数回評価すると、異なるオブジェクトが生成される場合があります。
5.3.2。 サブスクリプション
サブスクリプションは、シーケンス(文字列、タプル、またはリスト)またはマッピング(辞書)オブジェクトのアイテムを選択します。
サブスクリプション ::= primary "[" expression_list "]"
プライマリは、シーケンスまたはマッピングタイプのオブジェクトに評価する必要があります。
プライマリがマッピングの場合、式リストは、値がマッピングのキーの1つであるオブジェクトに評価される必要があり、サブスクリプションは、そのキーに対応するマッピング内の値を選択します。 (式リストは、項目が1つしかない場合を除いて、タプルです。)
プライマリがシーケンスの場合、式リストは単純な整数に評価される必要があります。 この値が負の場合、シーケンスの長さが追加されます(たとえば、x[-1]
はx
の最後の項目を選択します)。結果の値は、以下の非負の整数である必要があります。シーケンス内のアイテムの数。サブスクリプションは、インデックスがその値(ゼロから数えて)であるアイテムを選択します。
文字列の項目は文字です。 文字は個別のデータ型ではなく、1文字だけの文字列です。
5.3.3。 スライス
スライスは、シーケンスオブジェクト内のアイテムの範囲(文字列、タプル、リストなど)を選択します。 スライスは、式として、または代入または del ステートメントのターゲットとして使用できます。 スライスの構文:
スライス ::= simple_slicing | extended_slicing simple_slicing ::= primary "[" short_slice "]" extended_slicing ::= primary "[" slice_list "]" slice_list ::= slice_item ("," slice_item)* [","] slice_item ::= expression | proper_slice | ellipsis proper_slice ::= short_slice | long_slice short_slice ::= [lower_bound] ":" [upper_bound] long_slice ::= short_slice ":" [stride] lower_bound ::= expression upper_bound ::= expression ストライド ::= expression 省略記号 ::= "..."
ここでの正式な構文にはあいまいさがあります。式リストのように見えるものはすべてスライスリストのようにも見えるため、サブスクリプションはスライスとして解釈できます。 構文をさらに複雑にするのではなく、この場合、サブスクリプションとしての解釈がスライスとしての解釈よりも優先されることを定義することで、これを明確にします(これは、スライスリストに適切なスライスや省略記号が含まれていない場合です)。 同様に、スライスリストに短いスライスが1つだけあり、末尾にコンマがない場合、単純なスライスとしての解釈が、拡張スライスとしての解釈よりも優先されます。
単純なスライスのセマンティクスは次のとおりです。 プライマリは、シーケンスオブジェクトに評価する必要があります。 下限式と上限式が存在する場合は、単純な整数に評価する必要があります。 デフォルトはそれぞれゼロとsys.maxint
です。 いずれかの境界が負の場合、シーケンスの長さがそれに追加されます。 スライスにより、i <= k < j
( i および j が指定された下限と上限)となるようなインデックス k を持つすべてのアイテムが選択されるようになりました。 これは空のシーケンスである可能性があります。 i または j が有効なインデックスの範囲外にある場合はエラーではありません(このような項目は存在しないため、選択されていません)。
拡張スライスのセマンティクスは次のとおりです。 プライマリはマッピングオブジェクトに評価される必要があり、次のようにスライスリストから作成されたキーでインデックスが付けられます。 スライスリストに少なくとも1つのコンマが含まれている場合、キーはスライスアイテムの変換を含むタプルです。 それ以外の場合は、単独のスライスアイテムの変換が重要です。 式であるスライスアイテムの変換は、その式です。 省略記号スライスアイテムの変換は、組み込みのEllipsis
オブジェクトです。 適切なスライスの変換は、start
、stop
、およびstep
属性がの値であるスライスオブジェクト(セクション標準タイプ階層を参照)です。欠落している式をNone
に置き換えて、それぞれ下限、上限、ストライドとして指定された式。
5.3.4。 呼び出し
呼び出しは、空の可能性のある一連の引数を使用して呼び出し可能オブジェクト(関数など)を呼び出します。
電話 ::= primary "(" [argument_list [","] | expression genexpr_for] ")" arguments_list ::= positional_arguments ["," keyword_arguments] ["," "*" expression] ["," keyword_arguments] ["," "**" expression] | keyword_arguments ["," "*" expression] ["," "**" expression] | "*" expression ["," keyword_arguments] ["," "**" expression] | "**" expression positional_arguments ::= expression ("," expression)* keyword_arguments ::= keyword_item ("," keyword_item)* キーワード_アイテム ::= identifier "=" expression
末尾のコンマは、positional引数とkeyword引数の後に存在する場合がありますが、セマンティクスには影響しません。
プライマリは呼び出し可能オブジェクトに評価する必要があります(ユーザー定義関数、組み込み関数、組み込みオブジェクトのメソッド、クラスオブジェクト、クラスインスタンスのメソッド、および特定のクラスインスタンス自体が呼び出し可能です。拡張機能は、追加の呼び出し可能オブジェクトタイプを定義できます) 。 すべての引数式は、呼び出しが試行される前に評価されます。 正式なパラメータリストの構文については、セクション関数定義を参照してください。
キーワード引数が存在する場合、次のように、最初に位置引数に変換されます。 最初に、仮パラメータ用に埋められていないスロットのリストが作成されます。 N個の位置引数がある場合、それらは最初のN個のスロットに配置されます。 次に、キーワード引数ごとに、識別子を使用して対応するスロットを決定します(識別子が最初の仮パラメーター名と同じである場合は、最初のスロットが使用されます)。 スロットがすでに埋められている場合、TypeError
例外が発生します。 それ以外の場合、引数の値はスロットに配置されて埋められます(式がNone
の場合でも、スロットが埋められます)。 すべての引数が処理されると、まだ埋められていないスロットは、関数定義からの対応するデフォルト値で埋められます。 (デフォルト値は、関数の定義時に一度計算されます。したがって、デフォルト値として使用されるリストやディクショナリなどの可変オブジェクトは、対応するスロットの引数値を指定しないすべての呼び出しで共有されます。これは、通常は回避されます。)デフォルト値が指定されていないスロットが埋められていない場合、TypeError
例外が発生します。 それ以外の場合は、埋められたスロットのリストが呼び出しの引数リストとして使用されます。
仮パラメータスロットよりも多くの位置引数がある場合、構文*identifier
を使用する仮パラメータが存在しない限り、TypeError
例外が発生します。 この場合、その仮パラメーターは、過剰な位置引数を含むタプル(または、過剰な位置引数がなかった場合は空のタプル)を受け取ります。
キーワード引数が仮パラメータ名に対応していない場合、構文**identifier
を使用する仮パラメータが存在しない限り、TypeError
例外が発生します。 この場合、その仮パラメーターは、過剰なキーワード引数を含むディクショナリ(キーワードをキーとして使用し、引数値を対応する値として使用)を受け取るか、過剰なキーワード引数がない場合は(新しい)空のディクショナリを受け取ります。
構文*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 <module>
TypeError: f() got multiple values for keyword argument 'a'
>>> f(1, *(2,))
1 2
キーワード引数と*expression
構文の両方が同じ呼び出しで使用されることは珍しいため、実際にはこの混乱は発生しません。
構文**expression
が関数呼び出しに表示される場合、expression
はマッピングに評価される必要があり、その内容は追加のキーワード引数として扱われます。 expression
と明示的なキーワード引数の両方にキーワードが表示される場合、TypeError
例外が発生します。
構文*identifier
または**identifier
を使用する仮パラメーターは、位置引数スロットまたはキーワード引数名として使用できません。 構文(sublist)
を使用する仮パラメーターは、キーワード引数名として使用できません。 最も外側のサブリストは、単一の名前のない引数スロットに対応し、引数値は、他のすべてのパラメーター処理が実行された後、通常のタプル割り当てルールを使用してサブリストに割り当てられます。
呼び出しは、例外が発生しない限り、常に何らかの値、場合によってはNone
を返します。 この値の計算方法は、呼び出し可能なオブジェクトのタイプによって異なります。
もしそれが-
- ユーザー定義関数:
- 関数のコードブロックが実行され、引数リストが渡されます。 コードブロックが最初に行うことは、仮パラメーターを引数にバインドすることです。 これについては、セクション関数定義で説明されています。 コードブロックが return ステートメントを実行するとき、これは関数呼び出しの戻り値を指定します。
- 組み込み関数またはメソッド:
- 結果は通訳次第です。 組み込み関数とメソッドの説明については、組み込み関数を参照してください。
- クラスオブジェクト:
- そのクラスの新しいインスタンスが返されます。
- クラスインスタンスメソッド:
- 対応するユーザー定義関数が呼び出され、呼び出しの引数リストより1つ長い引数リストが使用されます。インスタンスが最初の引数になります。
- クラスインスタンス:
- クラスは
__call__()
メソッドを定義する必要があります。 その場合、効果はそのメソッドが呼び出された場合と同じになります。
5.4。 電力事業者
べき乗演算子は、左側の単項演算子よりも緊密に結合します。 右側の単項演算子よりも緊密に結合しません。 構文は次のとおりです。
パワー ::= primary ["**" u_expr]
したがって、括弧なしの累乗演算子と単項演算子のシーケンスでは、演算子は右から左に評価されます(これは、オペランドの評価順序を制約しません)。-1**2
は-1
になります。
累乗演算子は、2つの引数を指定して呼び出された場合、組み込みの pow()関数と同じセマンティクスを持ちます。つまり、左の引数を右の引数の累乗で累乗します。 数値引数は、最初に共通の型に変換されます。 結果の型は、強制後の引数の型です。
オペランドタイプが混在している場合、2進算術演算子の強制規則が適用されます。 intおよびlongintオペランドの場合、2番目の引数が負でない限り、結果は(強制後の)オペランドと同じ型になります。 その場合、すべての引数がfloatに変換され、floatの結果が配信されます。 たとえば、10**2
は100
を返しますが、10**-2
は0.01
を返します。 (この最後の機能はPython2.2で追加されました。 Python 2.1以前では、両方の引数が整数型であり、2番目の引数が負の場合、例外が発生しました)。
0.0
を負の累乗にすると、ZeroDivisionError
になります。 負の数を小数の累乗にすると、ValueError
になります。
5.5。 単項算術およびビット演算
すべての単項算術演算とビット演算には同じ優先順位があります。
u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr
単項-
(マイナス)演算子は、その数値引数の否定を生成します。
単項+
(plus)演算子は、数値引数を変更せずに生成します。
単項~
(反転)演算子は、そのプレーンまたは長整数引数のビット単位の反転を生成します。 x
のビット単位の反転は、-(x+1)
として定義されます。 整数にのみ適用されます。
3つのケースすべてで、引数に適切な型がない場合、TypeError
例外が発生します。
5.6。 2進算術演算
2進算術演算には、従来の優先度レベルがあります。 これらの操作の一部は、特定の非数値型にも適用されることに注意してください。 電力演算子を除いて、2つのレベルしかありません。1つは乗法演算子用で、もう1つは加法演算子用です。
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
*
(乗算)演算子は、その引数の積を生成します。 引数は両方とも数値であるか、一方の引数が整数(プレーンまたはロング)で、もう一方がシーケンスである必要があります。 前者の場合、数値は共通の型に変換されてから乗算されます。 後者の場合、シーケンスの繰り返しが実行されます。 負の繰り返し係数は空のシーケンスを生成します。
/
(除算)および//
(床除算)演算子は、引数の商を生成します。 数値引数は、最初に共通の型に変換されます。 プレーンまたは長整数の除算では、同じタイプの整数が生成されます。 結果は、結果に「floor」関数が適用された数学的除算の結果です。 ゼロ除算はZeroDivisionError
例外を発生させます。
%
(モジュロ)演算子は、最初の引数を2番目の引数で除算した余りを生成します。 数値引数は、最初に共通の型に変換されます。 ゼロの右引数は、ZeroDivisionError
例外を発生させます。 引数は浮動小数点数にすることができます。たとえば、3.14%0.7
は0.34
に等しい(3.14
は4*0.7 + 0.34
に等しいため)。モジュロ演算子は常に同じ結果を生成します。 2番目のオペランド(またはゼロ)として符号を付けます。 結果の絶対値は、第2オペランド 2 の絶対値よりも厳密に小さくなります。
整数除算演算子とモジュロ演算子は、x == (x/y)*y + (x%y)
という単位元で接続されています。 整数の除算とモジュロも、組み込み関数 divmod():divmod(x, y) == (x/y, x%y)
に接続されています。 これらのIDは、浮動小数点数には当てはまりません。 x/y
がfloor(x/y)
またはfloor(x/y) - 1
3 に置き換えられた場合にも同様のIDが当てはまります。
%
演算子は、数値のモジュロ演算の実行に加えて、文字列およびユニコードオブジェクトによってオーバーロードされ、文字列の書式設定(補間とも呼ばれます)を実行します。 文字列フォーマットの構文は、Pythonライブラリリファレンスのセクション文字列フォーマット操作で説明されています。
バージョン2.3以降非推奨:床分割演算子、モジュロ演算子、および divmod()関数は、複素数に対して定義されなくなりました。 代わりに、必要に応じて abs()関数を使用して浮動小数点数に変換してください。
+
(加算)演算子は、その引数の合計を生成します。 引数は、両方が数値であるか、同じタイプの両方のシーケンスである必要があります。 前者の場合、数値は共通の型に変換されてから加算されます。 後者の場合、シーケンスは連結されます。
-
(減算)演算子は、その引数の差を生成します。 数値引数は、最初に共通の型に変換されます。
5.7。 シフト演算
シフト演算は、算術演算よりも優先度が低くなります。
shift_expr ::= a_expr | shift_expr ( "<<" | ">>" ) a_expr
これらの演算子は、引数としてプレーン整数または長整数を受け入れます。 引数は共通の型に変換されます。 これらは、最初の引数を2番目の引数で指定されたビット数だけ左または右にシフトします。
n ビットによる右シフトは、pow(2, n)
による除算として定義されます。 n ビットによる左シフトは、pow(2, n)
との乗算として定義されます。 負のシフトカウントはValueError
例外を発生させます。
ノート
現在の実装では、右側のオペランドは最大で sys.maxsize である必要があります。 右側のオペランドが sys.maxsize より大きい場合、OverflowError
例外が発生します。
5.8。 バイナリビット演算
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を生成します。これは、プレーン整数または長整数でなければなりません。 引数は共通の型に変換されます。
5.9。 比較
Cとは異なり、Pythonのすべての比較演算の優先度は同じであり、算術演算、シフト演算、またはビット演算の優先順位よりも低くなっています。 また、Cとは異なり、a < b < c
のような式には、数学で一般的な解釈があります。
比較 ::= or_expr ( comp_operator or_expr )* comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!=" | "is" ["not"] | ["not"] "in"
比較すると、ブール値True
またはFalse
が得られます。
比較は任意に連鎖させることができます。たとえば、x < y <= z
はx < y and y <= z
と同等ですが、y
は1回だけ評価されます(ただし、どちらの場合もz
は評価されません)。 x < y
がfalseであることが判明した場合は、まったくありません)。
正式には、 a 、 b 、 c 、…、 y 、 z が式であり、の場合op1 、 op2 、…、 opN は比較演算子であり、a op1 b op2 c ... y opN z
はa op1 b and b op2 c and ... y opN z
と同等ですが、各式はで評価されます。ほとんど一度。
a op1 b op2 c
は、 a と c の比較を意味するものではないため、たとえば、x < y > z
は完全に合法であることに注意してください(おそらくきれいではありません)。
<>
と!=
の形式は同等です。 Cとの一貫性を保つために、!=
が推奨されます。 以下に!=
と記載されている場合、<>
も使用できます。 <>
のスペルは廃止されたと見なされます。
5.9.1。 値の比較
演算子<
、>
、==
、>=
、<=
、および!=
は、2つのオブジェクトの値を比較します。 オブジェクトは同じタイプである必要はありません。
章オブジェクト、値、およびタイプには、オブジェクトには(タイプとIDに加えて)値があると記載されています。 オブジェクトの値は、Pythonではかなり抽象的な概念です。たとえば、オブジェクトの値に対する正規のアクセス方法はありません。 また、オブジェクトの値を特定の方法で作成する必要はありません。 すべてのデータ属性で構成されます。 比較演算子は、オブジェクトの値が何であるかという特定の概念を実装します。 それらは、比較の実装によって、オブジェクトの値を間接的に定義するものと考えることができます。
タイプは、基本的なカスタマイズで説明されている__cmp__()
メソッド、または__lt__()
のような豊富な比較メソッドを実装することで比較動作をカスタマイズできます。
同等性比較のデフォルトの動作(==
および!=
)は、オブジェクトのIDに基づいています。 したがって、同じIDを持つインスタンスの同等性の比較は同等性をもたらし、異なるIDを持つインスタンスの同等性の比較は不平等をもたらします。 このデフォルトの動作の動機は、すべてのオブジェクトが反射的である必要があるという願望です(つまり、 x is y
はx == y
を意味します)。
デフォルトの順序比較(<
、>
、<=
、および>=
)は、一貫性がありますが任意の順序を示します。
(この異常な比較の定義は、ソートや in および not in 演算子などの操作の定義を単純化するために使用されました。 将来的には、異なるタイプのオブジェクトの比較ルールが変更される可能性があります。)
異なるIDを持つインスタンスは常に等しくないというデフォルトの等価比較の動作は、オブジェクト値と値ベースの等価の適切な定義を持つタイプが必要とするものとは対照的である可能性があります。 このような型は、比較動作をカスタマイズする必要があります。実際、多くの組み込み型がそれを行っています。
次のリストは、最も重要な組み込み型の比較動作について説明しています。
組み込み数値型(数値型— int、float、long、complex )および標準ライブラリ型 fractions.Fraction および decimal.Decimal の数複素数は順序比較をサポートしないという制限がありますが、タイプ内およびタイプ間で比較できます。 関係するタイプの制限内で、精度を失うことなく数学的に(アルゴリズム的に)正確に比較します。
文字列( str または unicode のインスタンス)は、それらの文字に相当する数値(組み込み関数 ord()の結果)を使用して辞書式に比較します。 4 8ビット文字列とUnicode文字列を比較すると、8ビット文字列はUnicodeに変換されます。 変換が失敗した場合、文字列は等しくないと見なされます。
タプルまたは
list
のインスタンスは、それぞれのタイプ内でのみ比較できます。 これらのタイプ間の同等性の比較は不平等をもたらし、これらのタイプ間の順序比較は任意の順序を与えます。これらのシーケンスは、対応する要素の比較を使用して辞書式に比較します。これにより、要素の再帰性が適用されます。
要素の再帰性を強制する場合、コレクションの比較では、コレクション要素
x
の場合、x == x
が常に真であると想定しています。 その仮定に基づいて、要素の同一性が最初に比較され、要素の比較は個別の要素に対してのみ実行されます。 このアプローチでは、比較された要素が反射的である場合、厳密な要素の比較と同じ結果が得られます。 非再帰要素の場合、結果は厳密な要素比較の場合とは異なります。組み込みコレクション間の辞書式比較は、次のように機能します。
2つのコレクションを等しく比較するには、それらが同じタイプであり、同じ長さであり、対応する要素の各ペアが等しく比較される必要があります(たとえば、
[1,2] == (1,2)
は、タイプが同じではないためfalseです)。コレクションは、最初の等しくない要素と同じ順序になります(たとえば、
cmp([1,2,x], [1,2,y])
はcmp(x,y)
と同じものを返します)。 対応する要素が存在しない場合、短いコレクションが最初に順序付けられます(たとえば、[1,2] < [1,2,3]
はtrueです)。
マッピング( dict のインスタンス)は、(key、value)のペアが等しい場合にのみ、等しいと比較されます。 キーと値の同等性の比較により、再帰性が強化されます。
平等以外の結果は一貫して解決されますが、それ以外の定義はありません。 5
組み込み型の他のほとんどのオブジェクトは、同じオブジェクトでない限り、等しくありません。 あるオブジェクトを別のオブジェクトよりも小さいと見なすか大きいと見なすかの選択は、プログラムの1回の実行内で任意に、ただし一貫して行われます。
比較動作をカスタマイズするユーザー定義クラスは、可能であれば、いくつかの整合性ルールに従う必要があります。
平等の比較は反射的でなければなりません。 言い換えれば、同一のオブジェクトは同等に比較する必要があります。
x is y
はx == y
を意味します比較は対称的である必要があります。 つまり、次の式でも同じ結果になるはずです。
x == y
およびy == x
x != y
およびy != x
x < y
およびy > x
x <= y
およびy >= x
比較は推移的である必要があります。 次の(網羅的ではない)例は、次のことを示しています。
x > y and y > z
はx > z
を意味しますx < y and y <= z
はx < z
を意味します逆比較を行うと、ブール否定が発生します。 つまり、次の式でも同じ結果になるはずです。
x == y
およびnot x != y
x < y
およびnot x >= y
(合計注文用)x > y
およびnot x <= y
(合計注文用)最後の2つの式は、完全に順序付けられたコレクションに適用されます(例: シーケンスには適用されますが、セットやマッピングには適用されません)。 total_ordering()デコレータも参照してください。
hash()の結果は、等式と一致している必要があります。 等しいオブジェクトは、同じハッシュ値を持つか、ハッシュ不可としてマークする必要があります。
Pythonはこれらの整合性ルールを強制しません。
5.9.2。 会員試験業務
演算子 in および not in はメンバーシップをテストします。 x in s
は x が s のメンバーである場合はTrue
と評価され、それ以外の場合はFalse
と評価されます。 x not in s
は、x in s
の否定を返します。 すべての組み込みシーケンスとセットタイプは、辞書と同様にこれをサポートします。 in は、辞書に特定のキーがあるかどうかをテストします。 list、tuple、set、frozenset、dict、collections.dequeなどのコンテナータイプの場合、式x in y
はany(x is e or x == e for e in y)
と同等です。
文字列およびバイトタイプの場合、 x が y のサブストリングである場合に限り、x in y
はTrue
です。 同等のテストはy.find(x) != -1
です。 空の文字列は常に他の文字列のサブ文字列と見なされるため、"" in "abc"
はTrue
を返します。
__contains__()
メソッドを定義するユーザー定義クラスの場合、x in y
はy.__contains__(x)
が真の値を返す場合はTrue
を返し、それ以外の場合はFalse
を返します。
__contains__()
を定義しないが、__iter__()
を定義するユーザー定義クラスの場合、値z
とx == z
は、y
を繰り返しながら生成されます。 反復中に例外が発生した場合、 in がその例外を発生したかのようになります。
最後に、古いスタイルの反復プロトコルが試されます。クラスが__getitem__()
を定義する場合、x in y
はTrue
であり、非負の整数インデックスがある場合に限ります。 x == y[i]
、およびすべての下位整数インデックスがIndexError
例外を発生させないようなi 。 (他の例外が発生した場合は、 in がその例外を発生したかのようになります)。
にない演算子は、にあるの逆の真の値を持つように定義されています。
5.9.3。 アイデンティティの比較
演算子はであり、はオブジェクトの同一性をテストしません:x is y
は、 x および y の場合にのみ真です。同じオブジェクトです。 x is not y
は、逆真理値を生成します。 6
5.10。 ブール演算
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として解釈されます:False
、None
、すべてのタイプの数値ゼロ、および空の文字列とコンテナー(文字列、タプル、リスト、辞書、セット、および凍結セットを含む)。 他のすべての値はtrueとして解釈されます。 (これを変更する方法については、 __ nonzero __()の特別なメソッドを参照してください。)
演算子 not は、引数がfalseの場合はTrue
を生成し、それ以外の場合はFalse
を生成します。
式x and y
は、最初に x を評価します。 x がfalseの場合、その値が返されます。 それ以外の場合は、 y が評価され、結果の値が返されます。
式x or y
は、最初に x を評価します。 x がtrueの場合、その値が返されます。 それ以外の場合は、 y が評価され、結果の値が返されます。
(ともまたはも、False
とTrue
に返す値とタイプを制限せず、最後に評価された引数を返すことに注意してください。 これは便利な場合があります。たとえば、s
が文字列であり、空の場合はデフォルト値に置き換える必要がある場合、式s or 'foo'
は目的の値を生成します。 not はとにかく値を発明する必要があるため、引数と同じ型の値を返す必要はありません。たとえば、not 'foo'
は、[ではなくFalse
を生成します。 X163X] 。)
5.11。 条件式
バージョン2.5の新機能。
conditional_expression ::= or_test ["if" or_test "else" expression] 表現 ::= conditional_expression | lambda_expr
条件式(「三項演算子」と呼ばれることもあります)は、すべてのPython演算の中で最も優先度が低くなります。
式x if C else y
は、最初に条件 C ( not x );を評価します。 C がtrueの場合、 x が評価され、その値が返されます。 それ以外の場合は、 y が評価され、その値が返されます。
条件式の詳細については、 PEP 308 を参照してください。
5.12。 ラムダ
lambda_expr ::= "lambda" [parameter_list]: expression old_lambda_expr ::= "lambda" [parameter_list]: old_expression
ラムダ式(ラムダ形式と呼ばれることもあります)は、式と同じ構文上の位置にあります。 これらは無名関数を作成するための省略形です。 式lambda parameters: expression
は、関数オブジェクトを生成します。 名前のないオブジェクトは、で定義された関数オブジェクトのように動作します
def <lambda>(parameters):
return expression
パラメータリストの構文については、セクション関数定義を参照してください。 ラムダ式で作成された関数にはステートメントを含めることができないことに注意してください。
5.13。 式リスト
expression_list ::= expression ( "," expression )* [","]
少なくとも1つのコンマを含む式リストは、タプルを生成します。 タプルの長さは、リスト内の式の数です。 式は左から右に評価されます。
末尾のコンマは、単一のタプル(別名 シングルトン); それ以外の場合はオプションです。 末尾にコンマがない単一の式はタプルを作成しませんが、その式の値を生成します。 (空のタプルを作成するには、空の括弧のペア()
を使用します。)
5.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
5.15。 演算子の優先順位
次の表は、Pythonでの演算子の優先順位を、最低の優先順位(最小のバインディング)から最高の優先順位(最大のバインディング)までまとめたものです。 同じボックス内の演算子の優先順位は同じです。 構文が明示的に指定されていない限り、演算子はバイナリです。 同じボックス内の演算子は左から右にグループ化されます(テストを含む、すべて左から右に同じ優先順位とチェーンを持つ比較を除く—セクション比較を参照—および右から左にグループ化するべき乗を除く) 。
オペレーター | 説明 |
---|---|
lambda
|
ラムダ式 |
if – else | 条件式 |
or
|
ブールOR |
and
|
ブールAND |
not x
|
ブールNOT |
in 、 not in 、 is 、 is not 、< 、<= 、[X82X ] 、>= 、<> 、!= 、==
|
メンバーシップテストとIDテストを含む比較 |
ビットごとのOR | |
^
|
ビット単位のXOR |
&
|
ビットごとのAND |
<< 、>>
|
シフト |
+ 、-
|
足し算と引き算 |
* 、/ 、// 、%
|
乗算、除算、剰余 7 |
+x 、-x 、~x
|
正、負、ビット単位ではありません |
**
|
べき乗 8 |
x[index] 、x[index:index] 、x(arguments...) 、x.attribute
|
サブスクリプション、スライス、呼び出し、属性参照 |
(expressions...) 、[expressions...] 、{key: value...} 、`expressions...`
|
バインディングまたはタプル表示、リスト表示、辞書表示、文字列変換 |
脚注
- 1
Python 2.3以降のリリースでは、リスト内包表記は、それに含まれる各
for
の制御変数を包含スコープに「リーク」します。 ただし、この動作は非推奨であり、これに依存することはPython3では機能しません。- 2
abs(x%y) < abs(y)
は数学的には真ですが、浮動小数点数の場合、四捨五入のために数値的には真ではない場合があります。 たとえば、Python浮動小数点数がIEEE 754倍精度数であるプラットフォームを想定すると、-1e-100 % 1e100
が1e100
と同じ符号を持つために、計算結果は [になります。 X185X]、これは1e100
と数値的に正確に等しくなります。 関数 math.fmod()は、代わりに最初の引数の符号と符号が一致する結果を返すため、この場合は-1e-100
を返します。 どちらのアプローチがより適切かは、アプリケーションによって異なります。- 3
xがyの正確な整数倍に非常に近い場合、丸めのために
floor(x/y)
が(x-x%y)/y
より1大きい可能性があります。 このような場合、Pythonは、divmod(x,y)[0] * y + x % y
がx
に非常に近いことを維持するために、後者の結果を返します。- 4
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文字列の比較演算子は、Unicodeコードポイントのレベルで比較します。 これは人間にとって直感に反するかもしれません。 たとえば、
u"\u00C7" == u"\u0043\u0327"
はFalse
ですが、両方の文字列が同じ抽象文字「LATIN CAPITAL LETTER CWITHCEDILLA」を表しています。抽象文字のレベルで(つまり、人間にとって直感的な方法で)文字列を比較するには、 unicodedata.normalize()を使用します。
- 5
以前のバージョンのPythonは、ソートされた(キー、値)リストの辞書式比較を使用していましたが、これは、同等性を比較する一般的なケースでは非常にコストがかかりました。 Pythonのさらに以前のバージョンでは、辞書をIDのみで比較していましたが、
{}
と比較することで辞書の空をテストできると期待されていたため、これは驚きをもたらしました。- 6
自動ガベージコレクション、フリーリスト、および記述子の動的な性質により、 is 演算子の特定の使用法では、インスタンスメソッドや定数間の比較など、一見異常な動作に気付く場合があります。 詳細については、ドキュメントを確認してください。
- 7
%
演算子は、文字列のフォーマットにも使用されます。 同じ優先順位が適用されます。- 8
べき乗演算子
**
は、右側の算術演算子またはビット単位の単項演算子よりも緊密に結合しません。つまり、2**-1
は0.5
です。