著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

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

代入式を使用すると、より大きな式の内部で変数の代入を行うことができます。 代入式は、正しいPythonコードを記述するために厳密に必要になることはありませんが、既存のPythonコードをより簡潔にするのに役立ちます。 たとえば、:=構文を使用した代入式を使用すると、 ifステートメント内で変数を割り当てることができます。これにより、前の行または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

3つの要素を含むsome_listという名前のリストを初期化します。 次に、ifステートメントは、代入式((list_length := len(some_list))を使用して、list_lengthという名前の変数をsome_listの長さにバインドします。 list_length2より大きいため、ifステートメントはTrueと評価されます。 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")

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

別の同等のコードサンプルは、len(some_list)を2回計算する場合があります。1回はifステートメントで、もう1回は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ループでうまく機能することがよくあります。これは、より多くのコンテキストをループ条件にフォールドできるためです。

whileループ条件内にユーザーinput関数を埋め込む次の例について考えてみます。

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ループの本体に出力されます。 stopと入力すると、whileループが終了します。

代入式を使用していなかった場合は、次のような同等の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]

は、指定された数xにそれ自体を乗算するslow_calculationという名前の関数を定義します。 次に、リスト内包は、range(3)によって返される01、および2を繰り返します。 代入式は、値resultを、iを使用してslow_calculationの戻り値にバインドします。 resultは、0より大きい限り、新しく作成されたリストに追加します。 この例では、01、および2はすべて乗算されますが、結果11 * 1)と42 * 2)は、0より大きい条件を満たし、最終リスト[1, 4]の一部になります。

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 * 00より大きくないため、0は1回だけ乗算されます。 ただし、他の結果は0より大きい条件を満たすために二重に計算され、結果が再計算されて最終リスト[1, 4]の一部になります。

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

結論

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

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

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