Pythonで代入式を使用する方法
序章
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")
前のコードを実行すると、次の出力が表示されます。
OutputList 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_length
に len(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]
前のコードを実行すると、次のようになります。
OutputMultiplying 0 * 0
Multiplying 1 * 1
Multiplying 2 * 2
[1, 4]
あなたはという名前の関数を定義します slow_calculation
与えられた数を乗算します x
それ自体で。 次に、リスト内包表記が繰り返されます 0
, 1
、 と 2
によって返される range(3)
. 割り当て式は値をバインドします result
の帰りに slow_calculation
と i
. 追加します 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]
これを実行すると、次の出力が表示されます。
OutputMultiplying 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コンテンツを確認することもできます。