schedule2019-02-10

三項演算子の代わりにmax, minを使いすっきり書く | Python

2つの変数を比較してどちらか大きい(小さい)方を選ぶとき、三項演算子を使うよりもmax()min()を使うほうがすっきりと書けます。

Python 言語リファレンスでは三項演算子ではなく条件式とありますが、今回は他の言語に倣って三項演算子(ternary operator)と呼びます。

三項演算子

まずは三項演算子の使い方から。

変数 = 真の場合の代入値 if 条件文 else 偽の場合の代入値

aが0より大きい場合は変数にaを入れる」とする場合は以下の書き方になる。

a = 10

s = a if a > 0 else 0
print(s)
# => 10

max(), min()を使うと

a = 10

# 大きい方
s = max(a, 0)
print(s)
# => 10

# 小さい方
s = min(a , 0)
print(s)
# => 0

少しの差ですがs = a if a > 0 else 0よりもs = max(a, 0)の方がすっきり見えますし、意味も伝わりやすいと思います。

複数の要素を比較する

なぜmax(), min()を使ってほしいか、複数の変数を比較するときに理解しやすいからです。

# 三項演算子を使った分かりづらい例

a = 10
b = 5

# a, b, 0 のうち大きい値
tmp = a if a > 0 else 0
s = b if b > tmp else tmp
print(s)
# => 10

# a, b, 0 のうち大きい値
s = a if a > (b if b > 0 else 0) else (b if b > 0 else 0)
print(s)
# => 10

何をしたいのかコメントが正しくないとわかりづらい。 この書き方はやめて頂きたい。

# a, b, 0 のうち大きい値
print(max(a, b, 0))
# => 10

max()min()は3つ以上の変数も使えます。こちらの方がわかりやすいです。

配列の中身と比較する

おまけに配列の中身と比較して大きい方を取得する方法を書いておきます。 あまり使い所が思いつきませんが。。

arr = [-2, -3, -1]
s = max(0, *arr)
print(s)
# => 0

*arrと書くとリストの要素をバラして渡すことが出来ます。max(0, -2, -3, -1)と同じになる。

max(0, arr)
# => [-2, -3, -1]

max(*arr, 0)
#   File "<stdin>", line 1
# SyntaxError: only named arguments may follow *expression

順番を入れ替えたり*がないとこうなるので注意。

終わりに

Pythonの良さ気な書き方をまとめています。

こちらもどうぞ