
Python_ワンライナーなコードを書いてみる_三項演算子 #223日目
初心者が実務レベルのコードに触れる際のハードルの一つとして、ワンライナー(1行で書かれている)でシンプルなコードが故に、基礎的な書き方と異なっていて分からなくなる、というものがあると思います。
ワンライナーなコードとは、例えば以前に触れたリスト内包表記などです。
上記の記事でも少し触れていますが、if文も1行で記述することが可能です。本日はそのあたりを少し詳しくまとめたいと思います。
条件式 (三項演算子) の基本
条件式は、簡単に表現するとif文の1行記述バージョンです。普通にif文を書いた方が分かりやすくはなりますが、リスト内包表記やLambda式などの中で条件分岐したい時や、コード量を減らしたい時には条件式を使います。
構成自体はシンプルで、以下のように記述するだけです。
条件が成立した時の値 if 条件 else 条件が成立しなかった時の値
[サンプル]
x = 101
s = 'odd' if x % 2 else 'even' # 2で割った余りが1(True)ならodd、0(False)ならeven
print(s)
#出力結果
odd
ここでは「値」となっているのがポイントです。if文であれば条件分岐した後に様々な処理を「文」として記述できますが、条件式では値を返すことしかできません。この特性から、ブール値を返したい時などは相性よく活用することができます。
どうしても条件式で処理を記述したい場合は、exec()を使って実行する方法を取ります。これは最後に触れたいと思います。
ブール値を理解して条件式を使いこなす
Pythonのブール値 (True / False) を上手く活用すると、条件式をより使いこなすことができます。ブール値には例えば以下のような特性があります。
数字とブール値の関係
0 : False
0以外 : True ※float型でも負の値でもTrue
[a and b] のブール値
a = True, b = True : True
a = True, b = False : False
a = False, b = True : False
a = False, b = False : False
一応コマンドで確認してみます。
>>> bool(0)
False
>>> bool(1)
True
>>> bool(1 and 100)
True
>>> bool(1 and 0)
False
>>> bool(0 and 0)
False
では実際に使ってみます。
>>> a = False
>>> b = True
>>> c = True
# cがTrueなら'c is True'を出力し、cがFalseなら「a and b」のブール値(False)を返す
>>> s = 'c is True' if c else a and b
# 出力結果
'c is True'
>>> a = False
>>> b = True
>>> c = False
# cがTrueなら'c is True'を出力し、cがFalseなら「a and b」のブール値(False)を返す
>>> s = 'c is True' if c else a and b
# 出力結果
False
ブール値の扱いに慣れないと、何をやっているか見失ってしまいそうですね。ここは慣れも必要な部分だと思います。
exec()を使って条件式で「文」を記述する
上記で述べてきた通り、条件式は値しか返せないため、if文のように細かな処理を「文」として記述することができません。文を扱いたい場合はexec()を使います。
「raise ValueError」という文を条件式に含めたい場合、以下のように記述できます。
[入力されてきた値が数字ならばint型にして、数字以外ならValueErrorを出す]
# OKな書き方
s = input('input a number: ')
x = int(s) if s.isdecimal() else exec('raise ValueError("not a number")')
# NGな書き方
s = input('input a number: ')
x = int(s) if s.isdecimal() else raise ValueError("not a number")
上記と同じ処理をif文で記述すると以下です。
s = input('input a number: ')
if s.isdecimal():
x = int(s)
else:
raise ValueError('not a number')
Pythonエンジニアらしく、こういう書き方もマスターしていきたいですね。
ここまでお読みいただきありがとうございました!!