Pythonの三項演算子を使って、if文を1行で記述しよう

プログラミング 公開日: 更新日:
ブックマーク
Pythonの三項演算子を使って、if文を1行で記述しよう
Pythonで使われる三項演算子について説明します。三項演算子とは何か、if文と三項演算子との表記の違いや、具体的な使い方を説明していきます。最後にlambda(無名関数)との組み合わせ方法を説明します。Pythonの三項演算子を活用して、コードを簡潔に記述しましょう。

Pythonでのプログラミングにおいて条件分岐を表現する方法にif文がありますが、if文では「条件式」、「成立時の処理」、「不成立時の処理」と複数行にわたり記述する必要があります。
三項演算子を使用すると、これらを単一の行で表記できるようになります。
主に簡単な条件と処理内容の場合に三項演算子を使うとコードを簡潔に表現できるようになります。
Pythonにおける三項演算子の具体的な使い方の説明やlambda(無名関数)との組み合わせを説明していきます。

Pythonの三項演算子とは

三項演算子とは条件分岐を単一の行で表現するためのものです。
単一の行で表現できるのでコードを簡潔にすることができます。また、式として扱うのでif文が書けない場合などにも活用できます。
ただし、複雑な条件分岐を無理に三項演算子で表現しようとすると、逆に分かりづらくなる場合もあるので注意が必要です。

if文表記と三項演算子の違い

実際にサンプルコードでif文と三項演算子の表記の違いを見てみましょう。
下記の例は数値を格納した変数の中身が奇数か偶数かをprintする処理です。

if文で記述

num=2
if num%2==0:
    print('偶数です。')
else:
    print('奇数です。')

# 出力結果:偶数です。

三項演算子で記述

num=2
print('偶数です。' if num%2==0 else '奇数です。')

# 出力結果:偶数です。

上記サンプルコードの場合、if文は4行必要としていますが、三項演算子ですと1行で記述可能なことがわかります。

Pythonでの三項演算子の使い方

Pythonにおける三項演算子はどのように使用すれば良いのかを理解しましょう。

三項演算子の基本的な使い方

三項演算子は以下のように記述します。

条件成立時の値 if 条件式 else 条件不成立時の値 

先ほどのサンプルコードですと、print関数内が三項演算子による表記になります。

num=2
print('偶数です。' if num%2==0 else '奇数です。')

これを分解すると

条件成立時の値:'偶数です。'
条件式:num%2==0
条件不成立時の値: '奇数です。'

となります。

サンプルの条件式では変数numが偶数か奇数かを、2で割った余りが0かどうかで判定しています。
サンプルではnumが2なので条件式が成立するため、「偶数です。」という文字列が出力されます。

numが3の場合には条件式が成立しないため、「奇数です。」という文字列が出力されます。

num=3
print('偶数です。' if num%2==0 else '奇数です。')

# 出力結果:奇数です。

サンプルコードでは三項演算子の結果をprint関数でそのまま出力していますが、下記のように結果を変数で受け取ることもできます。

num=2
res=('偶数です。' if num%2==0 else '奇数です。')
print(res)

# 出力結果:偶数です。

三項演算子でelif文を記述(条件式のネスト)

三項演算子でelif文を表現する方法を説明します。
三項演算子内では「elif」は記述できません。三項演算子でelif文を表現する際は条件不成立時の値にさらに三項演算子を記述して、条件式を入れ子構造(ネスト)にします。
例として先ほどのコードに変数numがNoneの場合の処理を追加し、None以外の場合に偶数か奇数かを判定する処理を記述してみます。

num=None
res=('判定できません' if num is None else '偶数です。' if num%2==0 else '奇数です。')
print(res)

#出力結果:判定できません

Pythonの三項演算子は便利ですが、あまりネストを多用しすぎると可読性が悪くなってしまいますので、実装の際には注意しましょう。

三項演算子とlambdaを組み合わせて使う

最後に三項演算子とlambdaの組み合わせを説明します。
今回は冒頭のサンプルコードで示した偶数か奇数かの判定を関数化する例で説明していきます。

まずはdef文で冒頭のサンプルコードを関数化した場合です。
num_judgeという関数を作成し、引数として与えられた数値が偶数か奇数かによって出力する内容が変わる処理を記述します。

def文で記述

def num_judge(num):
    if num%2==0:
        print('偶数です。')
    else:
        print('奇数です。')

#偶数を与えた場合
num_judge(2)
#奇数を与えた場合
num_judge(3)

出力結果:偶数です。
出力結果:奇数です。

次にlambdaと三項演算子の組み合わせで記述した場合です。
lambdaは無名関数と呼ばれるものでdef文のように関数名を付ける必要がなく、簡易な関数を定義したい際に使うと簡潔に表現できます。
lambdaは次のように記述します。

lambda 引数:処理内容

Pythonのlambdaについて詳しくは以下のページもご参照ください。
Python lambda(ラムダ式 無名関数)を理解して活用しよう

では先ほどのdef文で記述したnum_judge関数と同等の処理をlambdaと三項演算子を使って表現します。
lambdaの処理内容の部分を三項演算子で記述しています。

lambdaと三項演算子で記述

res=(lambda num:'偶数です。' if num % 2 == 0 else '奇数です。')

#偶数を与えた場合
print(res(2))
#奇数を与えた場合
print(res(3))

# 出力結果:偶数です。
# 出力結果:奇数です。

def文と比べ、三項演算子をlambdaと組み合わせることで1行で簡潔に記述することができました。

このサンプルで使用したlabmda式を変数に代入する方法は、Pythonのコーディング規約であるPEP8 E731においては非推奨とされていますのでご注意ください。
文法上はエラーとはなりませんが、チェックツールなどでWarningが出る場合があります。

PEP8ではdef文を使用することが推奨されています。
PEP 8 – Style Guide for Python Code | peps.python.org

まとめ

Pythonにおいて条件分岐と簡易な処理を表現する際には、三項演算子を使用することで簡潔なコードを書くことができます。
さらにlambdaと組み合わせることで、関数も短い記述に納めることができます。

三項演算子はネストすることでelif文を表現することもできますが、多用するとかえって読み辛いコードになってしまうことには注意しましょう。

TECH PLAYでは、ITに関わる様々なイベント・勉強会・講演会・交流会・カンファレンス・セミナーなどの情報を集約し掲載しています。

テクノロジーと共に成長しよう、
活躍しよう。

TECH PLAYに登録すると、
スキルアップやキャリアアップのための
情報がもっと簡単に見つけられます。

面白そうなイベントを見つけたら
積極的に参加してみましょう。
ログインはこちら

タグからイベントをさがす