walrus演算子(:=)、または式代入演算子は、Python 3.8以降で登場しました。この演算子は、変数に値を直接式の中で代入できるようにするために導入されました(例えば、ループやif条件内で)。つまり、関数や計算の結果をすぐに取得・使用できるようになり、二度呼び出す必要がなくなります。
walrusが解決する問題は、計算を繰り返したり、代入のために余分なコード行を書く必要があることです。従来は、別々の呼び出しを行い、その結果を使用する必要がありました。
解決策:条件内で直接変数に式を代入できるようになったため、コードがより簡潔になり、時にはより可読性が向上します。ただし、walrusの過剰な使用はコードの理解を妨げることがあるため、特に経験の少ない同僚にとっては注意が必要です。
コード例:
while (line := input('文字列を入力してください: ')) != 'exit': print(f'あなたが入力した: {line}')
主な特徴:
walrus演算子を使用してグローバル変数に値を代入できますか?
はい、可能ですが、walrusは適用されたスコープ内で機能します。LEGBルールを覚えておき、関数外で変数を慎重に使用する必要があります。
x = exprと(x := expr)の違いは何ですか?
x = exprは独立した代入命令ですが、(x := expr)は他の式内でexprの結果を返し、それをxに代入します。多くの場合、後者はif文、whileループ、またはリスト表現内で使用できます。
walrusはリスト表現やジェネレーター内で使用できますか?
はい、walrusはcomprehensionで一般的に使用され、再計算を避けるのに特に便利です。
numbers = [int(s) for s in ['1', '2', '3', '4'] if (n := int(s)) > 2] # ここでnはint(s)の結果を保持し、計算を節約します
開発者が複数のネストしたwalrusを含む長い混乱したif文を書く:
if (a := get_a()) and (b := a.get_b()) and (c := b.do_c()): print(c)
長所:
短所:
計算と可読性を節約するための意図的な使用:
while (line := sys.stdin.readline()) != '': process(line)
長所:
短所: