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の良さ気な書き方をまとめています。
こちらもどうぞ
Python:ファイルダウンロードの進行状況とファイルサイズを表示する方法。urllib
Pythonschedule2024-02-27
【Python】tqdmでforの進捗状況を表示する
PythonColabolatoryschedule2021-02-16
学習済みの日本語単語ベクトルをColabolatoryで試してみる
自然言語処理PythonColabolatoryschedule2021-02-04
Unity ML-Agentsで新しく学習環境を作る
Unity機械学習C#PythonDeepLearningschedule2021-01-22
27. 内部リンクの除去
自然言語処理100本ノックPythonschedule2020-03-17