【自前python講座】三項演算子

python-ternary-operator プログラミング
python-ternary-operator



自前の python 講座用資料です.
今回は,1ラインで条件分岐を書くことができる三項演算子について紹介します.
三項演算子を用いることにより,コードの行数を低減できたり,式が明確化されてコードの可読性が上がったりする効果が期待されます.
しかし,if-elif-else の elif が多い処理を三項演算子を用いて記載すると読みにくくなるので,elif の多い処理については一般的なコロンとインデントブロックを用いた条件分岐で書くことをお勧めします.

今回のコードは,こちらの github にも載せています.

https://github.com/KazutoMakino/PythonCourse/blob/main/005_ternary_operator/005_ternary_operator.ipynb

if-else を 1 ラインで

if 条件式:
    真の時の処理
else:
    偽の時の処理

上記は,コロンとインデントブロックを用いた条件分岐の書き方ですが,これを三項演算子を用いると,以下のように 1 ラインで書くことができます.

真の時の処理 if 条件式 else 偽の時の処理

個人的には,最初に “if 条件式 else” を書いて,その後,OKだった処理は左,NGは右という風に覚えています.
以下に例を示します.

a = "python"
b = "PYTHON"
c = True if a==b else False
c

# False

この式は次と同じ意味を表します.

if a==b:
    c = True
else:
    c = False
c

# False

もちろん条件式は,論理演算子(and, or, &, | )を用いて複数条件を書くことも可能です.

a = (1, 3, 5, 7, 9)
b = 2.5
c = "OK" if (round(b) in a) or isinstance(a, list) else "NG"
c

# 'NG'

ちなみに,round は偶数丸めなので round(2.5) -> 2,a はタプルです.

if-elif-else を 1 ラインで

if 条件式_1:
    条件式_1が真の時の処理
elif 条件式_2:
    条件式_2が真の時の処理
else:
    上記すべての条件式が偽の時の処理

上記は,コロンとインデントブロックを用いた if-elif-else の書き方ですが,これを三項演算子を用いると,以下のように 1 ラインで書くことができます.

条件式_1が真の時の処理 if 条件式_1 else 条件式_2が真の時の処理 if 条件式_2 else 上記すべての条件式が偽の時の処理

もちろん,この後に条件式をいくつか連ねてもOKで,処理は前から実行されます.
意味は同じですが,if-else if-else となっているので,if-elif-else という形ではなくて,どちらかというと三項演算子の書き方は,

if 条件式_1:
    条件式_1が真の時の処理
else:
    if 条件式_2:
        条件式_2が真の時の処理
    else:
        上記すべての条件式が偽の時の処理

という形に近く,こちらの書き方と同じと言ったほうがイメージがつきやすいですね.
以下に例を示します.

a = (1, 3, 5, 7, 9)
b = 2.5
c = "round(b) is in a" if round(b) in a else "round(b) is in a and a is list" if isinstance(a, list) else "round(b) is not in a and a is not list"
c

# 'round(b) is not in a and a is not list'

これは以下の if-elif-else と同じ意味です.

if round(b) in a:
    c = "round(b) is in a"
elif isinstance(a, list):
    c = "round(b) is not in a and a is list"
else:
    c = "round(b) is not in a and a is not list"
c

# 'round(b) is not in a and a is not list'

上記の通り 1 ラインで記載可能ですが,1 ラインで書くには長すぎます(三項演算子を用いた場合について,スペース含めて 1 行に 149 文字が含まれていますが,コーディング規約 PEP8:https://pep8-ja.readthedocs.io/ja/latest/ では 1 行 79 文字までという制限を設けています)し,if-else と比べてかなり読みにくく,こういった場合は普通にインデントブロックを用いた方が良さそうです.

thres = 4
arr = []
for i in range(10):
    arr.append(i) if i < thres else arr.append(thres) if i < thres*2 else None
arr

# [0, 1, 2, 3, 4, 4, 4, 4]

上記の例だと,1 行が 69 文字で処理も簡単なので,if-elif-else を 1 ライン化しても良いかもしれません.

ということで,個人的に三項演算子を用いたら輝く処理というのは,何か(例えばファイルとか)が存在するかどうかのときに yes / no で分岐処理させるときとか,リストや文字列や型の比較とか,閾値によって返す値を変える時に使う,といったイメージです.

あとは,内包表記と三項演算子を組み合わせることで for と if が合体した処理を 1 ラインにて書くことができ,その時に用いますが,詳しくは内包表記のページに記載いたします.

Python のおすすめの学習方法

プログラミングを最短で習得する,少なくても自分の意志で使えるようになる方法について,いくつかプログラミング言語を触ってきた筆者としては何の言語においても,以下2点が重要だと思います.

  • 元々自分が他の言語で作っていた処理を違う言語で書き直す・・・・英語を勉強するときも,脳を生まれたばかりのまっさらな状態から勉強するわけではなく,日本語を通したり対比して,学習済みの言語野を用いて勉強するのと似ています
  • 言語自体を網羅的に勉強するのではなく,やりたい事を先に考え,それを達成するために色々と調べながら実装する・・・・例えば,留学で語学力が上達するのは,その国の言葉を使ってコミュニケーションを取ることが強制されるためであり,使うことに対するモチベーションが一番大事です

独学で行うには,やはり2点目の「やりたい事ドリブン学習」が効果的で,例えば次の書籍は,Python を流行らせている AI/データ分析/機械学習/深層学習について実装することに主眼を置き説明されているので,実際に手を動かしながら学んでいける本だと思います(筆者も最初にこちらの書籍で遊びながら学びました).

コメント

タイトルとURLをコピーしました