Pythonを学び始めたり、他のプログラミング言語から移ってきたりした人が、最初に「おや?」と戸惑う文法の一つに「三項演算子」があります。
if
とelse
の位置が直感的じゃない…」「他の言語と書き方が違って、どうにも読みにくい」
もしこう感じているとしても、それは自然なことです。
Pythonの三項演算子は、その独特な語順から「わかりにくい」と言われることが少なくありません。
この記事では、なぜPythonの三項演算子がそのような構文になっているのか、という背景から説明し、わかりにくいと感じられる理由を解説していきます。
また、三項演算子はどのような場面で使うべきか、逆にどのような場面では避けるべきかという「使い分け」の指針も紹介しますので、是非参考にしてください。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 657,000円 (最大約53万円の給付金が適用される) |
|
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 |
|
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ |
|
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 完全無料 |
|
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
Pythonの三項演算子の基本構文
まずは、基本の形から確認していきましょう。
Pythonの三項演算子は、通常のif-else
文を一行で簡潔に書くためのものです。
通常のif文との比較
例えば、ある数値が偶数か奇数かを判定して、結果を文字列で返す処理を考えてみます。
通常のif-else
文で書くと、このようになりますね。
num = 10
result = ''
if num % 2 == 0:
result = '偶数'
else:
result = '奇数'
print(result)
実行結果は以下の通りです。
偶数
上記のif文の4行のコードが、三項演算子を使うとたった1行で書けるのです。
num = 10
result = '偶数' if num % 2 == 0 else '奇数'
print(result)
これが三項演算子の基本形、「真の場合の値 if 条件式 else 偽の場合の値
」です。
コードが短くなり、スッキリした印象を受けるのではないでしょうか。
なぜPythonの三項演算子は「わかりにくい」のか?
コードが短くなるのはよいことですが、わかりにくくなっては意味がありません。
では、なぜPythonの三項演算子は「わかりにくい」と感じられるでしょうか?
この項目では、わかりにくいと感じてしまう主な理由を解説していきます。
他の言語との構文の違い
C言語やJava、JavaScript、PHPなど、多くのプログラミング言語における三項演算子は、以下のような構文を採用しています。
条件式 ? 真の場合の値 : 偽の場合の値
この形式に慣れている人からすると、Pythonの真の場合の値 if 条件式 else 偽の場合の値
という語順は、条件式が中央に来るため、処理の流れを追いづらく感じてしまうのです。
これが「わかりにくい」と感じる最大の原因と考えられます。
「英語のように読める」というPythonの設計思想
なぜPythonは、あえて独特な語順を採用したのでしょうか。
そこには、「コードは書く時間よりも読まれる時間の方が遥かに長い」という考えに基づいた、Pythonの設計思想が関係しています。
Pythonは、プログラムをまるで自然な英文を読むかのように、直感的に理解できることを目指して設計されました。
先ほどの例をもう一度見てみましょう。
result = '偶数' if num % 2 == 0 else '奇数'
これを英語の文章として読んでみると、 result is '偶数' if num is even, else '奇数'
となり、非常に自然な英文の語順に近いことがわかります。
つまりPythonの三項演算子は、他の言語のプログラマーから見ると少し奇妙かもしれませんが、「処理の結果」が先に来ることで、人間が文章を読む際の思考の流れに沿った、可読性の高い書き方を目指した結果なのです。
三項演算子の実践的な使い方
三項演算子の思想がわかったところで、どのような場面で使うと効果的なのか、具体的な例を見ていきましょう。
シンプルな変数への代入
これまで見てきたように、条件によって変数に代入する値を切り替える、というシンプルな場面が最も基本的な使い所です。
age = 22
status = '成人' if age >= 20 else '未成年'
print(status)
実行結果は以下の通りです。
成人
f-string内での利用
f-string(フォーマット済み文字列リテラル)の中で使うと、さらにコードを簡潔にできます。
is_member = True
message = f"あなたは{'会員' if is_member else '非会員'}です。"
print(message)
実行結果は以下の通りです。
あなたは会員です。
if-else
文を一度変数に格納する手間も省け、非常にスマートな記述になります。
ラムダ式(無名関数)との組み合わせ
lambda
で簡単な関数を定義する際にも、三項演算子は活躍します。
# 絶対値を返すラムダ式
get_abs = lambda x: x if x >= 0 else -x
print(get_abs(10))
print(get_abs(-5))
実行結果は以下の通りです。
10
5
関数の処理が一行で完結するため、相性が良い組み合わせと言えるでしょう。
三項演算子を「使わない」べき場面
三項演算子は便利ですが、乱用するとかえってコードの可読性を著しく下げてしまいます。
ここでは、三項演算子を使うべきではないアンチパターンを紹介します。
複雑な条件分岐
if-elif-else
のように、3つ以上の分岐がある場合は三項演算子で書くべきではありません。
書けなくはないのですが、非常に読みにくくなります。
# 非推奨な例
score = 75
result = '優' if score >= 80 else '良' if score >= 60 else '可'
print(result) # 良
このような場合は、素直に通常のif-elif-else
文を使いましょう。
# 推奨される書き方
score = 75
if score >= 80:
result = '優'
elif score >= 60:
result = '良'
else:
result = '可'
どちらが読みやすいかは一目瞭然ですね。
ネスト(入れ子)は絶対に避ける
三項演算子の中に、さらに三項演算子を入れる「ネスト(入れ子)」は、コードを解読困難にする代表的な悪手です。
# 絶対に避けるべき例
num = 10
result = '正の偶数' if num > 0 and num % 2 == 0 else ('負の数' if num < 0 else '0または正の奇数')
このようなコードは、書いた本人でさえ後から読むのが困難になります。
複雑なロジックは、必ず通常のif
文を使って、わかりやすく記述することを心がけてください。
まとめ
以上、Pythonの三項演算子が「わかりにくい」と言われる理由などについて詳しく解説してきました。
なお、Pythonを体系的に学んだり、Pythonのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。