序章

Python 3.8 は、2019年10月にリリースされ、Pythonに代入式を追加します。 := 構文。 代入式の構文は、「セイウチ演算子」と呼ばれることもあります。 := 漠然と牙のあるセイウチに似ています。

代入式を使用すると、より大きな式の内部で変数の代入を行うことができます。 代入式は、正しいPythonコードを記述するために厳密に必要になることはありませんが、既存のPythonコードをより簡潔にするのに役立ちます。 たとえば、を使用した代入式 := 構文を使用すると、 ifステートメント内で変数を割り当てることができます。これにより、多くの場合、前後の行の変数割り当てを削除することで、Pythonコードのより短くコンパクトなセクションを作成できます。 if 声明。

このチュートリアルでは、いくつかの例で割り当て式を使用して、コードの簡潔なセクションを作成します。

前提条件

このチュートリアルを最大限に活用するには、次のものが必要です。

  • Python3.8以降。 代入式は、Python3.8以降に追加された新機能です。 Pythonのインストールとアップグレードについては、Python3のインストール方法とUbuntu18.04サーバーへのプログラミング環境のセットアップチュートリアルをご覧ください。

  • Pythonインタラクティブコンソール。 このチュートリアルのサンプルコードを試してみたい場合は、 PythonInteractiveConsoleの操作方法チュートリアルを使用できます。

  • ある程度の知識 while ループ、 if Python 3のステートメント、リスト内包表記、および関数は便利ですが、必須ではありません。 背景知識については、 Python3チュートリアルシリーズでコーディングする方法を確認できます。

での代入式の使用 if ステートメント

で代入式を使用する方法の例から始めましょう if 声明。

list の長さをチェックし、ステートメントを出力する次のコードについて考えてみます。

some_list = [1, 2, 3]
if (list_length := len(some_list)) > 2:
    print("List length of", list_length, "is too long")

前のコードを実行すると、次の出力が表示されます。

Output
List length of 3 is too long

名前の付いたリストを初期化します some_list 3つの要素が含まれています。 そうして if ステートメントは代入式を使用します ((list_length := len(some_list)) 名前の付いた変数をバインドする list_length の長さに some_list. The if ステートメントは次のように評価されます True なぜなら list_length より大きい 2. を使用して文字列を印刷します list_length 変数。最初に代入式でバインドしました。これは、3要素のリストが長すぎることを示しています。

注:代入式は、 Python3.8で導入された新機能です。 このチュートリアルの例を実行するには、Python3.8以降を使用する必要があります。

代入式を使用していなかった場合、コードは少し長くなった可能性があります。 例えば:

some_list = [1, 2, 3]
list_length = len(some_list)
if list_length > 2:
    print("List length of", list_length, "is too long")

このコードサンプルは最初の例と同等ですが、このコードでは、の値をバインドするために1行の追加のスタンドアロン行が必要です。 list_lengthlen(some_list).

別の同等のコードサンプルは、 len(some_list) 2回:1回 if ステートメントと一度 print 声明。 これにより、変数を次の値にバインドするために必要な余分な行が発生するのを回避できます。 len(some_list):

some_list = [1, 2, 3]
if len(some_list) > 2:
    print("List length of", len(some_list), "is too long")

割り当て式は、余分な行や二重計算を回避するのに役立ちます。

注:代入式は便利なツールですが、必ずしも必要ではありません。 パッセージの読みやすさが大幅に向上する場合は、判断を使用してコードに代入式を追加します。

次のセクションでは、内部で代入式を使用する方法について説明します。 while ループします。

での代入式の使用 while ループ

代入式は、 whileループでうまく機能することがよくあります。これは、より多くのコンテキストをループ条件にフォールドできるためです。

ユーザーを埋め込む次の例を考えてみましょう input 内部の機能 while ループ状態:

while (directive := input("Enter text: ")) != "stop":
    print("Received directive", directive)

このコードを実行すると、Pythonは、単語を入力するまで、キーボードからのテキスト入力を継続的に要求します。 stop. セッションの例は次のようになります。

>>> while (directive := input("Enter text: ")) != "stop":
...     print("Received directive", directive)
...
Enter text: hello
Received directive hello
Enter text: example
Received directive example
Enter text: stop
>>>

代入式 (directive := input("Enter text: ")) の値をバインドします directive を介してユーザーから取得した値に input 関数。 戻り値を変数にバインドします directive、本文に印刷します while ループ。 The while 入力するたびにループが終了します stop.

割り当て式を使用していなかった場合は、同等の式を記述した可能性があります input 次のようなループ:

directive = input("Enter text: ")
while directive != "stop":
    print("Received directive", directive)
    directive = input("Enter text: ")

このコードは、割り当て式を使用したコードと機能的に同じですが、(2行ではなく)合計4行が必要です。 また、 input("Enter text: ") 2か所でお電話ください。 確かに、同等のものを書く方法はたくさんあります while ループしますが、前に紹介した代入式のバリアントはコンパクトで、プログラムの意図をうまく捉えています。

これまで、で代入式を使用してきました if ステートメントと while ループします。 次のセクションでは、リスト内包内で割り当て式を使用します。

リスト内包表記での割り当て式の使用

リスト内包表記で割り当て式を使用することもできます。 リスト内包表記を使用すると、シーケンスを繰り返し処理し、特定の条件を満たす要素をリストに追加することで、リストを簡潔に作成できます。 リスト内包表記と同様に、代入式を使用して読みやすさを向上させ、コードをより簡潔にすることができます。

リスト内包表記と割り当て式を使用して、乗算された整数のリストを作成する次の例について考えてみます。

def slow_calculation(x):
    print("Multiplying", x, "*", x)
    return x * x

[result for i in range(3) if (result := slow_calculation(i)) > 0]

前のコードを実行すると、次のようになります。

Output
Multiplying 0 * 0 Multiplying 1 * 1 Multiplying 2 * 2 [1, 4]

あなたはという名前の関数を定義します slow_calculation 与えられた数を乗算します x それ自体で。 次に、リスト内包表記が繰り返されます 0, 1、 と 2 によって返される range(3). 割り当て式は値をバインドします result の帰りに slow_calculationi. 追加します result 0より大きい限り、新しく作成されたリストに追加されます。 この例では、 0, 1、 と 2 すべてが自分自身で乗算されますが、結果のみ 1 (1 * 1) と 4 (2 * 2)大なり記号を満たす 0 条件を整え、最終リストの一部になります [1, 4].

The slow_calculation 機能は絶対的に遅いとは限りませんが、効率に関する重要なポイントを説明することを目的としています。 代入式を使用しない前の例の代替実装について考えてみます。

def slow_calculation(x):
    print("Multiplying", x, "*", x)
    return x * x

[slow_calculation(i) for i in range(3) if slow_calculation(i) > 0]

これを実行すると、次の出力が表示されます。

Output
Multiplying 0 * 0 Multiplying 1 * 1 Multiplying 1 * 1 Multiplying 2 * 2 Multiplying 2 * 2 [1, 4]

前のコードのこのバリアントでは、割り当て式を使用していません。 代わりに、あなたは slow_calculation 最大2回:確実にするために1回 slow_calculation(i) より大きい 0、および場合によっては、計算結果を最終リストに追加するための2回目。 0 のために一度だけそれ自体と乗算されます 0 * 0 より大きいではありません 0. ただし、他の結果は0より大きい条件を満たすため、二重に計算され、結果が再計算されて最終リストの一部になります。 [1, 4].

これで、代入式とリスト内包表記を組み合わせて、効率的で簡潔なコードブロックを作成できました。

結論

このチュートリアルでは、代入式を使用して、内部の変数に値を代入するPythonコードのコンパクトなセクションを作成しました。 if ステートメント、 while ループ、リスト内包。

他の代入式の詳細については、 PEP 572 を参照してください。これは、Pythonに代入式を追加することを最初に提案したドキュメントです。

トピックページで他のPythonコンテンツを確認することもできます。