LoginSignup
6
9

More than 5 years have passed since last update.

pythonの条件文行数を半分以下にしちゃう

Last updated at Posted at 2017-11-26

Pythonでは、三項演算子ではなく、普通の条件式として定義されている!

@shiracamus さんに、コメントよりおしえて頂きました!
参照:【PEP 308 Conditional Expressions

ありがとうございます!m(__)m

何を知れるか

長くなりがちなif-elif-else文を短く書ける方法です!

Pythonの条件式を短くするには、どうしたらいいか!

最初は、普通のfor文


#0から20のリストを作る
the_list = list(range(21))

#4の倍数のときはOK!を出力するfor文
for i in the_list:
    if i % 3 == 0:
        print("OK!")
    else:
        print(i)

"""
OK!
1
2
OK!
4
5
OK!
7
8
OK!
10
11
OK!
13
14
OK!
16
17
OK!
19
"""

普通の条件分だと、合計6行です。

短くすると!

the_list = list(range(20))

#4の倍数のときはOK!を出力するfor文
for i in the_list:
    print("OK!" if x % 4 == 0 else i)
"""
OK!
1
2
OK!
4
5
OK!
7
8
OK!
10
11
OK!
13
14
OK!
16
17
OK!
19
"""

3行になりました!半分です。絶対に覚えたほうが良いですね!

elifのように条件分をもっと増やしたい場合


the_list = list(range(21))

#4の倍数のときはOK!、5の倍数の時はNo.5!を出力するfor文
#普通にif-elif-else条件分を書いた場合
for i in the_list:
    if i % 4 == 0:
        print("OK!")
    elif i % 5 == 0:
        print("No.5!")
    else:
        print(i)

"""
OK
1
2
OK
4
No.5!
OK
7
8
OK
No.5!
11
OK
13
14
OK
16
17
OK
19
No.5!
"""

8行になりました!

三項演算子で書いた場合

the_list = list(range(21))

for i in the_list:
    print("OK!" if i % 3 == 0 else "No.5!" if i % 5 == 0 else i)

"""
OK
1
2
OK
4
No.5!
OK
7
8
OK
No.5!
11
OK
13
14
OK
16
17
OK
19
No.5!
"""

3行になりました!ありえません!!

書くときのポイントがあるみたいなので、メモしておきます。

・elifを書きたい場合、elseのあとにifを書いていく

print("OK!" if i % 3 == 0 else "elifの時に行いたい処理" if "elifの条件文" ===ここに他のelifを書くことも可能!=== else "最後のelseが本当のelse")

P.S @LouiS0616 さん、@shiracamus さんに、もっと短い条件分の書き方を教えていただいた。

2つあるんですが、1つ目はfor文をlambda(無名関数、匿名関数)に渡して、引数にrange(21)を渡してあげることで、一行で条件分を作成する方法です!


(lambda num: print('\n'.join("OK!" if i % 3 == 0 else "No.5!" if i % 5 == 0 else str(i) for i in range(num))))(21)

1番目の方法は、このようにも表せるそうです。


func = 上記のlambda式
func(21)


#式を当てはめると
func = lambda num: print('\n'.join("OK!" if i % 3 == 0 else "No.5!" if i % 5 == 0 else str(i) for i in range(num)))
func(21)

二つ目はprint関数内でループを回す方法です!


print('\n'.join("OK!" if i % 3 == 0 else "No.5!" if i % 5 == 0 else str(i) for i in range(21)))

\nは改行をjoin関数を使ってくっつけてあげています!これがないと、改行されず出力されちゃいますのでご注意ください!

条件分を短くする注意点

条件演算子はネストするととにかく読みづらいので、使いどころは考えた方が良いです。
Pythonは行数が少なくなるような設計なので、条件式を使うべき場面は少ないと思います。if-elif-else文で書けるなら、その方がいいんじゃないかなぁ

短くするだけ可読性下がることは覚えておかないといけないですねm(__)m

コメント頂きましたみなさま、ありがとうございました!!

今となっては当たり前のifから始まる条件式ですが、前までは理論演算子のみが提供されていた。

その時の方法で、今回のfor文を作る場合このようになるようです。


for i in range(21):
    print(i % 3 == 0 and "OK!" or i % 5 == 0 and "No.5!" or i)

いま勉強していることが、色んな人たちの議論が積み重なり成り立っているという事を知って、感慨深い気持ちです。

教えてくださりありがとうございます!!!!!!

最後に

printを毎回書かないといけないのが僕としてはすごい面倒だったのですが、三項演算子なら簡単!!

でも可読性が下がるのはメリットではないので、しっかりと使い分けようと思います。

最後まで見てくださった方ありがとうございました(^^)

6
9
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9