プログラミングをするとき、できる限り短いコードで簡潔に書けると美しく見えるものです。
プロジェクトごとにコード規約があり、それによっては短くすることが必ずしも正義とは限らないことにご留意ください。
今回は、Pythonの三項演算子について紹介していきます。
通常のif/else文
通常であれば、Pythonの条件式は以下のように書きます。
is_sunday = True
if is_sunday:
print("Today is Sunday")
else:
print("Today is not Sunday")
# 出力
# Today is Sunday
単純な日曜日を判定する、という構文です。
三項演算子パターン
では、次にこれの三項演算子で書いたパターンを見ていきましょう。
is_sunday = True
print("Today is Sunday") if is_sunday else print("Today is not Sunday")
(ifがTrueだった場合) if 条件式 else (ifがFalseだった場合)
という形になります。
これが三項演算子の基本形です。
lambdaで表現するパターン
実際に役立つシーンの1つがlambda(無名関数)を利用したときです。
実際に書き方を見てみましょう。
is_sunday = True
detection = (lambda is_sunday: "Today is Sunday" if is_sunday else "Today is not Sunday")
print(detection(is_sunday))
このように、lambdaとして用意してあげれば、この三項演算子の再利用が捗ります。
内包表記で使うパターン
別の役立つシーンに内包表記があります。
内包表記自体は以下のように書きます。
scores = {'Taro': 90, 'Hanako': 80, 'Jiro': 77}
[print(name, score) for name, score in scores.items()]
# 出力
# Taro 90
# Hanako 80
# Jiro 77
これを、80点以上に限定して表示してみましょう。
scores = {'Taro': 90, 'Hanako': 80, 'Jiro': 77}
[print(name, score) for name, score in scores.items() if score >= 80]
# 出力
# Taro 90
# Hanako 80
このように、内包表記の内部に使うことで大幅なコード省略につながります。
Pythonのショートハンド
他にも短くコードを書くテクニックがあるので紹介していきます。
文字列の連結
文字列の連結をする際、+
や変数展開を使うことが多いです。あまり知られていませんが、以下のようにも書けます。
print("Hello," + "World!")
print("Hello," "World!") # +は必要ない
なお、以下のような書き方はできないため、あまり利用シーンはありません。
world = "World!"
print("Hello," + world)
print("Hello," world) # エラーになる
これが役立つシーンとして、URLの変数化があります。\
で改行して連結することで、一行の長さを定めているコード規約を回避できます。
long_url = 'https://www.google.com/search?q=python&oq=python'\
'&gs_lcrp=xxxxxxxxxxxxxxxxxxxx&sourceid=chrome&ie=UTF-8'
なお、()
を使うと、\
も必要なくなります。
long_url = ('https://www.google.com/search?q=python&oq=python'
'&gs_lcrp=xxxxxxxxxxxxxxxxxxxx&sourceid=chrome&ie=UTF-8')
if
文の条件式でも()
は使えるので、長めの条件式を使う際に有効です。
a = 1
b = 2
if (a == 1 and
b == 2):
print("Hello World")
インクリメントとデクリメント
整数を1だけ上げたい、逆に1だけ下げたい、というときに使うのがインクリメントとデクリメントです。
通常は以下のように書きます。
a = 1
print(a)
a += 1
print(a)
a -= 1
print(a)
# 出力
# 1
# 2
# 1
これをショートハンドで書くと、以下のように書けます。
※ショートハンドと言いつつ、実はこちらのほうが1文字多い。
a = 1
print(a)
a = -~a
print(a)
a = ~-a
print(a)
and/orを使った変数代入
最後に、and
とor
を使った条件を使った変数の代入方法について紹介します。
条件を使った変数代入は通常以下のようになります。
a = ''
b = ''
if not a: # aは空文字なのでFalse判定
b = 'Sunday'
print(b)
# 出力
# Sunday
これを短く書けます。
a = ''
b = a or 'Sunday'
print(b)
# 出力
# Sunday
このように、or
演算子を使うと、前者のa
がFalse
のときに後者が評価されます。逆にand
を使うと、前者がFalse
のときに前者が評価されます。
a = ''
b = a and 'Sunday'
print(b)
# 出力なし(空文字)
これを使うと、たとえばデータベースインスタンスがあればインスタンスを返し、なければNone
を返す、といった実装ができます。
稀に使う機会があるので覚えておいて損はありません。
短いことが正義ではない
コードを短く書くことよりも、読みやすいことのほうが正義です。
誰も理解できないコードを書いて、理解に時間を要する状態にしてはいけません。
しかしながら、短いコードが有効なシチュエーションで正しく使うことができれば、逆に可読性を上げることが可能です。適切な使い方を理解して、より美しいコードを書いていきましょう。