三項演算子と後置if構文

三項演算子とは条件演算子の事みたい。

という事で、条件演算子とは

  • 条件演算子 - Wikipedia

    条件演算子(conditional operator)は、プログラミング言語の演算子で、条件文と同様な意味があるが、文ではなく値を持つ式になる。評価されると、条件式の値により異なる式が評価され、異なる値になる。

    なお、CやC++など一部のプログラミング言語において、条件演算子とは後述する「? :」(ハテナマークとコロン)の演算子の名称である。


C言語からきた構文に三項演算子というのがある。
プロジェクトによっては、読みづらいので使わない方が良いとされていたりもする。
しかし、コードが簡潔になるので使いたいという誘惑にかられてしまう。

javaのコードを例にとると

if(isUpper){
    System.out.print('A');
} else {
    System.out.print('a');
}

このコードはisUpperフラグの値によって大文字のAと小文字のaのどちらを出力するかを制御している。

上記のコードは三項演算子を使うと以下のように簡潔に記述できる。

System.out.print(isUpper?'A':'a');

同じようにpythonにも三項演算子が存在する。

上記のコードをpythonのコードで置き換えてみると

if文の場合

if(is_upper):
    print "A"
else:
    print "a"

三項演算子の場合

print "A" if is_upper else "a"

なんとも、パットみ何をやっているかわからないコードになってしまう。

ここで、思い出したのだが、後置if構文。

知ったかぶりをすると、
Perlやその流れを継ぐRubyなどのスクリプト言語の一部には後置ifというのがあって

Perlの場合で言えば以下のif文を

$isupper=True;
if($isupper){
    print "A"
}

後置ifを使うと

print "A" if $isupper;

と記述できる。

他にも後置forや後置while,後置untilなどが存在する。

Rubyの場合は

if isupper
  puts "A"
end

これを、後置ifを使うと

puts "A" if isupper

PerlやRubyには後置if構文とは別に、C言語と同じ構文の三項演算子が存在する。
三項演算子と後置ifとは同じではない。

三項演算子には条件式が成立しない場合に返す値を必ず指定しなければならない。
そして三項演算子には文でなく式を記述しなければならない。

式と文の違いについては。

pythonの場合で言えばelseの後に式は記述できても、以下のように文を記述する事は許されない。

print "A" if is_upper else print "a"

これはエラー。

pythonの三項演算子はみため後置ifに見えるが、PerlやRubyの後置ifとは異なるものである。
しかし、後ろにif文が存在するという意味では言葉のあやであるが後置ifという事になってしまう。

同様に、pythonのリストの内包表記の中のif文やfor文も後置ifや後置forにみえてしまう。

vec = [2, 4, 6]
print [3*x for x in vec if x > 3]

実行結果

[12, 18]

ちなみにVisualBASIC(VB6やVBS,Excel等のマクロVBA)の三項演算子は

    Debug.Print IIf(isUpper, "A", "a")

最近のVB.NETでは

    Debug.Print If(isUpper, "A", "a")

と記述する方がいいみたい。


Pythonの三項演算子について調べていたら、どんどん話しがそれてなんだかPythonの記事では無くなってしまった。
この記事をどのジャンルにいれるかな?

ページのトップへ戻る