フリーキーズ | 独学プログラミング

Pythonの三項演算子とショートハンドいろいろ

最終更新日
【画像】Pythonの三項演算子とショートハンドいろいろ

プログラミングをするとき、できる限り短いコードで簡潔に書けると美しく見えるものです。

今回は、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を使った変数代入

最後に、andorを使った条件を使った変数の代入方法について紹介します。
条件を使った変数代入は通常以下のようになります。

a = ''
b = ''

if not a: # aは空文字なのでFalse判定
    b = 'Sunday'

print(b)

# 出力
# Sunday

これを短く書けます。

a = ''
b = a or 'Sunday'

print(b)

# 出力
# Sunday

このように、or演算子を使うと、前者のaFalseのときに後者が評価されます。逆にandを使うと、前者がFalseのときに前者が評価されます。

a = ''
b = a and 'Sunday'

print(b)

# 出力なし(空文字)

これを使うと、たとえばデータベースインスタンスがあればインスタンスを返し、なければNoneを返す、といった実装ができます。
稀に使う機会があるので覚えておいて損はありません。

短いことが正義ではない

コードを短く書くことよりも、読みやすいことのほうが正義です。
誰も理解できないコードを書いて、理解に時間を要する状態にしてはいけません。

しかしながら、短いコードが有効なシチュエーションで正しく使うことができれば、逆に可読性を上げることが可能です。適切な使い方を理解して、より美しいコードを書いていきましょう。

関連するコンテンツ