Pythonのプログラムを読んでいると、よくwhile True:
で始まるループをよく見かけませんか?
Python3.7まではwhile True:と書くしかないといった状況が多かったのが、実はPython3.8からは事情がかわっています。
Python3.8で導入されたWalrusオペレータを活用すると、ほぼ全てのwhile True:
を撲滅することが出来るんです!
ということで、このあたり解説していきます。
世界中で量産されてきたwhile True:という記述
Pythonは、シンプルで学習コストが低いという利点がありますが、逆にそれが仇となり、プログラムが変に長くなることがあります。
次の例ような、標準入力からコマンドを受け取って対話的な処理を行い、"exit"
というコマンドが入力されたら終了するようなプログラムを考えてみましょう。
こういったプログラムでは、どうしてもwhile True:
のループの中で条件チェックをして、その判定結果によってbreak
処理を行う、という構造に(Python3.7までは)ならざるを得ませんでした。
while True:
command = input('コマンド:')
if command == 'exit':
break
# コマンドごとの処理
せめてdo〜whileのような構文があれば、もう少し違っていたかもしれませんが、Pythonにはそんなものは用意されていないので、常にモヤモヤしていた人も多いと思います。
でもPython3.8からは、while True:
なんか使わずに、こんな感じでそこそこ…いや、まずまず?…エレガントに書くことができます。
while (command := input('コマンド:')) != 'exit':
# コマンドごとの処理
セイウチオペレータ
Python3.8から追加された構文に、Walrus operator(ワルラスオペレータ)というものがあります。
a = 100
という式はaに100を代入しますが、戻り値はありません。しかし、
(a := 100)
と記述すると、aに100が代入された後、さらにaの値が戻り値となります。
この特性を使うと、代入と比較を1行でひといきに行うことができるようになります。
if (a := 4 + 5 + 6 + 7) % 2 == 0:
print(f'{a}は偶数です。') # 22は偶数です。
Walrusオペレータのwalrusは、セイウチという意味なので、直訳するとセイウチオペレータになります。なぜこのような名前になっているかというと、見た目がセイウチっぽいからなんだとか(笑)
結論
このWalrusオペレータを使って、みんなでwhile True:
というモヤっとするプログラムを撲滅しよう!