見出し画像

Python_ワンライナーなコードを書いてみる_三項演算子 #223日目

初心者が実務レベルのコードに触れる際のハードルの一つとして、ワンライナー(1行で書かれている)でシンプルなコードが故に、基礎的な書き方と異なっていて分からなくなる、というものがあると思います。

ワンライナーなコードとは、例えば以前に触れたリスト内包表記などです。

上記の記事でも少し触れていますが、if文も1行で記述することが可能です。本日はそのあたりを少し詳しくまとめたいと思います。


条件式 (三項演算子) の基本

条件式は、簡単に表現するとif文の1行記述バージョンです。普通にif文を書いた方が分かりやすくはなりますが、リスト内包表記やLambda式などの中で条件分岐したい時や、コード量を減らしたい時には条件式を使います。

構成自体はシンプルで、以下のように記述するだけです。

条件が成立した時の値  if  条件  else  条件が成立しなかった時の値

https://atmarkit.itmedia.co.jp/ait/articles/2104/02/news016.html
[サンプル]
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エンジニアらしく、こういう書き方もマスターしていきたいですね。

ここまでお読みいただきありがとうございました!!


参考


この記事が気に入ったらサポートをしてみませんか?