LoginSignup
12
14

More than 3 years have passed since last update.

if文を使わない条件分岐

Last updated at Posted at 2019-10-29

例として、
「ある数nが偶数の場合はそのまま、奇数の場合は-にしなさい」
といわれたとき

ifを使う場合

#[_ for _ in range(1,11)]
n=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def case_if(n):
    if n%2==0:
        return n
    elif n%2!=0:
        return n*(-1)
ans=list(map(case_if,n))
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]

ifを使わない場合

#[_ for _ in range(1,11)]
n=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def case_notif(n):
    return n*(-1,1)[n%2==0]
ans=list(map(case_notif,n))
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]

上記のように、
(False,True)[条件式]
の形式でifを使わず条件分岐ができる。

他にどのような使い方ができるか検索してみたが、なんと検索したらいいか分からず答えに辿り着かなかったため、いくつか実験してみた。

条件式に論理演算子を使えるか

andの場合

n=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def case_notif_and(n):
    return n*(-1,2)[n%2==0 and n<5]
ans=list(map(case_notif_and,n))
[-1, 4, -3, 8, -5, -6, -7, -8, -9, -10]

orの場合

n=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def case_notif(n):
    return n*(-1,2)[n%2==0 or n<5]
ans=list(map(case_notif,n))
[2, 4, 6, 8, -5, 12, -7, 16, -9, 20]

結果:使える

演算子での計算以外に使えるか

print()に直接[条件式]をつける

n=5
print(n*2,n)[n%2==0]
10 5
TypeError: 'NoneType' object is not subscriptable

print()の引数に(False,True)[条件式]の形式で

n=5
print((n*2,n)[n%2==0])
10

文字列replaceをsに格納

s='ABCDE'
s=(s.replace('C',' '),s.replace('C','  '))[len(s)==5]
print(s)
ABFiveDE

結果:関数に直接[条件式]をつける以外で正常に使える

複数処理を行う

s='12345'
s=(
    (
        s.replace('3',' ')
        int(s)
    ),
    (
        s.replace('3','789')
        int(s)
    )
    )[len(s)==5]
print(s)
Syntax Error: invalid syntax

コンマをつけてみる

s='12345'
s=(
    (
        s.replace('3',' '),
        int(s)
    ),
    (
        s.replace('3','789'),
        int(s)
    )
    )[len(s)==5]
print(s)
('1278945', 12345)

s=をつけてみる

s='12345'
s=(
    (
        s=s.replace('3',' '),
        int(s)
    ),
    (
        s=s.replace('3','789'),
        int(s)
    )
    )[len(s)==5]
print(s)
Syntax Error: invalid syntax

まとめ

(False,True)[条件式]をひとかたまりとして、条件分岐を表現できることが分かった。
複数処理をうまく実現できないが、ひとつの処理について条件分岐が必要な場合は、この書き方のほうがシンプル。
個人的に(False,True)の順番は少しキモチワルイ


追記(20191030)

コメント欄のおふたりのおかげで、(False,True)[条件式]はタプルの添え字表記であることが理解できました。ありがとうございました。

他にどのような使い方ができるか検索してみたが、なんと検索したらいいか分からず答えに辿り着かなかったため、いくつか実験してみた。

(False,True)[条件式]に気づいたときにはどういう検索をしたら情報が得られるか分からなかったのでいろんなパターンを試してみましたが、当時の私が使うべき検索ワードは「True False 振る舞い」だとか「添え字 True False」だとかになるのでしょうね。

追加で調べたこちらの記事とその元ネタ記事(アーカイブ)の「bool型はint型のサブタイプ」もとても参考になったので備忘として追記しておきます。

(False,True)[条件式]の書き方は個人的にとても気に入ったので、人に見せないコードの範囲でじゃんじゃん使っていきたいのですが、やはりifも条件式も明示してあげる方が読みやすいコードになるのかなと感じました。

12
14
2

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
12
14