0
0

More than 1 year has passed since last update.

Pythonのbool値で躓いた話

Last updated at Posted at 2022-11-05

目次

  • 躓いたポイント
  • 解決方法
  • まとめに
  • bool値についての補足(追記)

※ 2022/11/06 追記
変数が大文字になってたので修正
補足を追記
その他コメントでして指摘のあったものを修正

躓いたポイント

正規表現(re)を勉強していたある日のこと

マッチオブジェクトのブール値は常に True です。
match() および search() はマッチがないとき None を返すので、マッチがあるか単純な if 文で判定できます。

こりゃ便利だ。早速試してみよう

test.py
import re

truestring = "aaa"
pattern = re.compile(r"aaa")

trueresult = pattern.match(truestring)
if trueresult == True:
    print("Matched!")
else:
    print("Not matched...")
result
Not matched...

アレ?

解決方法

if Trueresult:
    print("Matched!")
else:
    print("Not matched...")
result
Matched!

当たり前だがbool値がTrueなのであって値そのものがTrueな訳ではない。
イコールでつないだらFalseと出力される。

is を使って比較したらどうか試してみたが

if trueresult is True:
    print("Matched!")
else:
    print("Not matched...")
result
Not matched...

ダメだった。

まとめに

分かりやすいかもという理由でboolを安易にイコールでつなぐと碌なことにならない。
pythonは簡潔にコードが記述できるが脳死でコードを書くとハマるので一行一行噛みしめてコードを書くべき。
また、基礎的なものほど公式ドキュメントを適宜参照し仕様も確認すべき。

bool値についての補足(追記)

コメントで触れられていたため、公式文書を確認したところ

どのようなオブジェクトでも真理値として判定でき、 if や while の条件あるいは以下のブール演算の被演算子として使えます。

オブジェクトは、デフォルトでは真と判定されます。ただしそのクラスが __bool__() メソッドを定義していて、それが False を返す場合、または __len__() メソッドを定義していて、それが 0 を返す場合は偽と判定されます。主な組み込みオブジェクトで偽と判定されるものを次に示します:

  • 偽であると定義されている定数: NoneFalse
  • 数値型におけるゼロ: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
  • 空のシーケンスまたはコレクション: '', (), [], {}, set(), range(0)

とあった。

None以外にも偽と判定されるものは多い。
例として空白の文字列を判定するときはわざわざ空の文字列を用意して比較せずとも、真理値の判定に掛けることで判別できる。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0