はじめに
ナイトウ(@engineer_naito)と申します。
Pythonの好きなところ。
1つ挙げろと言われたらぼくは三項演算子と答えるでしょう。
ぼくはPythonの三項演算子の書き方がとても気に入っています。
Python以外の三項演算子の書き方を調べて、Pythonの三項演算子くらい好きな書き方がないか探していきます。
※以下の記事よりランキングを引用させていただきます。
今回はいろんなプログラミング言語の三項演算子を調べてまとめることが目的の記事です。
ぼくは言語の優劣についての思想などは持っておりません。
引用している言語ランキングについても特に感情や思想は持っておりません。
三項演算子 とは
三項演算子を使うと、if文else文を1行で書くことができます。
条件演算子と呼ばれることもあるようです。
英語ではternary operatorといいます。
(binaryはカタカナ語でもよく使うけど、unary, ternaryはあんまり見ない気がする。)
各言語によって仕様は異なると思いますが、おそらく三項演算子が一番用いられているケースは条件に応じて変数に代入する値を変える場合だと思います。
実際にPythonの三項演算子を見てみましょう。
Pythonの三項演算子
まずは普通のif文から。
num = 2
if num % 2 == 0:
even_or_odd = "偶数"
else:
even_or_odd = "奇数"
これを三項演算子を使って書き直すとこうなります。
num = 2
even_or_odd = "偶数" if num % 2 == 0 else "奇数"
行数が減りましたね。
これが三項演算子のパワーです。
公式ドキュメントを見ます。
https://docs.python.org/ja/3/reference/expressions.html
6.13. 条件式 (Conditional Expressions)
なんと、Pythonにおける三項演算子は条件式と公式では呼ばれているようです。知りませんでした。
x if C else y という式は最初に x ではなく条件 C を評価します。 C が true の場合 x が評価され値が返されます。 それ以外の場合には y が評価され返されます。
さあ、その他の人気プログラミング言語の三項演算子の書き方を調べていきましょう。
人気プログラミング言語の三項演算子
出典:SalesNow DB(https://salesnow.jp/db)
Java
int num = 2;
String even_or_odd = (num % 2 == 0) ? "偶数" : "奇数";
JavaScript
const num = 2;
const even_or_odd = num % 2 === 0 ? "偶数" : "奇数";
PHP
$num = 2;
$even_or_odd = $num % 2 === 0 ? "偶数" : "奇数";
TypeScript
const num: number = 2;
const even_or_odd: string = num % 2 === 0 ? "偶数" : "奇数";
C#(Csharp)
int num = 2;
string even_or_odd = num % 2 == 0 ? "偶数" : "奇数";
Ruby
num = 2
even_or_odd = num.even? ? "偶数" : "奇数"
C++
int num = 2;
std::string even_or_odd = (num % 2 == 0) ? "偶数" : "奇数";
Swift
let num = 2
let even_or_odd = num % 2 == 0 ? "偶数" : "奇数"
Go(Golang)
num := 2
evenOrOdd := func() string { if num % 2 == 0 { return "偶数" }; return "奇数" }()
Golangでは三項演算子をサポートしていないようです。
以下のコードを三項演算子と似たような書き方になるように無理やりワンライナーで記述しました。
num := 2
evenOrOdd := func() string {
if num % 2 == 0 {
return "偶数"
}
return "奇数"
}()
今回初めて存在や文法を知った言語ばかりです。
paiza.io で一通り動作確認しておりますが、間違っている可能性があります。
望ましくない書き方や時代遅れの書き方をしている場合もあります。
もし何かあればコメントなど批判・指摘いただけたらと思います。
番外編
ランキングには登場しなかった言語についても調べてしまいます。
Rust
let num = 2;
let even_or_odd = if num % 2 == 0 { "偶数" } else { "奇数" };
Rustも三項演算子はないようです。
以下のコードから改行をなくして、ワンライナーで書き直しました。
let num = 2;
let even_or_odd = if num % 2 == 0 {
"偶数"
} else {
"奇数"
};
Perl
my $num = 2;
my $even_or_odd = $num % 2 == 0 ? "偶数" : "奇数";
Scala
val num = 2
val evenOrOdd = if (num % 2 == 0) "偶数" else "奇数"
F#
let num = 2
let evenOrOdd = if num % 2 = 0 then "偶数" else "奇数"
Elixir
num = 2
even_or_odd = if rem(num, 2) == 0, do: "偶数", else: "奇数"
D
int num = 2;
string even_or_odd = num % 2 == 0 ? "偶数" : "奇数";
Dart
int num = 2;
String evenOrOdd = num % 2 == 0 ? "偶数" : "奇数";
Haskell
let num = 2
let evenOrOdd = if even num then "偶数" else "奇数"
すみません。
Haskellは全く公式ドキュメントの参照の仕方がわかりませんでした。
ChatGPTに聞いたら上のコードを出力しました。
Haskell Playgroundで一応動作確認はしました。
https://play.haskell.org/saved/0iFu32Pf
改めて、今回初めて存在や文法を知った言語ばかりです。
paiza.ioで一通り動作確認しておりますが、間違っている可能性があります。
望ましくない書き方や時代遅れの書き方をしている場合もあります。
もし何かあればコメントなど批判・指摘いただけたらと思います。
ぼくがPython三項演算子を好きな理由
これまでにいろいろな三項演算子の書き方を見てきました。
最初に見たPythonの三項演算子の書き方だけ異質ですよね。
Pythonだけ直感的に理解しやすいと感じるのはぼくだけでしょうか。
"x if C else y" という順番は変数に値を代入する際にとても理解しやすいです。
even_or_odd = "偶数" if num % 2 == 0 else "奇数"
の先頭部分を見れば、 even_or_odd = "偶数"
となっています。
ここだけ見ればただの代入ですね。
この点が個人的にとても気に入ってます。
しかし、Pythonだけこの順番なのを知ってしまうと少し気持ち悪くなってきますね、、、😇
まとめ
Pythonの三項演算子の書き方だけ異質なことがわかりました。
この記事を書き始めたころは「Pythonの三項演算子大好き〜」って思ってましたが、今では少し懐疑的です。
Pythonのいいところをこれからも探していきたいです!
最後に
繰り返しになりますが、記事内に間違いなどありましたらご指摘、ご批判いただけますと幸いです。
また、この記事で取り上げなかった言語についても三項演算子や同等の記述をご存知の方いれば、コメントして教えていただけるとありがたいです。
最後まで読んでいただきありがとうございました!