この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。
前回は、引き続き無名関数をご紹介しました。高階関数と無名関数を使用すると、シンプルなコードが書けます。

今回は三項演算子です。条件分岐をシンプルに書く方法を学びます。
三項演算子とは
条件分岐を記述する際には、通常if文を使います。三項演算子は条件によって返す値が異なる処理を記述する際に使用することが多いです。
条件によって返す値が異なる関数をif文で記述すると、以下のようになります。
def 関数(): if 条件: return 値1 else: return 値2
これを三項演算子で記述すると、以下のようになります。
値1 if 条件 else 値2
実際の例を見てみましょう。以下は数値の奇数/偶数を判定する関数です。
def check_even_odd(n): if n % 2 == 0: return 'even' else: return 'odd' print(check_even_odd(10)) # even を返す
これを三項演算子で記述してみましょう。
n = 10 r = 'even' if n % 2 == 0 else 'odd' print(r) # even を返す
かなりシンプルになりました。繰り返し使用しないのであれば、こちらの方がわかりやすいです。
三項演算子のネスト
条件式をネストする場合は、if文で記述すると以下のようになります。
def 関数(): if 条件1: return 値1 elif 条件2: return 値2 else: return 値3
これを三項演算子で記述すると、以下のようになります。
値1 if 条件1 else 値2 if 条件2 else 値3
たとえば、以下は整数が0の場合は「zero」、0以外の偶数であれば「even」、それ以外は「odd」を返します。
n = 3 r = 'zero' if n == 0 else 'even' if n % 2 == 0 else 'odd' print(r) # odd を返す
このような記述が可能なのですが、多用すると可読性が落ちてしまいます。その様な場合には、素直にif文を使った方がいいでしょう。
関数との組み合わせ
関数が返す値に三項演算子を使えます。
def 関数名(引数1, 引数2,・・・): # 処理 return 値1 if 条件 else 値2
以下は実際の使用例です。
def calc_price(price, tax_included): return price if tax_included else int(price * 1.1) print(calc_price(100, True)) # 100 を返す print(calc_price(100, False)) # 110 を返す
この関数は価格が税抜き表示の場合、税込み(+10%)価格に変換して返します。
内包表記との併用
三項演算子は内包表記と併せて使用できます。以下はリスト内包表記の記述方法です。
[式 for 変数 in イテラブル if 条件式]
上記の「式」の部分を三項演算子で記述できます。
[値1 if 条件 else 値2 for 変数 in イテラブル if 条件式]
以下は実際の使用例です。
l_1 = [3, 4, 6, 0, 1] l_2 = ['odd' if x % 2 else 'even' for x in l_1 if x != 0] print(l_2) # ['odd', 'even', 'even', 'odd'] を返す
リストの要素のうち0を除いて、奇数/偶数を判定したリストを作成します。
無名関数を使用した三項演算子
無名関数は1行しか書けないという制限があります。返す値に三項演算子を使用することで、ある程度込み入った処理を含む無名関数を記述できます。記述方法は以下になります。
lambda 引数 : 値1 if 条件 else 値2
以下は実際の使用例です。リストの要素を、奇数/偶数に判定したリストを作成します。
l_1 = [3, 4, 6, 0] m = map(lambda x: 'odd' if x % 2 else 'even', l_1) print(list(m)) # ['odd', 'even', 'even', 'even'] を返す
このように三項演算子は、色々な手法と絡めて使用すると効果的です。ただし、多用するとプログラムがわかりづらくなるので注意が必要です。
次回はdataclass
いかがでしょうか。三項演算子をうまく使うと、スマートなコードが書けそうです。次回はdataclassです。簡単にデータを格納できる手法とのことなのですが、どんな機能なんでしょうか。お楽しみに!!