Pythonの三項演算子(条件演算子)でif文を一行で書く

Modified: | Tags: Python

Pythonには、if文のような処理を一行で記述できる三項演算子(条件演算子、条件式)と呼ばれる書き方がある。

通常のif文については以下の記事を参照。

三項演算子の基本的な書き方

Pythonでは三項演算子は以下のように書く。

条件式が真のときに評価される式 if 条件式 else 条件式が偽のときに評価される式

条件によって値を切り替えたい場合は、単純にそれぞれの値をそのまま記述すればよい。

条件式が真のときに返す値 if 条件式 else 条件式が偽のときに返す値
a = 1
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# odd

a = 2
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# even

条件によって処理を切り替えたい場合は、それぞれの式を記述する。

a = 1
result = a * 10 if a % 2 == 0 else a * 100
print(result)
# 100

a = 2
result = a * 10 if a % 2 == 0 else a * 100
print(result)
# 20

値を返さない式(Noneを返す式)でも問題ない。条件によっていずれかの式が評価され処理が実行される。

a = 1
print('even') if a % 2 == 0 else print('odd')
# odd

通常のif文で書いた以下のコードと等価。

a = 1

if a % 2 == 0:
    print('even')
else:
    print('odd')
# odd

複数の条件式を論理演算子(andor)で連結することもできる。

a = -2
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# negative and even

a = -1
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# positive or odd

if ... elif ... else ...を一行で記述

if ... elif ... else ...を一行で記述する特別な書き方は用意されていないが、三項演算子の条件式が偽のときに評価される式にさらに三項演算子を使うことで実現可能。三項演算子をネストするイメージ。

ただし、可読性が落ちるので多用しないほうがいいかもしれない。

a = 2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# positive

a = 0
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# zero

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

なお、

A if 条件式1 else B if 条件式2 else C

は、

1. A if 条件式1 else ( B if 条件式2 else C )
2. ( A if 条件式1 else B ) if 条件式2 else C 

の2通りの解釈が可能だが、前者(1)として処理される。

具体例は以下の通り。最初の式は2番目の式のようにみなされる。

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

result = 'negative' if a < 0 else ('positive' if a > 0 else 'zero')
print(result)
# negative

result = ('negative' if a < 0 else 'positive') if a > 0 else 'zero'
print(result)
# zero

リスト内包表記と三項演算子の組み合わせ

三項演算子を使うと便利なのが、リスト内包表記でリストを処理する場合。

三項演算子とリスト内包表記を組み合わせることで、条件に応じてリストの要素を置換したり何らかの処理を行うことができる。

l = ['even' if i % 2 == 0 else i for i in range(10)]
print(l)
# ['even', 1, 'even', 3, 'even', 5, 'even', 7, 'even', 9]
l = [i * 10 if i % 2 == 0 else i for i in range(10)]
print(l)
# [0, 1, 20, 3, 40, 5, 60, 7, 80, 9]

リスト内包表記についての詳細は以下の記事を参照。

無名関数(ラムダ式)と三項演算子の組み合わせ

無名関数(ラムダ式)と三項演算子を組み合わせるのも便利。

get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

なお、三項演算子とは関係ないが、上の例はラムダ式に名前を割り当てているため、Pythonのコーディング規約PEP8の自動チェックツールなどでWarningが出ることがある。

これは、PEP8では関数に名前を割り当てる場合はdefを使うことが推奨されているため。

ラムダ式は呼び出し可能なオブジェクトを引数で渡すときなどに名前を付けずに使うためのもので、名前を付けて定義する場合はdefを使う、というのがPEP8の考え方。

ラムダ式についての詳細は以下の記事を参照。

関連カテゴリー

関連記事