CTC 教育サービス
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes
こんにちは、菱沼です。
今回も「きれいなPythonプログラミング(マイナビ出版)」という書籍を利用して学習します。
前回は、if文と、if文の代わりに辞書を使う方法、match文について学びました。
今回は、三項演算子についてです。
今回学習する節のタイトルは「条件式:Pythonの「醜い」三項演算子」です。あえて「醜い」と書かれているこの節の目的は最後に書くことにして、まずは三項演算子とはどういったものか学んでいきます。
三項演算子(条件式)とは、if-else文でつらつら複数行にわたって書いていたものを1行で書きたいときに使用されるそうです。
例えば通常のif-else文はこんな感じ。
P.106
# パイソニックなコードの例
condition = True
if condition:
message = ’Access granted’
else:
message = ’Access denied’
message
>>>’Access granted’
変数conditionに入っている値が「True」なら「Access granted」というメッセージを、「False」なら「Access denied」というメッセージを代入するというプログラムです。このプログラムではconditionにはTrueが入っているので、Access grantedが表示されています。
ではここから、三項演算子を使って1行で書くにはどうしたらいいのか。引用文です。
------------------------------------
P.106
三項演算子は単に3つの入力を持つ演算子という意味ですが、プログラミングでは条件式と同義です。条件式は、このパターンに当てはまるコードをより簡潔に1行で表現することができます。Pythonでは、条件式がifとelseの独特な配置で実装されています。
valueIfTrue = ’Access granted’
valueIfFalse = ’Access denied’
condition = True
message = valueIfTrue if condition else valueIfFalse
>>>message
’Access granted’
print(valueIfTrue if condition else valueIfFalse)
>>>Access granted
condition = False
message = valueIfTrue if condition else valueIfFalse
message
>>>’Access denied’
------------------------------------
つらつらっとコードが書かれていますが、重要なのは4行目のこの箇所...。
message = valueIfTrue if condition else valueIfFalse
ここで、最初に出したコードの
if condition:
message = ’Access granted’
else:
message = ’Access denied’
の部分が表現されています。
これを見てみると、if-else文で値を代入している場合は、
変数名(実行用) = [Trueの場合の値] if [条件] else [Falseの場合の値]
と書き換えてあげるんだなーということがわかります。
ちなみに今回のケースでいえば、valueIfTrue に ’Access granted’、valueIfFalse に ’Access denied’ が代入されています。そのため、元のコードからあまり変えない形で書くとすれば、こんな感じになると思います。
message = ’Access granted’ if condition else ’Access denied’
にしてもなんでTrueの場合の値が先に書かれるんでしょうねー。とりあえず、条件は真ん中、Trueは最初、Falseは最後って覚えておきたいと思います。
三項演算子の使い方についてはこれで終わりかと思います。
ただ気になるのは、章の目的としてはパイソニックなコードを書くことに対し、この節では「醜い三項演算子」になっている点です。
書籍ではここから、三項演算子の歴史に至るまでの歴史に触れられています。ここからは読み物程度に気になる方は読んでみてくださいね。一部抜粋していきます。
------------------------------------
P.106
グイド・ヴァンロッサムは、自分の構文設計を冗談めかして「intentionallyugly(意図的に醜い)」と表現しました。三項演算子を持つほとんどの言語では、条件・真の場合の値・偽の場合の値の順に記載します。三項演算子を使った条件式は、関数呼び出しの引数など、式や値を使用できる場所であればどこでも使用できます。
「醜いコードよりも美しいコードを」という格言を破っているにもかかわらず、なぜPythonはPython2.5でこの構文を導入したのでしょうか?それは残念ながら、多少読みにくいにもかかわらず、多くのプログラマーが三項演算子を使用し、Pythonがこの構文をサポートすることを望んだからです。
(中略)
プログラマーはこの疑似三項演算子を使い続け、「なぜPythonには三項演算子がないのか?」がPythonコア開発者への長年の質問になりました。条件式は、プログラマーが三項演算子を求めなくなり、バグを起こしやすい疑似三項演算子を使わなくなるように作られました。しかし、条件式はプログラマーが使うのを躊躇するほど醜いものでもあります。
------------------------------------
この間には三項演算子が導入される前に使用されていた疑似三項演算子のサンプルコードが記載されていますが、今回の内容とは関係ないので割愛しますね。
さて、上記の引用からわかるように、もともとPythonには三項演算子がなかったため、プログラマーたちはいろいろ駆使して三項演算子っぽいものを無理やり実現していたもののバグが多く出がちだったようです。が、やっぱりないと不便だということで要望を出し続けて、Python2.5で導入されたのが条件式(三項演算子)でした。
とはいえ、書籍によると、グイド氏はこの構文を「意図的に醜い」と表現しています。これは読みやすさを重視する考え方のもと、三項演算子をむやみに多用してほしくないという思いがあるようです。
もし美しくかけるような状態だと、なんでも1行で書きたくなる欲に負けたプログラマーが増殖して読みにくいものになってしまうのを避けるためということですね。確かにやりたくなるかもしれない。
確かに複数の条件が入れ子になっているときに、この三項演算子で書かれたらよくわからん!という事態になっていたかもしれませんね。
最後に、その状態に陥ったときのサンプルコードを紹介します。
age = 30
ageRange= ’child’ if age < 13 else ’teenager’ if age >=13 and age < 18 else ’adult’
ageRange
’adult’
確かに読みにくい...。短い条件分岐なら便利な三項演算子ですが、複雑な条件になる場合は通常のif-else文の方が読みやすいこともあります。状況に応じて使い分けたいですね。
それではきりが良いのでこちらで終了です。
今回もお付き合いいただきありがとうございました。
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes