Python3.8で追加された代入式の書き方と使い方

2019年11月17日

みなさまおはこんばんにちは、せなです

今回はPython3.8から新しく追加された代入式の使い方について解説したいと思います

代入式の書き方

基本的なif文は以下のようなコードです

num = 5
if num > 1:
    print(num)
else:
    print('num < 1')
return

----結果----
5

上記を代入式にしてコードを書くと以下のようになります

if (num := 5) > 1:
    print(num)
else:
    print('num < 1')

----結果----
5

whileを使ったファイルの読み込み処理で代入式を利用

一般的なファイルの読み込み

with open(path) as f:
    while True:
        s = f.read(5000)
        if not s:
            break
        print(len(s))

代入式を使用したファイルの読み込み

with open(path) as f:
    while s := f.read(5000):
        print(len(s))

一般的な書き方よりも短いコードで記述できます

リスト内包表記で2回関数を実行する時の代入式の利用

リスト内包表記を使用しない場合

old_list = [1,2,3,4]
new_list = []
for x in old_list:
    y = cal(x)
    if y > 0:
        new_list.append(y)
print(new_list)

def cal(x):
    x = x * x
    return x

----結果----
[1, 4, 9, 16]

関数の呼び出しは1回で行えるが冗長な部分が多いです

リスト内包表記を使用した場合

old_list = [1,2,3,4]
new_list = [cal(x) for x in old_list if cal(x) > 0]
print(new_list)

def cal(x):
    x = x * x
    return x

----結果----
[1, 4, 9, 16]

リスト内包表記を使用しない場合と比べて短いコードで記述できます

リスト内包表記に代入式を使用した場合

old_list = [1,2,3,4]
new_list = [y for x in old_list if (y:=cal(x)) > 0]
print(new_list)

def cal(x):
    x = x * x
    return x

----結果----
[1, 4, 9, 16]

一度の関数呼び出しで処理を行うことができます

代入式で気おつけること

下記のような式があるプログラムを見るときには代入がされていることを踏まえてトレースを行う必要が出てきました

[y for x in old_list if (y:=cal(x)) > 0]    #後ろのy:=cal(x)で代入が行われている

Python3.7までは問題ないですが、環境がPython3.8以降の時には気おつけるようにしましょう