note.nkmk.me

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

Date: 2018-03-30 / tags: Python
このエントリーをはてなブックマークに追加

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

ここでは、

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

について、サンプルコードとともに説明する。

スポンサーリンク

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

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

`条件式が真のときに返す値` 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

複数の条件式を論理演算子(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 = -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

リスト内包表記で利用

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

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

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]

詳細は以下の記事を参照。

無名関数(ラムダ式)で利用

無名関数(ラムダ式)でも簡潔に記述できる三項演算子が便利。

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

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

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事