Posted at

perl使いのpythonメモ - 三項演算子

More than 3 years have passed since last update.


  • pythonであれ?とおもったことをメモしときます。


三項演算子ってないの?


  • 三項演算子(条件演算子)って好きなんですよね〜(新入社員にわからないと言われて衝撃を受けましたが...)

>>> a = True

>>> b = a ? "OK" : "NG"
File "<stdin>", line 1
b = a ? "OK" : "NG"
^
SyntaxError: invalid syntax


  • エラーになりました...

>>> b = "OK" if a else "NG"

>>> print(b)
OK


  • こっちのほうが英語的にも自然なんでしょうね。(まだちょっと慣れない)

  • perlにも後置ifで $b = "OK" if (a);って書き方はありますが。


複合的な三項演算子


  • (こういう書き方するからわからないとか言われるんですが...)

  • 条件をつなげることも可能です。

sh-3.2$ perl -le '$a=0;$b=($a==0)?"ZERO":($a==1)?"ONE":($a==2)?"TWO":"TAKUSAN!";print $b' 

ZERO
sh-3.2$ perl -le '$a=1;$b=($a==0)?"ZERO":($a==1)?"ONE":($a==2)?"TWO":"TAKUSAN!";print $b'
ONE
sh-3.2$ perl -le '$a=2;$b=($a==0)?"ZERO":($a==1)?"ONE":($a==2)?"TWO":"TAKUSAN!";print $b'
TWO
sh-3.2$ perl -le '$a=3;$b=($a==0)?"ZERO":($a==1)?"ONE":($a==2)?"TWO":"TAKUSAN!";print $b'
TAKUSAN!


  • これはpython風に書くとどうなるんでしょ?

>>> a=0

>>> b = "ZERO" if a == 0 else "ONE" if a == 1 else "TWO" if a == 2 else "TAKUSAN!"
>>> b
'ZERO'
>>> a=1
>>> b = "ZERO" if a == 0 else "ONE" if a == 1 else "TWO" if a == 2 else "TAKUSAN!"
>>> b
'ONE'
>>> a=2
>>> b = "ZERO" if a == 0 else "ONE" if a == 1 else "TWO" if a == 2 else "TAKUSAN!"
>>> b
'TWO'
>>> a=3
>>> b = "ZERO" if a == 0 else "ONE" if a == 1 else "TWO" if a == 2 else "TAKUSAN!"
>>> b
'TAKUSAN!'


  • 連続するとむしろわかりづらいかも...


やっぱり欲しいな〜


  • わかりにくい言われることがありますが、使えたほうがいいな〜

  • pythonの設計思想に反するんですかね?