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

Pythonには、if文を一行で記述できる三項演算子(条件演算子)と呼ばれる書き方があります。

  1. 式 (expression) - 三項演算子 — Python 3.7.1 ドキュメント

ここでは、

三項演算子の基本的な書き方 if... elif... elseを一行で記述 リスト内包表記と三項演算子の組み合わせ 無名関数(ラムダ式)と三項演算子の組み合わせ

について、サンプルコードとともに説明します。 通常の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 * 2 if a % 2 == 0 else a * 3
print(result)
# 3

a = 2
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 4

値を返さない式(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

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

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 = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

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

なお、 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)として処理されます。

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

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

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の考え方。

Last Updated: 6/26/2019, 10:34:03 PM