🔙
🔝

bool型 True と False

論理に強くなれるかもしれません

Chatpter.1 - True と False

True と False

  • これらは、条件文の や 繰り返し文の で見ましたね。

    要するに こういうこと 他の考え方
    True 正しい はい オン ある
    False 正しくない いいえ オフ ない
  • TrueFalse の2つの値の型は boolブール と言います。

  • 「〔 条件式 〕が正しいとき・・・」という条件式の評価の結果で使われます。

  • 小難しい言い方をしてしまいました。

  • どんな時も、条件式が正しい時は True 、正しくない時は False に、式が化けます

  • そして、化けたこの TrueFalse が、評価の結果として使われるになります。

  • TrueFalseなので、変数に代入できます。

    is_adult = True   # 大人
    is_adult = False  # 大人ではない
    

  • 文で使うと、こんな感じになります。

    if is_adult:    # すでに True または False という↵
        osake += 1  # 値が入っているので、変数だけでよい
    else:
        okashi += 1
    
  • いつも条件式が化けた後の TrueFalse は見ることが出来ませんが、条件式が評価された後は、必ず TrueFalse になっているということを想像しながらプログラムを組んでみてください。

    if 〔条件式〕 が:
        True の時はこっち。
    else:
        False の時はこっち。
    
Chatpter.2 - 1 と 0

1 と 0

  • コンピュータは二進数で、0 と 1 の二つの数字だけで構成されています。

  • 1 が True、0 が False でもあります。

  • Python3 の場合、0 が False、0 以外が True になっています。

  • -1 も True です。
    ※ これらについては Chatpter.4 の 「『ある』か『ない』か」 の冒頭で表にしています。
    先にのぞいてみてもOK!

  • そして、True が 1 、False が 0 でもあります。

  • こういう意味です。

    print(True)   # ← 文字列ではない
    print(False)  # ← 文字列ではない
    print(int(True))
    print(int(False))
    
    True
    False
    1
    0
  • TrueFalseint() で整数型に変換すると、その姿を現します。


  • この性質を利用して、こんなハイパースゴイコトもできちゃいます。

    cnt += (i % 2 == 0)   # 条件式が偶数の時、True
    

    i が偶数の時、cnt1 (True) を足す。


  • True は、演算(計算)にかけると自動で 1 に変換してくれます。
    False も同じく、0 になって 0 を足します。

    cnt = 0
    print(cnt)
    
    cnt = True
    print(cnt)
    
    cnt += True   # True + True = 2
    print(cnt)
    
    cnt += False  # 2 + False = 2
    print(cnt)
    
    0
    True
    2
    2
  • True が 1 、False が 0 という性質を利用して、こんな書き方も出来ます。

    while 1:    # 0 じゃなければいくつでも True
        print('無限ちゅ~る天国')
    
    cnt = 5
    while cnt:    # 0 になったらループを抜けて止まる
        cnt -= 1
    
  • TrueFalse01 だけなのに意外に複雑ですね。

  • でもこれで終わりではないのです。まだ続きます。

Chatpter.3 - True or not True

True or not True

  • 簡単に言うと、TrueFalse を「反対にしたい」ときに notノット を使います。(否定ひてい

    これを 否定すると こう化ける
    True not True False
    False not False True

    この表を見て意味がわかったら、以降の説明は飛ばして構いません。
    無理に読むと頭が疲れますよ。

【 以降の説明とやらに挑戦する! 】
  • この2つは同じ事をしています。

    1️⃣
    if a != 0:      # a が 0 ではない時 True
    
    2️⃣
    if not a == 0:  # a が 0 の時 ではない時 True
    

  • a0 の時、2️⃣のプログラムの流れは、こうなります。

    if not True:  # a == 0 の結果の True を not する
    
    if False:     # 0 を否定して False に化ける
    

    上の表に記した形になります。😵
    優先順位は 条件式 > not です。

  • not の位置や ( ) をつけたりして範囲を変えたりできます。

    # a が (10未満)『ではなく』、偶数の時、
    if not a < 10 and a % 2 == 0:
       ^^^^^^^^^^
    # a が (10未満で、偶数)『ではない』時、
    if not (a < 10 and a % 2 == 0):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    # a が 10未満で、(偶数)『ではない』時、
    if a < 10 and not a % 2 == 0:
                  ^^^^^^^^^^^^^^
    

    not を混ぜて使うと、とても混乱しますね。気を付けてください。


  • 文でも not を使うことが出来ます。

    cnt = 100
    
    # cnt が 50 未満の時ではない時 (つまり50以上の時)
    while not (cnt < 50):   # cnt >= 50 と同じ
        print(cnt)
        cnt -= 1
    

    この例ではただまわりくどいだけの書き方ですが・・・。

Chatpter.4 - 『ある』か『ない』か

『ある』か『ない』か

  • 値があるときは True 、ないときは False になります。

    値があるとき 値の例 値がないとき 値の例
    int 0 以外 1 100 -3 0 0
    str 文字がある 'ネコ' "chat" ' ' 文字列が空 (empty) '' ""
    list 要素がある [1, 'ネコ'] ['', ""] 要素がない []
    まんま 値がある 1 'ネコ' [''] 値がない None

    相変わらずややこしいですね・・・。


  • None とは「値がない」というです。(またややこしい・・・😓)

    value = None    # 'value' は「値」という意味の英語です
    print(value)
    
    if value:       # None は値がないので False に化ける
        print('おさかなうまいにゃ')
    else:
        print('ごはんまだ?')
    
    None
    ごはんまだ?

    「ノーン」と読みます。

  • None はこちらが特に意識して使うものではなく、関数の戻り値で None が返ってきて化けた時に見るくらいです。

  • 関数が「引数渡してくれたけど、何も返せる値が無かったよ。ゴメン...。」という言葉が None なのです。


  • None はそのまま False ですので、値があるないかの「ない」として使えます。

  • ただし、NoneBool型ではないので、演算(計算)に使うことはできません。

  • こうなります。

    print(None + None)
    
    Traceback (most recent call last):
      File "Main.py", line 1, in 
        print(None + None)
    TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'
    

    しっかり NoneType (None型) って書いてありますね。💦

  • 実際に打ち込んで試してみてください。

Chatpter.5 - フラグを立てる

フラグを立てる目的

既読

一度読んだら既読にする

  • 「既読」と「未読」を TrueFalse に割り当てれば簡単に管理できます。

    messages = [False, '読んだら既読']
    
    for i in range(3):
        if messages[0]:
            print(messages[1], '[既読]')
        else:
            print(messages[1])
            messages[0] = True
    
    読んだら既読← 「未読」から「既読」に切り替わる 読んだら既読 [既読]← 一度読んでいるので「既読」になっている 読んだら既読 [既読]← 何度読んでも「既読」のまま
多重ループの脱出

多重ループの脱出

  • ループを抜ける時に使う break は、今のループを1つだけしか抜けることができません。

  • プログラムで説明します。

    cnt = 0
    while True:
        print('ループ1')
        while True:
            print('ループ2')
            if cnt == 2:
                break
            else:
                cnt += 1
    
    ループ1
    ループ2
    ループ2
    ループ2
    ループ1
    ループ2
    ループ1
    ※ 以下無限ループ
  • ループ2は cnt == 2 になったら break で抜けられますが、ループ1から抜けられず、無限ループとなってしまいます。

  • こんな時にはループを抜けるように、フラグを立てて誘導します。

    cnt = 0
    flg = False
    while True:
        print('ループ1')
        while True:
            print('ループ2')
            if cnt == 2:      # cnt == 2 になったら
                flg = True    # flg = True にする(フラグを立てる)
                break   # ループ2を抜ける
            else:
                cnt += 1
    
        if flg:     # flg = True の時、
            break   # ループ1を抜ける
    
    print('ループおわり')
    
    ループ1
    ループ2
    ループ2
    ループ2
    ループおわり

  • 文の場合は、こんな風にも書けます。

    cnt = 0
    flg = True
    while flg:    # flg = True の間、ループ1は繰り返す
        print('ループ1')
        while True:
            print('ループ2')
            if cnt == 2:
                flg = False   # flg = False にする(フラグを立てる)
                break
            else:
                cnt += 1
    
    # ↑ flg = False の場合は ループ1のwhileを脱出する
    
    print('ループおわり')
    
    ループ1
    ループ2
    ループ2
    ループ2
    ループおわり

  • ループ2の while True: のところもフラグにすると break が要らなくなります。

    cnt = 0
    flg1 = True   # ループ1のフラグ
    flg2 = True   # ループ2のフラグ
    while flg1:
        print('ループ1')
        while flg2:
            print('ループ2')
            if cnt == 2:
                flg1 = False
                flg2 = False
            else:
                cnt += 1
    
    # ↑ flg = False の場合は ループ1のwhileを脱出する
    
    print('ループおわり')
    
    ループ1
    ループ2
    ループ2
    ループ2
    ループおわり
  • どうでしょう?わかりましたか?というか、ちゃんと読んでませんよね。🙄

  • 実はフラグを立てるこのようなやり方はあまりおすすめしません。

  • 複雑でわかりにくいですよね。

  • 今回は TrueFalse の使い方の1つとして紹介しましたが、複雑なことはなるべく避けたいものです。

  • でも、これからいろいろたくさん学んでプログラミングに慣れるまでは仕方がありません。

  • これを回避する方法があるのですが、まだ難しいので、それはまたいつか。😿