True and False — 問いを立てることを学ぶ
比較演算子、and / or / not、連続した比較、Pythonが偽とみなす値を学びます。条件を書くための土台です。
どうやって学びますか?
解決する問題
プログラムは、何かを判断しなければなりません。この注文は割引の対象でしょうか? パスワードは十分に長いでしょうか? 商品は在庫にあるでしょうか?
判断するコードは次の章(if)で登場します。でもその前に、判断の土台が必要です。それは、答えが はい か いいえ になる問いです。Pythonでは、その答えをTrueとFalseと呼び、その型をboolと呼びます。
今日は、判断することではなく、問うことだけを学びます。そう分けるのには理由があります。ifを書くときに人が犯すミスは、ほとんどの場合ifではなく、問いの立て方のミスなのです。
この章を終える頃には
- 6種類の比較演算子を使える
=と==を見分けられるand、or、notで小さな問いを組み合わせられる18 <= age <= 60のような連続した比較を書けるFalseでないのに偽とみなされる値を言える
前提条件: プログラムを使う人からの入力を受け取る。
6つの比較
age = 22
print(age == 22)
print(age != 22)
print(age > 18)
print(age < 18)
print(age >= 22)
print(age <= 21)True
False
True
False
True
Falseどの比較も値を1つ作ります。それはTrueかFalseです。つまり、比較の結果も変数に保存できます:
age = 22
is_adult = age >= 18
print(is_adult)
print(type(is_adult))True
<class 'bool'>変数名をこうつけると、コードはずっと読みやすくなります。is_adultは何を調べているかを示しますが、age >= 18だと読む人が自分で考えなければなりません。
=と== — 1文字違えば、意味も違う
total = 100 # an instruction: put 100 into total
print(total == 100) # a question: is total 100?True=は保存します(代入)==はたずねます(比較)
条件が書かれるべき場所に=を書くと、Python 3は分かりやすいメッセージとともにエラーを出します:
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?良いニュースです。このミスは黙って見過ごされることはなく、必ず捕まります。
テキストの比較
print("rafi" == "rafi")
print("Rafi" == "rafi")
print("apple" < "banana")
print(len("password123") >= 8)True
False
True
Trueここで注意したいことが2つあります。
大文字と小文字は区別されます。 "Rafi"は"rafi"と等しくありません。人が入力したテキストを照合するときは、先に.strip().lower()を実行してください。そうしないと、名前の先頭を大文字で入力した人や、余分な空白を入れた人が除外されてしまいます:
typed = " RAFI "
print(typed == "rafi")
print(typed.strip().lower() == "rafi")False
True<はテキストにも使えます。 アルファベット順、つまり辞書のような順序で比べられます。だから"apple" < "banana"が成り立つのです。名前のリストを並べ替えられるのも、この仕組みによるものです。
and、or、not
3つの単語を使うと、小さな問いを大きな問いにまとめられます:
age = 22
has_id = True
print(age >= 18 and has_id)
print(age >= 60 or has_id)
print(not has_id)True
True
Falseand— 両方が真のときに真or— 少なくとも1つが真のときに真not— 真偽を反転させる
全体像をまとめて見てみましょう:
print(True and True)
print(True and False)
print(False and False)
print(True or False)
print(False or False)True
False
False
True
Falseorは「どちらか、または両方」であり、「どちらか一方だけ」ではありません。 日常会話で「紅茶かコーヒーか?」と聞けば、どちらか一方を指しています。しかしPythonのorは、両方が真のときにもTrueになります。この違いを忘れると、条件が思いどおりに動かず驚くことになります。
notは、直後にあるものだけに適用され、最初に実行されます。順番は、notが最初、次にand、最後にor です。
print(True or False and False)
print((True or False) and False)True
False1行目ではandが先に実行されたので、PythonはTrue or (False and False)と読みました。これはTrue or Falseなので、結果はTrueです。2行目では、かっこが順番を変えています。迷ったらかっこを使いましょう。 算術でかっこが役立つのと同じように、ここでも役立ちます。
連続した比較
ある値が2つの境界の間にあるかを調べるとき、Pythonでは数学と同じ書き方ができます:
marks = 72
print(0 <= marks <= 100)
print(marks > 60 and marks < 80)
print(60 < marks < 80)True
True
True2行目と3行目は同じことを表しています。ただ、3行目のほうが読みやすいです。多くのプログラミング言語はこの書き方を許しませんが、Pythonは許します。ぜひ使ってみてください。
Pythonが偽とみなす値
偽になるのはFalseだけではありません。いくつかのふつうの値も偽とみなされます:
print(bool(0))
print(bool(1))
print(bool(-5))
print(bool(""))
print(bool("hello"))
print(bool("0"))
print(bool("False"))False
True
True
False
True
True
Trueルールは1行で言えます。0と空のものは偽、それ以外はすべて真です。 つまり0は偽、空のテキスト""も偽です。一方、-5は0ではないので真です。"0"と"False"も真です。空ではなく、文字を含んでいるからです。
最後の2行が本当の落とし穴です。input()から受け取るものは、すべてテキストです。そのため、相手が0と入力しても、手元にあるのは"0"で、Pythonはこれを真とみなします。数値を比べるときは、先にint()で変換しなければなりません。
「空は偽」というルールには、実用的な使い道もあります。Enterだけを押して何も入力しなかった人を検出できるのです:
name = input("Name: ").strip()
print("Name was given:", bool(name))Name:
Name was given: False完成例
eligibility.py:
# Check a discount rule without deciding anything yet
age = int(input("Age : "))
years_member = int(input("Years a member : "))
order_total = float(input("Order total : "))
is_adult = age >= 18
is_senior = age >= 60
is_loyal = years_member >= 2
is_large_order = order_total >= 1000
# The rule: adults who are either long-standing members or spending a lot
gets_discount = is_adult and (is_loyal or is_large_order)
print()
print(f"Adult : {is_adult}")
print(f"Senior : {is_senior}")
print(f"Loyal member : {is_loyal}")
print(f"Large order : {is_large_order}")
print(f"Gets discount : {gets_discount}")Age : 34
Years a member : 1
Order total : 1500
Adult : True
Senior : False
Loyal member : False
Large order : True
Gets discount : True各条件に、まず名前をつけてから、それらを組み合わせてルールを作っていることに注目してください。age >= 18 and (years_member >= 2 or order_total >= 1000)のように1行で書いても、コードの動きは同じです。しかし6か月後にそのルールを読み解こうとすると、大変な作業になります。かっこも大事です。かっこがなければandが先に実行され、ルールそのものが変わってしまいます。
うまくいかないとき
SyntaxError: invalid syntax. Maybe you meant '==' ... 比較を書くべき場所に=が書かれています。==を使ってください。
同じはずなのにFalseになる 3つを確認しましょう。余分な空白(.strip())、大文字と小文字(.lower())、そして型です。"22" == 22は必ずFalseになります。テキストと数値は決して等しくならないからです。
TypeError: '<' not supported between instances of 'str' and 'int' テキストと数値を比べています。おそらくinput()の変換を忘れたのでしょう。int()で囲んでください。
2つの小数が==で等しくならない 想定どおりの動きです。第5章の小数の落とし穴を思い出してください。round()で丸めてから比べてください。
条件が書いたとおりに動かない andとorの順番を確認してください。notが最初、次にand、最後にorです。意図を明示するには、かっこを使いましょう。
ステップ 4 / 6 — 予想する
理解度をチェック
次の3行の出力は何でしょうか?
print(5 > 3 and 2 > 4)
print(5 > 3 or 2 > 4)
print(not 5 > 3)- AFalse True True
- BFalse False True
- CTrue True False
- DFalse True False
これら3つの値は、それぞれ真と偽のどちらとして扱われるでしょうか?
print(bool("False"))
print(bool(""))
print(bool(0))- ATrue False False
- BTrue True False
- CFalse True False
- DFalse False False
相手がYes (先頭のYは大文字、末尾に空白が1つ)と入力すると、プログラムはContinuing: Falseと表示します。なぜでしょうか? そして最善の直し方は何でしょうか?
answer = input("Type yes to continue: ")
print("Continuing:", answer == "yes")- A`answer`は先に`bool()`で変換する必要があります
- B`==`は`=`にすべきです
- C比較では、末尾の空白も大文字も両方が影響します — `answer.strip().lower() == "yes"`が必要です
- D`input()`の結果は`"yes"`と決して等しくならないので、代わりに`in`を使う必要があります
回答にはアカウントが必要です
ログインして答えを確認
問題は上にあります。頭の中で答えを考えることがいちばん大切です。ログインすると、正解・解説・3 段階のヒントを確認できます。
やってみよう
password_check.pyという名前のファイルを書いてください。パスワードを受け取り、次の4つの問いについてTrue/Falseを表示します:
- 長さが8以上である
- 長さが8以上20以下である(連続した比較で書いてください)
- 単語
"password"が含まれていない(notとinの両方が必要です。また、比べる前に小文字に変換してください) - 上の3つがすべて同時に真であるか
そのあと、少なくとも4種類のパスワードで実行してください。1つは非常に短いもの、1つは非常に長いもの、1つはPasswordと大文字を含むもの、そして1つはすべての条件を満たすものです。4つすべてが正しく答えるか確かめてください。特に3つ目を確かめましょう。大文字と小文字の落とし穴が潜んでいるのは、まさにそこだからです。
このミッションにはまだ続きがあります
上で読んだ内容がミッションのすべてで、削られた部分はありません。Pro では次の内容が追加されます:
- 内部で実際に何が起きているか — Python がこれをどう実行するのか
- 演習の完全な解答と、ステップごとの解説
- さらに難しい追加演習
- このテーマでよく聞かれる面接の質問と模範解答