目次
- 躓いたポイント
- 解決方法
- まとめに
- bool値についての補足(追記)
※ 2022/11/06 追記
変数が大文字になってたので修正
補足を追記
その他コメントでして指摘のあったものを修正
躓いたポイント
正規表現(re)を勉強していたある日のこと
マッチオブジェクトのブール値は常に
True
です。
match() および search() はマッチがないときNone
を返すので、マッチがあるか単純な if 文で判定できます。
こりゃ便利だ。早速試してみよう
import re
truestring = "aaa"
pattern = re.compile(r"aaa")
trueresult = pattern.match(truestring)
if trueresult == True:
print("Matched!")
else:
print("Not matched...")
Not matched...
アレ?
解決方法
if Trueresult:
print("Matched!")
else:
print("Not matched...")
Matched!
当たり前だがbool値がTrue
なのであって値そのものがTrue
な訳ではない。
イコールでつないだらFalse
と出力される。
is
を使って比較したらどうか試してみたが
if trueresult is True:
print("Matched!")
else:
print("Not matched...")
Not matched...
ダメだった。
まとめに
分かりやすいかもという理由でboolを安易にイコールでつなぐと碌なことにならない。
pythonは簡潔にコードが記述できるが脳死でコードを書くとハマるので一行一行噛みしめてコードを書くべき。
また、基礎的なものほど公式ドキュメントを適宜参照し仕様も確認すべき。
bool値についての補足(追記)
コメントで触れられていたため、公式文書を確認したところ
どのようなオブジェクトでも真理値として判定でき、 if や while の条件あるいは以下のブール演算の被演算子として使えます。
オブジェクトは、デフォルトでは真と判定されます。ただしそのクラスが __bool__() メソッドを定義していて、それが
False
を返す場合、または __len__() メソッドを定義していて、それが 0 を返す場合は偽と判定されます。主な組み込みオブジェクトで偽と判定されるものを次に示します:
- 偽であると定義されている定数:
None
とFalse
- 数値型におけるゼロ:
0
,0.0
,0j
,Decimal(0)
,Fraction(0, 1)
- 空のシーケンスまたはコレクション:
''
,()
,[]
,{}
,set()
,range(0)
とあった。
None
以外にも偽と判定されるものは多い。
例として空白の文字列を判定するときはわざわざ空の文字列を用意して比較せずとも、真理値の判定に掛けることで判別できる。