- Python
Python if文の書き方|elif・elseとand・or・notの条件式
Pythonのif文とは、「条件式がTrueと見なされるときだけ、字下げしたブロックを実行する」ための構文です。 if 条件式: と書いて行末にコロンを置き、次の行から半角スペース4つで字下げした処理を並べます。条件を追加したいときは elif、どれにも当てはまらないときの処理は else で書きます。
この記事では、if・elif・elseの基本から、and・or・notを使った条件式、短絡評価、a < b < c の連結比較、in と is、三項演算子までを1ページにまとめました。すべてのコードに実行結果を付け、コロン忘れのSyntaxError、IndentationError、= と == の取り違えは実際にエラーを出してから直し方を示しています。実行環境は Python 3.14.7 です(エラーメッセージの文面はバージョンによって少し変わります)。
Python if文の早見表
構文の早見表
| やりたいこと | 書き方 | ポイント |
|---|---|---|
| 条件に合うときだけ実行 | if x > 0: |
行末にコロン、次の行から字下げ |
| 別の条件を追加 | elif x == 0: |
何個でも書ける。上から順に判定 |
| どれにも合わないとき | else: |
条件式は書かない。最後に1つだけ |
| 両方を満たす | if a and b: |
左がFalseなら右は評価されない |
| どちらかを満たす | if a or b: |
左がTrueなら右は評価されない |
| 条件を反転 | if not a: |
比較演算子より後に評価される |
| 範囲に入っているか | if 0 <= x < 10: |
連結比較。andでつなぐのと同じ |
| 候補のどれかと一致 | if x in ("a", "b"): |
x == "a" or x == "b" を短く書ける |
| Noneかどうか | if x is None: |
Noneの判定は is を使う |
| 1行で値を選ぶ | y = "A" if x else "B" |
三項演算子(条件式) |
| 何もしないブロック | pass |
ブロックを空にはできないため置く |
比較演算子の早見表
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
== |
等しい | 5 == 5 |
True |
!= |
等しくない | 5 != 8 |
True |
< |
より小さい | 5 < 8 |
True |
<= |
以下 | 5 <= 5 |
True |
> |
より大きい | 5 > 8 |
False |
>= |
以上 | 5 >= 8 |
False |
in |
含まれる | "a" in "abc" |
True |
not in |
含まれない | 4 not in [1, 2, 3] |
True |
is |
同じオブジェクト | x is None |
xがNoneならTrue |
is not |
同じオブジェクトでない | x is not None |
xがNone以外ならTrue |
論理演算子の早見表
| 演算子 | 意味 | 返す値 | 優先順位 |
|---|---|---|---|
not x |
反転 | xが偽ならTrue、それ以外はFalse | 高い(3つの中で最初) |
x and y |
かつ | xが偽ならx、それ以外はy | 中 |
x or y |
または | xが真ならx、それ以外はy | 低い(3つの中で最後) |
比較演算子(== や < など)は、この3つよりも先に評価されます。
Falseと見なされる値の早見表
| 分類 | Falseと見なされる値 | まちがえやすいTrueの値 |
|---|---|---|
| 定数 | False、None |
― |
| 数値のゼロ | 0、0.0、0j、Decimal(0)、Fraction(0, 1) |
-1、0.1 |
| 空の文字列 | ""、b"" |
"0"、" "(空白1つ)、"False" |
| 空のコレクション | []、()、{}、set()、range(0) |
[0]、[[]]、(None,) |
上の4つ以外の値は、基本的にTrueと見なされます。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Python if文の書き方|elif・elseとand・or・notの条件式」
if・elif・elseの基本の書き方
if文は「if → elif(0個以上)→ else(0個か1個)」の順に書きます。上から順に条件を調べ、最初に当てはまった1つのブロックだけを実行します。
score = 72
if score >= 80:
print("合格(優)")
elif score >= 60:
print("合格")
else:
print("再挑戦")
print("判定おわり")
合格
判定おわり
score は72なので、最初の条件 score >= 80 はFalse、次の score >= 60 がTrueになり「合格」だけが表示されます。字下げしていない最後の print は、if文の外にあるので条件に関係なく実行されます。
flowchart TD
A[開始] --> B{score >= 80}
B -- True --> C[合格(優)]
B -- False --> D{score >= 60}
D -- True --> E[合格]
D -- False --> F[再挑戦]
C --> G[判定おわり]
E --> G
F --> G
書き方の3つの決まり
| 決まり | 内容 |
|---|---|
| 行末にコロン | if、elif、else の行は必ず : で終える |
| 字下げでブロックを表す | 半角スペース4つがPythonの標準的な書き方。同じブロックは同じ幅にそろえる |
| elseに条件は書かない | else: だけを書く。条件を付けたいときは elif を使う |
Pythonには波かっこ {} でブロックを囲む書き方がなく、字下げそのものが文法です。字下げの幅がずれるとエラーになります(後半で再現します)。
elifは順番で結果が変わる
elifは上から順に判定されるため、範囲の狭い条件から先に書くのがコツです。
def grade_if(score):
if score >= 90:
return "A"
elif score >= 80:
return "B"
elif score >= 70:
return "C"
return "D"
# 上から順に判定され、最初に当てはまった1つだけが実行される
print([grade_if(s) for s in (95, 85, 75, 40)])
def grade_wrong(score):
if score >= 70: # 広い条件を先に書くと、90点もここで止まる
return "C"
elif score >= 80:
return "B"
elif score >= 90:
return "A"
return "D"
print([grade_wrong(s) for s in (95, 85, 75, 40)])
['A', 'B', 'C', 'D']
['C', 'C', 'C', 'D']
2つ目の関数では、95点も85点も最初の score >= 70 に当てはまるので、すべて「C」になります。
ifを並べる書き方とelifのちがい
elif ではなく if を並べると、それぞれが独立して判定され、当てはまるものがすべて実行されます。
score = 95
if score >= 70:
print("70以上")
if score >= 80:
print("80以上")
if score >= 90:
print("90以上")
70以上
80以上
90以上
| 書き方 | 実行されるブロック | 向いている場面 |
|---|---|---|
if … elif … else |
最初に当てはまった1つだけ | ランク分け、種類ごとの振り分け |
if を並べる |
当てはまるものすべて | 互いに関係のない複数のチェック |
比較演算子で条件式を作る
条件式は、評価するとTrueかFalseになる式です。比較演算子の結果を print で確かめてみます。
a, b = 5, 8
print("a == b :", a == b)
print("a != b :", a != b)
print("a < b :", a < b)
print("a <= b :", a <= b)
print("a > b :", a > b)
print("a >= b :", a >= b)
print('"apple" < "banana" :', "apple" < "banana")
print('"10" == 10 :', "10" == 10)
print("1 == 1.0 :", 1 == 1.0)
print("[1, 2] == [1, 2] :", [1, 2] == [1, 2])
a == b : False
a != b : True
a < b : True
a <= b : True
a > b : False
a >= b : False
"apple" < "banana" : True
"10" == 10 : False
1 == 1.0 : True
[1, 2] == [1, 2] : True
- 文字列どうしは辞書順(文字コード順)で比べられます。
- 文字列の
"10"と数値の10は等しくなりません。エラーにはならず、Falseになるだけなので気づきにくいところです。 - 整数の
1と小数の1.0は、値が同じなのでTrueです。
文字列と数値を比べるとTypeErrorになる
input() で受け取った値は文字列です。そのまま数値と大小を比べるとTypeErrorになります。
age_text = "20" # input() の戻り値は文字列
print(age_text == 20) # 型がちがうので False(エラーにはならない)
try:
if age_text >= 18:
print("成人")
except TypeError as e:
print("TypeError:", e)
age = int(age_text) # 数値に変換してから比べる
if age >= 18:
print("成人")
False
TypeError: '>=' not supported between instances of 'str' and 'int'
成人
== はFalseになるだけ、>= などの大小比較はTypeError、という違いがあります。どちらも int() や float() で数値に変換してから比べると解決します。
and・or・notで複数の条件を組み合わせる
| 演算子 | 読み方 | Trueになるとき |
|---|---|---|
A and B |
AかつB | AとBの両方が真 |
A or B |
AまたはB | AとBのどちらかが真 |
not A |
Aでない | Aが偽 |
age = 25
is_member = True
stock = 0
if age >= 18 and is_member:
print("and: 両方Trueなので実行")
if stock > 0 or is_member:
print("or : どちらかTrueなので実行")
if not stock:
print("not: stockが0(Falseと見なされる)なので実行")
# 優先順位: not > and > or
print(True or False and False) # and が先
print((True or False) and False) # かっこで順番を変える
print(not 1 == 2) # 比較が先、そのあと not
print(not True or True) # (not True) or True
and: 両方Trueなので実行
or : どちらかTrueなので実行
not: stockが0(Falseと見なされる)なので実行
True
False
True
True
andとorの優先順位
優先順位は「比較演算子 → not → and → or」の順です。掛け算が足し算より先に計算されるのと同じように、andはorより先にまとまります。
| 書いた式 | Pythonの解釈 | 結果 |
|---|---|---|
True or False and False |
True or (False and False) |
True |
(True or False) and False |
かっこの中が先 | False |
not 1 == 2 |
not (1 == 2) |
True |
not True or True |
(not True) or True |
True |
andとorを1つの条件式に混ぜるときは、かっこを付けて意図を示すと読みまちがいを防げます。if is_admin or (is_member and age >= 18): のように、優先順位どおりであってもかっこを書いておくと、あとで読む人に親切です。
短絡評価:必要なところまでしか評価されない
andとorは左から順に評価し、結果が決まった時点で残りを評価しません。これを短絡評価(ショートサーキット)と呼びます。どちらが呼ばれたかを表示する関数で確かめます。
def check(name, result):
print(f" {name} を評価")
return result
print("and: 左がFalseなら右は評価されない")
print(check("A", False) and check("B", True))
print("or : 左がTrueなら右は評価されない")
print(check("A", True) or check("B", False))
# 応用1: 空リストでも IndexError にならない
items = []
if items and items[0] == "apple":
print("先頭はapple")
else:
print("空、または先頭がapple以外")
# 応用2: and / or は True・False ではなく「最後に評価した値」を返す
print("" or "ゲスト")
print("田中" or "ゲスト")
print(0 and 100)
print(5 and 100)
and: 左がFalseなら右は評価されない
A を評価
False
or : 左がTrueなら右は評価されない
A を評価
True
空、または先頭がapple以外
ゲスト
田中
0
100
どちらの例でも「B を評価」は表示されていません。この性質には2つの使い道があります。
| 使い道 | 書き方 | 説明 |
|---|---|---|
| 前提条件を先に確かめる | if items and items[0] == "apple": |
リストが空なら items[0] は評価されないのでIndexErrorにならない |
| 既定値を与える | name = text or "ゲスト" |
text が空文字なら右側の値が使われる |
2つ目は便利ですが、0 や空リストも「偽」として扱われる点に注意が必要です。「0は有効な値として残したい」場合は x if x is not None else 既定値 と書くと意図どおりになります。
Falseと見なされる値を確かめる
if文の条件式には、TrueとFalse以外の値も書けます。Pythonは値を真偽に読み替えて判定します。bool() で確かめた結果が次のとおりです。
from decimal import Decimal
from fractions import Fraction
values = [False, None, 0, 0.0, 0j, Decimal(0), Fraction(0, 1),
"", (), [], {}, set(), range(0), b"",
"0", " ", "False", [0], [[]], (None,), -1, 0.1]
for v in values:
print(f"{v!r:<16} -> {bool(v)}")
False -> False
None -> False
0 -> False
0.0 -> False
0j -> False
Decimal('0') -> False
Fraction(0, 1) -> False
'' -> False
() -> False
[] -> False
{} -> False
set() -> False
range(0, 0) -> False
b'' -> False
'0' -> True
' ' -> True
'False' -> True
[0] -> True
[[]] -> True
(None,) -> True
-1 -> True
0.1 -> True
Python公式ドキュメント(組み込み型の「真理値判定」、今回3.14.8版のページで確認)でも、偽と見なされるのは「NoneとFalse」「数値のゼロ」「空のシーケンスとコレクション」の3グループと説明されています。文字列の "0" や "False"、要素が1つでも入ったリストはTrueです。
この性質を使うと、空かどうかの判定を短く書けます。
| やりたいこと | 短い書き方 | 同じ意味の書き方 |
|---|---|---|
| リストが空でない | if items: |
if len(items) > 0: |
| リストが空 | if not items: |
if len(items) == 0: |
| 文字列が空でない | if text: |
if text != "": |
| Noneかどうかだけ調べたい | if x is None: |
(if not x: だと0や空文字も含まれる) |
a < b < cの連結比較で範囲を判定する
Pythonでは比較演算子をつなげて書けます。0 < x < 10 は 0 < x and x < 10 と同じ意味です。
x = 7
print(0 < x < 10) # 0 < x and x < 10 と同じ
print(0 < x <= 5)
print(1 == 1.0 == True) # 3つとも等しいか
print(1 < 3 > 2) # 1 < 3 and 3 > 2
temp = 22
if 18 <= temp < 26:
print("快適")
def get():
print(" get() を呼び出し")
return 7
print(0 < get() < 10) # 真ん中の式は1回だけ評価される
# 注意: != をつなげても「全部ちがう」にはならない
a, b, c = 1, 2, 1
print(a != b != c) # a != b and b != c
print(len({a, b, c}) == 3) # 全部ちがうかは集合で確認
True
False
True
True
快適
get() を呼び出し
True
True
False
- 真ん中の式(ここでは
get())は1回だけ評価されます。0 < get() and get() < 10と書くと2回呼ばれるので、連結比較のほうが無駄がありません。 - 連結比較は「となり合う2つ」を順に比べるだけです。
a != b != cはaとcを比べないので、aとcが同じ値でもTrueになります。
inとisで「含まれるか」「同じものか」を調べる
fruits = ["apple", "banana", "orange"]
print("banana" in fruits)
print("grape" not in fruits)
print("nan" in "banana") # 文字列は部分一致
print("id" in {"id": 1, "name": "A"}) # 辞書はキーを調べる
print(5 in range(1, 10))
role = "editor"
if role in ("admin", "editor"):
print("編集できます")
# is は「同じオブジェクトか」、== は「値が等しいか」
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b, a is b)
print(a == c, a is c)
value = None
if value is None:
print("値はまだありません")
if value is not None:
print("ここは実行されない")
True
True
True
True
True
編集できます
True False
True True
値はまだありません
| 演算子 | 調べること | 使う場面 |
|---|---|---|
in / not in |
要素・部分文字列・キーが含まれるか | 候補のどれかと一致するか、禁止語が含まれるか |
== / != |
値が等しいか | 数値・文字列・リストの中身の比較 |
is / is not |
同じオブジェクトか | None、True、False との比較 |
a と b は中身が同じ別々のリストなので、== はTrue、is はFalseになります。値を比べたいときは ==、Noneかどうかを調べたいときは is None と覚えておくと迷いません。
三項演算子で1行にまとめる
「条件によって値を選ぶだけ」のときは、三項演算子(条件式)で1行に書けます。形は Trueのときの値 if 条件式 else Falseのときの値 です。
age = 20
label = "成人" if age >= 18 else "未成年"
print(label)
n = 0
print("ゼロ" if n == 0 else "正" if n > 0 else "負")
stock = 3
print(f"在庫: {'あり' if stock else 'なし'}")
nums = [1, 2, 3, 4, 5]
print(["偶数" if n % 2 == 0 else "奇数" for n in nums])
成人
ゼロ
在庫: あり
['奇数', '偶数', '奇数', '偶数', '奇数']
| 書き方 | 向いている場面 |
|---|---|
| 三項演算子 | 代入する値を2つから選ぶ、f文字列や内包表記の中で値を切り替える |
| 通常のif文 | 処理が複数行ある、分岐が3つ以上ある、分岐ごとに行う処理がちがう |
三項演算子は重ねて書けますが、2つ以上重ねると読み取りに時間がかかります。分岐が3つ以上なら通常のif・elif・elseに戻すと読みやすさを保てます。
長い条件式を読みやすく書く
かっこで囲んで複数行に分ける
条件が長くなったら、全体を丸かっこで囲むと途中で改行できます。行頭に and や or を置くと、条件の増減がしやすくなります。
age, is_member, points, country = 30, True, 1200, "JP"
if (
age >= 18
and is_member
and points >= 1000
and country in ("JP", "US")
):
print("特典の対象です")
scores = [72, 85, 90]
if all(s >= 60 for s in scores):
print("全員60点以上")
if any(s >= 90 for s in scores):
print("90点以上が1人以上いる")
# 条件に名前を付けると読みやすい
is_adult = age >= 18
has_enough_points = points >= 1000
if is_adult and has_enough_points:
print("条件を変数にまとめた書き方")
特典の対象です
全員60点以上
90点以上が1人以上いる
条件を変数にまとめた書き方
| 方法 | 書き方 | 効果 |
|---|---|---|
| かっこで改行 | if ( … ): |
1行に1条件で並べられる |
all() |
all(条件 for x in リスト) |
「すべて満たす」をandの連続なしで書ける |
any() |
any(条件 for x in リスト) |
「1つでも満たす」をorの連続なしで書ける |
| 条件を変数にする | is_adult = age >= 18 |
条件に名前が付き、意図が伝わる |
ネストを浅くする(早めにreturnする)
if文の中にif文を書くことをネスト(入れ子)と呼びます。ネストが深くなったら、「当てはまらない場合を先に返す」形に並べ替えると、字下げが1段にそろいます。
def can_order_nested(user, stock, quantity):
if user is not None:
if stock > 0:
if quantity <= stock:
return "注文できます"
else:
return "在庫が足りません"
else:
return "在庫切れです"
else:
return "ログインしてください"
def can_order(user, stock, quantity):
if user is None:
return "ログインしてください"
if stock <= 0:
return "在庫切れです"
if quantity > stock:
return "在庫が足りません"
return "注文できます"
for args in [(None, 5, 1), ("sato", 0, 1), ("sato", 5, 9), ("sato", 5, 2)]:
print(can_order_nested(*args), "/", can_order(*args))
ログインしてください / ログインしてください
在庫切れです / 在庫切れです
在庫が足りません / 在庫が足りません
注文できます / 注文できます
2つの関数は同じ結果を返しますが、下の書き方は上から順に読むだけで流れが追えます。
値で振り分けるなら辞書やmatch文も使える
「変数の値ごとに結果を決める」だけなら、if・elifのほかに辞書とmatch文(Python 3.10以降)でも書けます。
status = 404
# if-elif
if status == 200:
msg = "成功"
elif status == 404:
msg = "見つかりません"
else:
msg = "その他"
print(msg)
# 辞書で対応表にする
messages = {200: "成功", 404: "見つかりません"}
print(messages.get(status, "その他"))
# match文(Python 3.10以降)
match status:
case 200:
msg = "成功"
case 404:
msg = "見つかりません"
case _:
msg = "その他"
print(msg)
見つかりません
見つかりません
見つかりません
| 書き方 | 向いている場面 |
|---|---|
| if・elif・else | 大小比較や複数の変数を組み合わせた条件 |
辞書 + get() |
値と結果が1対1で対応する。対応表が増えていく |
| match文 | 値やデータの形で振り分ける。Python 3.10以降 |
よくあるエラーを再現して直す
ここからは、if文で出会いやすいエラーを実際に発生させ、メッセージと直し方を並べます。すべて Python 3.14.7 で実行した結果です(ファイルのパスは短く表記しています)。
エラーメッセージの早見表
| エラーメッセージ | 原因 | 直し方 |
|---|---|---|
SyntaxError: expected ':' |
行末のコロンがない/else if と書いた |
: を付ける/elif に直す |
IndentationError: expected an indented block after 'if' statement on line N |
ifの次の行が字下げされていない/ブロックが空 | スペース4つで字下げする/pass を置く |
IndentationError: unexpected indent |
必要のない字下げがある | 前の行と幅をそろえる |
IndentationError: unindent does not match any outer indentation level |
字下げを戻した幅がどの段とも合わない | 外側のブロックと幅をそろえる |
TabError: inconsistent use of tabs and spaces in indentation |
タブとスペースが混ざっている | スペースに統一する |
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? |
条件式に = を書いた |
== に直す |
SyntaxError: 'elif' block follows an 'else' block |
elseのあとにelifを書いた | elseを最後に移す |
SyntaxError: invalid syntax(=> の位置) |
=> と書いた |
>= に直す |
TypeError: '>=' not supported between instances of 'str' and 'int' |
文字列と数値を大小比較した | int() などで変換する |
コロン忘れのSyntaxError
直す前:
score = 72
if score >= 60
print("合格")
File "e01.py", line 2
if score >= 60
^
SyntaxError: expected ':'
^ がコロンの入るべき位置を指しています。直した後:
score = 72
if score >= 60:
print("合格")
ほかの言語に慣れていると else if と書きたくなりますが、Pythonでは elif です。else if score >= 60: と書いた場合も、else の直後にコロンがないと判断されて同じ SyntaxError: expected ':' になります。
File "e06.py", line 4
else if score >= 60:
^^
SyntaxError: expected ':'
IndentationError(字下げのエラー)3種類
1. ifの次の行を字下げしていない
score = 72
if score >= 60:
print("合格")
File "e02.py", line 3
print("合格")
^^^^^
IndentationError: expected an indented block after 'if' statement on line 2
「2行目のif文のあとには字下げしたブロックが必要」という意味です。print の前にスペースを4つ入れると直ります。ブロックの中身をコメントだけにした場合も同じエラーになるので、あとで書く場所には pass を置きます。
2. 必要のない字下げがある
score = 72
if score >= 60:
print("合格")
print("おめでとう")
File "e03.py", line 4
print("おめでとう")
IndentationError: unexpected indent
4行目のスペースを4つにそろえると直ります。
3. 字下げを戻した幅が合わない
score = 72
if score >= 60:
print("合格")
print("おめでとう")
File "e04.py", line 4
print("おめでとう")
^
IndentationError: unindent does not match any outer indentation level
4行目はスペース2つで、ifのブロック(4つ)にも、外側(0)にも合っていません。ブロックの中に入れるなら4つ、外に出すなら0にします。
タブとスペースを混ぜた場合は TabError: inconsistent use of tabs and spaces in indentation になります。エディタの設定で「タブキーでスペース4つを入力する」にしておくと、この種類のエラーは起きにくくなります。
=と==の取り違え
= は代入、== は比較です。条件式に = を書くとSyntaxErrorになります。
score = 72
if score = 72:
print("72点です")
File "e05.py", line 2
if score = 72:
^^^^^^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
Pythonが「== か := のまちがいではありませんか」と教えてくれます。値を比べたいので if score == 72: に直します。
| 記号 | 意味 | 例 |
|---|---|---|
= |
代入(変数に値を入れる) | score = 72 |
== |
比較(等しいか調べる) | if score == 72: |
:= |
代入しながらその値を使う(セイウチ演算子、Python 3.8以降) | if (n := len(data)) >= 3: |
>= を => と書いた場合は、ヒントなしの SyntaxError: invalid syntax になります。「不等号が先、イコールが後」(>=、<=、!=)と覚えておくと安心です。
elseのあとにelifを書いた
score = 72
if score >= 80:
print("優")
else:
print("再挑戦")
elif score >= 60:
print("合格")
File "e07.py", line 6
elif score >= 60:
^^^^
SyntaxError: 'elif' block follows an 'else' block
else は必ず最後に書きます。elif を else の前に移すと直ります。
エラーにならないが結果が意図とちがう書き方
エラーメッセージが出ないぶん、気づきにくい書き方を2つ紹介します。
answer = "no"
# 直す前: (answer == "yes") or "y" と解釈される。"y" は空でない文字列なので常にTrue
if answer == "yes" or "y":
print("直す前: 実行される(意図とちがう)")
# 直した後
if answer == "yes" or answer == "y":
print("ここは実行されない")
if answer in ("yes", "y"):
print("ここも実行されない")
print("直した後: no は条件に当てはまらない")
# 小数の比較
print(0.1 + 0.2 == 0.3)
print(0.1 + 0.2)
import math
print(math.isclose(0.1 + 0.2, 0.3))
直す前: 実行される(意図とちがう)
直した後: no は条件に当てはまらない
False
0.30000000000000004
True
| 書き方 | 起きること | こう書くとよい |
|---|---|---|
if x == "yes" or "y": |
"y" が単独で評価され、常にTrue |
if x in ("yes", "y"): |
if 0.1 + 0.2 == 0.3: |
小数の誤差でFalse | math.isclose(a, b) で比べる |
if x == None: |
動くが、Noneの判定としては is が標準的 |
if x is None: |
if flag == True: |
動くが冗長 | if flag: |
1つ目は、日本語の「yesまたはy」をそのまま式にした形です。orの左右には、それぞれ完結した条件式を書くことを意識すると防げます。
知っておくと便利な書き方
data = [3, 8, 1]
if (n := len(data)) >= 3:
print(f"要素が{n}個あります")
x = 5
if x > 3: print("1行でも書ける(短い処理だけにする)")
if x > 100:
pass # あとで書く場所には pass を置く
print("pass は何もしない")
要素が3個あります
1行でも書ける(短い処理だけにする)
pass は何もしない
- セイウチ演算子
:=は、条件式の中で変数に代入し、その値をブロックの中でも使えるようにします。 - 処理が1つだけなら
if 条件: 処理と1行に書けますが、通常は改行して字下げするほうが読みやすくなります。 passは「何もしない」文です。ブロックを空にできないPythonで、場所だけ先に作っておくときに使います。
if文を書いたあとのチェックリスト
| 確認すること | 見るポイント |
|---|---|
| コロンを付けたか | if・elif・else の行末に : があるか |
| 字下げがそろっているか | 同じブロックはスペース4つでそろっているか。タブが混ざっていないか |
== を使っているか |
条件式の中に = が1つだけの箇所がないか |
| elifの順番 | 範囲の狭い条件から書いているか |
| 型がそろっているか | 文字列と数値を比べていないか(input() の値は int() で変換) |
| orの左右が完結しているか | x == 1 or 2 のような書き方になっていないか |
| Noneの判定 | is None / is not None を使っているか |
| andとorの混在 | かっこで意図を示しているか |
よくある質問
Q. elifとelseは必ず書く必要がありますか?
A. どちらも省略できます。if だけでも動きます。elif は何個でも書けますが、else は最後に1つだけです。「どれにも当てはまらないときは何もしない」のであれば、else を書かない形で問題ありません。
Q. if x: と if x is not None: はどうちがいますか?
A. if x: は、xが 0、空文字、空リストなどのときもブロックを実行しません。if x is not None: は、xがNone以外であれば 0 や空文字でも実行します。「0も有効な値」として扱いたいときは is not None を使います。
Q. andとorはどちらが先に評価されますか?
A. andが先です。A or B and C は A or (B and C) と解釈されます。順番を変えたいとき、または読む人に意図を伝えたいときは、かっこを付けます。
Q. Pythonにswitch文はありますか?
A. switchという名前の文はありません。if・elif・elseで書くか、Python 3.10以降であればmatch文が使えます。値と結果が1対1で対応するだけなら、辞書の get() も簡潔です。
まとめ
- if文は
if 条件式:のあとに字下げしたブロックを書く。elifは何個でも、elseは最後に1つだけ - 上から順に判定し、最初に当てはまった1つだけ実行される。elifは範囲の狭い条件から書く
- 優先順位は「比較 → not → and → or」。andとorを混ぜるときはかっこで意図を示す
- andとorは短絡評価。左側で結果が決まれば右側は評価されず、返すのは最後に評価した値
- Falseと見なされるのは None・False・数値のゼロ・空のコレクション。
"0"や[0]はTrue - 範囲は
0 <= x < 10、候補はin、Noneはis Noneで書くと短く正確になる - コロン忘れは
expected ':'、字下げはIndentationError、=は「Maybe you meant '=='」。メッセージの行番号と^の位置を見れば直せる
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Python if文の書き方|elif・elseとand・or・notの条件式」
株式会社RJCでは、Pythonのif文と条件式の書き方を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。