- Python
Python三項演算子の書き方|if elseを1行で書く条件式と内包表記
Pythonの三項演算子とは、「A if 条件 else B」の形で、条件が真なら A、偽なら B を返す式です。 正式には条件式(conditional expression)と呼ばれます。if 文と違って「値を返す式」なので、代入の右辺・関数の引数・内包表記・lambda・f文字列の中にそのまま書けます。
この記事では、他言語の「条件 ? A : B」との並び順の違いを対比表で示し、elif 相当のネスト、内包表記での2種類の if、lambda・f文字列・引数の既定値での使い方を並べます。else を省いた時などの SyntaxError は実際のメッセージで再現し、足し算と組み合わせた時に結果が変わる例も載せました。出力はすべて Python 3.11.15 で実行したものです。
Python三項演算子の早見表
| やりたいこと | 書き方 | 結果(例) |
|---|---|---|
| 条件で値を切り替える | "成人" if age >= 18 else "未成年" |
age=20 で 成人 |
| 変数に代入する | label = "大" if x > 3 else "小" |
x=5 で 大 |
| elif 相当(3つ以上に分ける) | "A" if s >= 90 else "B" if s >= 70 else "C" |
s=75 で B |
| 内包表記で値を切り替える | [n * 10 if n % 2 == 0 else n for n in nums] |
[1, 20, 3, 40, 5, 60] |
| 内包表記で要素を絞り込む | [n for n in nums if n % 2 == 0] |
[2, 4, 6] |
| lambda の中で分ける | lambda v: "正" if v > 0 else "負" |
― |
| f文字列の中で分ける | f"{count} item{'s' if count != 1 else ''}" |
3 items |
| None の時だけ既定値にする | name if name is not None else "ゲスト" |
ゲスト |
| 計算式の一部に使う | 1 + (10 if x > 3 else 20) |
かっこで囲む |
| 関数を選んで呼ぶ | (max if flag else min)(3, 8) |
flag=False で 3 |
覚えておく規則は3つです。
- 並びは「真の時の値 if 条件 else 偽の時の値」(条件が真ん中)
- else は省けない(省くと SyntaxError)
- A と B に書けるのは式だけ(代入文・return・pass などの文は書けない)
確認した環境
出力は Python 3.11.15 で実行して得たものです。SyntaxError のうち主要な4つ(else の省略、式の中の代入、内包表記での2例)と、f文字列の中で同じ種類のクォートを使う書き方は、Python 3.14.7 でも実行して結果を添えています。他言語との対比表は一般的な構文として載せたもので、JavaScript(Node.js 22.22.2)だけ手元で実行しました。
他言語の「条件 ? A : B」との並び順の違い
C・Java・JavaScript などを先に学んだ人は、まず並び順の違いを押さえると読み書きが楽になります。
| 言語 | 書き方 | 条件の位置 |
|---|---|---|
| Python | a if cond else b |
真ん中 |
| JavaScript / TypeScript | cond ? a : b |
先頭 |
| Java / C / C++ / C# | cond ? a : b |
先頭 |
| PHP / Ruby | cond ? a : b |
先頭 |
同じ処理を2つの言語で並べます。
// JavaScript
const age = 20;
console.log(age >= 18 ? "成人" : "未成年");
# Python
age = 20
print("成人" if age >= 18 else "未成年")
どちらも実行結果は次のとおりです。
成人
Python で「?」と「:」の形を書くと、次のように止まります。
x = 5; label = x > 3 ? "大" : "小"
File "se5.py", line 1
x = 5; label = x > 3 ? "大" : "小"
^
SyntaxError: invalid syntax
Python の条件式は英語の語順で読めます。 「"成人" if age >= 18 else "未成年"」は「age が 18 以上なら "成人"、そうでなければ "未成年"」とそのまま読み下せます。真の時の値が先頭に来るため、「ふつうはこの値、例外的に別の値」という場面で特に読みやすくなります。
基本の書き方:if文との対応
if 文で書いた4行と、条件式で書いた1行は同じ動きをします。
age = 20
# if 文
if age >= 18:
label = "成人"
else:
label = "未成年"
# 条件式(三項演算子)
label = "成人" if age >= 18 else "未成年"
print(label)
実行結果:
成人
対応関係は次のとおりです。
| if 文の部分 | 条件式での位置 |
|---|---|
| if の条件 | 真ん中(if の直後) |
| 条件が真の時に代入する値 | 先頭 |
| else の時に代入する値 | 末尾(else の直後) |
評価されるのは選ばれた側だけ
条件式は、選ばれなかった側を評価しません。
def left():
print(" left を評価")
return "L"
def right():
print(" right を評価")
return "R"
print(left() if True else right())
print(left() if False else right())
実行結果:
left を評価
L
right を評価
R
この性質のおかげで、「条件を満たす時だけ安全に実行できる式」を書けます。
| 書き方 | 結果 | 守っていること |
|---|---|---|
lst[0] if lst else None(lst は空リスト) |
None |
空リストへの添字アクセス |
d["k"] if "k" in d else "なし"(d は空の辞書) |
なし |
存在しないキーの参照 |
10 / n if n != 0 else 0(n は 0) |
0 |
0 での割り算 |
elif相当:条件式をつなげて3つ以上に分ける
else の後ろにもう1つ条件式を書くと、elif に相当する分岐になります。
for s in (95, 75, 55, 30):
grade = "A" if s >= 90 else "B" if s >= 70 else "C" if s >= 50 else "D"
print(s, grade)
実行結果:
95 A
75 B
55 C
30 D
条件式は右から結び付きます。つまり上の式は "A" if s >= 90 else ("B" if s >= 70 else ("C" if ...)) と同じ意味で、先頭の条件から順に判定されます。
3つ以上をつなぐ時は、かっこで囲んで条件ごとに改行すると、if / elif の形に近づいて読みやすくなります。
score = 75
grade = (
"A" if score >= 90 else
"B" if score >= 70 else
"C" if score >= 50 else
"D"
)
print(grade)
実行結果:
B
なお、条件式の中に elif と書くことはできません。
x = 5; label = "大" if x > 3 else "中" elif x > 1 else "小"
SyntaxError: invalid syntax
分岐が増えてきたら、関数に切り出して if / elif で書くか、後半の「辞書」「match 文」への置き換えを検討します。目安として、条件式のネストは2段(分岐3つ)までにとどめると読み手に優しくなります。
内包表記の中のif else:前に置くifと後ろに置くifの違い
内包表記には if の置き場所が2つあり、役割が違います。ここがもっとも混乱しやすい点です。
| 置き場所 | 形 | 役割 | else | 要素数 |
|---|---|---|---|---|
| for の前 | [A if 条件 else B for x in xs] |
値を切り替える(条件式) | 必須 | 変わらない |
| for の後ろ | [A for x in xs if 条件] |
要素を絞り込む(フィルタ) | 書けない | 減る |
nums = [1, 2, 3, 4, 5, 6]
# for の前:値を切り替える(偶数だけ10倍、奇数はそのまま)
print([n * 10 if n % 2 == 0 else n for n in nums])
# for の後ろ:絞り込む(偶数だけ残す)
print([n for n in nums if n % 2 == 0])
# 両方:偶数だけ残し、そのうち3の倍数は10倍
print([n * 10 if n % 3 == 0 else n for n in nums if n % 2 == 0])
実行結果:
[1, 20, 3, 40, 5, 60]
[2, 4, 6]
[2, 4, 60]
for の前の「A if 条件 else B」は条件式そのもので、内包表記の特別な構文ではありません。 「各要素に対して作る値」を書く場所に、たまたま条件式を置いているだけです。一方、for の後ろの if は内包表記の構文で、else を持ちません。
置き場所を取り違えると、次のように止まります。
nums = [1, 2, 3]; print([n if n > 1 for n in nums])
File "se7.py", line 1
nums = [1, 2, 3]; print([n if n > 1 for n in nums])
^^^^^^^^^^
SyntaxError: expected 'else' after 'if' expression
nums = [1, 2, 3]; print([n for n in nums if n > 1 else 0])
File "se8.py", line 1
nums = [1, 2, 3]; print([n for n in nums if n > 1 else 0])
^^^^
SyntaxError: invalid syntax
| やりたいこと | 直し方 |
|---|---|
| 条件に合うものだけ残したい | if を for の後ろへ:[n for n in nums if n > 1] |
| 条件に合わないものは別の値にしたい | if else を for の前へ:[n if n > 1 else 0 for n in nums] |
辞書・集合の内包表記やジェネレータ式でも同じ規則です。
nums = [1, 2, 3, 4, 5, 6]
print({n: "偶数" if n % 2 == 0 else "奇数" for n in nums[:4]})
print({n if n > 3 else 0 for n in nums})
print(list(n if n > 3 else 0 for n in nums))
実行結果:
{1: '奇数', 2: '偶数', 3: '奇数', 4: '偶数'}
{0, 4, 5, 6}
[0, 0, 0, 4, 5, 6]
lambda・f文字列・引数の既定値での使い方
lambdaの中で使う
lambda の本体には式しか書けないため、分岐したい時は条件式を使います。
sign = lambda v: "正" if v > 0 else "負" if v < 0 else "ゼロ"
print(sign(3), sign(-2), sign(0))
words = ["b", "A", "c"]
print(sorted(words, key=lambda s: s.lower() if s.isupper() else s))
実行結果:
正 負 ゼロ
['A', 'b', 'c']
lambda v: A if 条件 else B は、条件式全体が lambda の本体になります(lambda のほうが結び付きが弱いため)。名前を付けて使い回すなら、def で書いたほうがエラー時の表示に関数名が出て追いやすくなります。
def kind(n):
return "偶数" if n % 2 == 0 else "奇数"
print(kind(4), kind(7))
偶数 奇数
f文字列の中で使う
波かっこの中に条件式をそのまま書けます。
count = 1
print(f"{count} item{'s' if count != 1 else ''}")
count = 3
print(f"{count} item{'s' if count != 1 else ''}")
price = None
print(f"価格: {price if price is not None else '未設定'}")
v = 1234.5
print(f"{v:,.0f}円" if v >= 1000 else f"{v}円")
実行結果:
1 item
3 items
価格: 未設定
1,234円
f文字列の外側と内側でクォートの種類を変えるのがポイントです。外側がダブルクォートなら、中の文字列はシングルクォートにします。同じ種類を使うと、Python 3.11 では次のように止まります。
x = 5; print(f"{"大" if x > 3 else "小"}")
File "se14.py", line 1
x = 5; print(f"{"大" if x > 3 else "小"}")
^
SyntaxError: f-string: expecting '}'
同じコードを Python 3.14.7 で実行すると「大」と表示されました。新しい版では通りますが、3.11 以前でも動かすコードではクォートを使い分けておくと安心です。
引数の既定値を決める時に使う
「引数が省略されたら(None なら)既定値にする」という処理は、条件式の定番の使いどころです。
def greet(name=None, polite=True):
name = name if name is not None else "ゲスト"
return f"{name}さん、こんにちは" if polite else f"やあ、{name}"
print(greet())
print(greet("佐藤", polite=False))
def add_item(item, bucket=None):
bucket = [] if bucket is None else bucket
bucket.append(item)
return bucket
print(add_item("a"), add_item("b"))
実行結果:
ゲストさん、こんにちは
やあ、佐藤
['a'] ['b']
add_item では、既定値を None にしておき、関数の中で空リストを作っています。呼び出すたびに新しいリストになるので、2回の呼び出しが別々の結果になりました。
SyntaxErrorになる書き方と直し方
実際に実行して得たメッセージを一覧にします(Python 3.11.15)。
| 書いたコード | メッセージ | 直し方 |
|---|---|---|
label = "大" if x > 3 |
SyntaxError: expected 'else' after 'if' expression | else を付ける。値が不要なら if 文で書く |
y = 1 if x > 3 else y = 2 |
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? | y = 1 if x > 3 else 2 と、代入は左端に1つだけ |
label = if x > 3: "大" else: "小" |
SyntaxError: invalid syntax | if 文の形は代入の右辺に書けない。値を先頭に置く |
label = x > 3 ? "大" : "小" |
SyntaxError: invalid syntax | "大" if x > 3 else "小" |
print("大") if x > 3 else pass |
SyntaxError: invalid syntax | pass は文なので書けない。if 文で書く |
"大" if x > 3 else "中" elif x > 1 else "小" |
SyntaxError: invalid syntax | elif の代わりに else の後ろへ条件式を続ける |
"a" if x > 3 else return |
SyntaxError: invalid syntax | return "a" if x > 3 else None と return を先頭に |
return "大" if x > 3 else raise ValueError("小") |
SyntaxError: invalid syntax | raise は文。if 文で先に raise する |
(a if True else b) = 1 |
SyntaxError: cannot assign to conditional expression here. Maybe you meant '==' instead of '='? | 条件式は代入の左辺に置けない |
もっとも多い2つを詳しく見ます。
elseを省いた時
x = 5; label = "大" if x > 3
File "se1.py", line 1
x = 5; label = "大" if x > 3
^^^^^^^^^^^^
SyntaxError: expected 'else' after 'if' expression
条件式は必ず値を返す式なので、偽の時の値も必要です。「条件を満たす時だけ代入したい」なら、条件式ではなく if 文の出番です。
# 直し方A:偽の時の値を決める
label = "大" if x > 3 else ""
# 直し方B:満たす時だけ代入する(if 文を1行で)
if x > 3: label = "大"
式の中で代入した時
x = 5; y = 1 if x > 3 else y = 2
File "se3.py", line 1
x = 5; y = 1 if x > 3 else y = 2
^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
A と B の位置に書けるのは値(式)だけで、「y = 2」のような代入文は書けません。if 文の2行をそのまま1行に詰める発想ではなく、「代入する値を選ぶ」と考えて、代入を左端に1つだけ書きます。
y = 1 if x > 3 else 2
メッセージが案内している「:=」(セイウチ演算子)は式の中で使える代入で、かっこで囲めば条件式の中にも書けます。
import re
print(m.group() if (m := re.search(r"\d+", "注文 42 件")) else "なし")
42
条件の部分で値を受け取り、真の側で使う形です。読み手が慣れていない場合は、2行に分けたほうが伝わりやすくなります。
優先順位:かっこが必要になる場面
条件式は、ほとんどの演算子より結び付きが弱い(優先順位が低い)式です。足し算や文字列の連結と組み合わせると、思った範囲と違う範囲が A や B になります。
足し算と組み合わせた時の結果の差
x = 5
print(1 + (10 if x > 3 else 20))
print(1 + 10 if x > 3 else 20)
x = 1
print(1 + (10 if x > 3 else 20))
print(1 + 10 if x > 3 else 20)
実行結果:
11
11
21
20
x=5 の時はどちらも 11 ですが、x=1 の時は 21 と 20 で結果が分かれます。 かっこなしの式は「(1 + 10) if x > 3 else 20」と解釈され、偽の時は 1 が足されません。条件が真の時だけテストしていると気づけない差です。
文字列の連結でも同じことが起きます。
x = 1
print("値:" + "大" if x > 3 else "小")
print("値:" + ("大" if x > 3 else "小"))
実行結果:
小
値:小
結び付きの強さの一覧
| 組み合わせ | かっこなしの解釈 | 実行結果 |
|---|---|---|
1 + 10 if x > 3 else 20 |
(1 + 10) if x > 3 else 20 |
x=1 で 20 |
x * 2 if x > 3 else x + 100 |
(x * 2) if (x > 3) else (x + 100) |
x=5 で 10 |
"A" if x > 3 and x % 2 == 1 else "B" |
and は条件の一部になる | x=5 で A |
not True if False else "else側" |
(not True) if False else "else側" |
else側 |
a = 1, 2 if x > 3 else 3 |
a = (1, (2 if x > 3 else 3)) |
x=1 で (1, 3)、x=5 で (1, 2) |
lambda: 1 if x > 3 else 2 |
lambda: (1 if x > 3 else 2) |
x=5 で 1 |
整理すると、条件式より結び付きが弱いのは、lambda・カンマ・代入などごく一部です。算術演算・比較・and / or / not はすべて条件式より先に結び付きます。
かっこを付ける目安は次のとおりです。
| 場面 | かっこ |
|---|---|
| 代入の右辺が条件式だけ | 不要 |
| 関数の引数が条件式だけ | 不要 |
| 条件式の結果に演算(+、文字列連結、メソッド呼び出しなど)を続ける | 必要 |
| タプルやリストの要素として書く | 付けると読みやすい |
| ネストした条件式 | 付けるか、改行して縦に並べる |
and/or・辞書・match文との使い分け
以前よく使われたand/orの書き方
条件式が言語に入る前は、「条件 and A or B」という書き方で同じことを表していました。この書き方は、A が偽とみなされる値(空文字、0、空リストなど)の時に B が返るという性質があります。
flag = True
print(flag and "yes" or "no")
print(repr(flag and "" or "no"))
print(repr("" if flag else "no"))
print(flag and 0 or 99, 0 if flag else 99)
実行結果:
yes
'no'
''
99 0
flag が True なのに、A が空文字や 0 だと and/or の形では B 側('no'、99)が返りました。条件式なら A の中身に関係なく、条件だけで決まります。 新しく書くコードでは条件式を使うと意図がそのまま伝わります。
一方、or だけを使った「値が空なら既定値」という書き方は、今も広く使われる短い書き方です。
name = ""
n = 0
items = []
print(name or "名無し", n or 10, items or ["既定"])
print(n if n is not None else 10)
実行結果:
名無し 10 ['既定']
0
or は「0 や空文字も既定値に置き換える」、条件式の is not None は「None の時だけ置き換える」 という違いがあります。0 が意味のある値(個数 0 など)なら条件式を選びます。
辞書で置き換える
「値 A なら X、値 B なら Y」という対応表の形をした分岐は、辞書にすると追加や変更が1行で済みます。
status = 404
msg = {200: "OK", 404: "Not Found", 500: "Server Error"}.get(status, "Unknown")
print(msg)
score = 75
table = {True: "合格", False: "不合格"}
print(table[score >= 60])
実行結果:
Not Found
合格
match文で置き換える
Python 3.10 以降の match 文は、値のパターンで分ける時に向いています。文なので代入の右辺には書けず、関数に入れて使います。
def label(code):
match code:
case 200 | 201:
return "成功"
case 404:
return "見つからない"
case _ if code >= 500:
return "サーバー側"
case _:
return "その他"
print([label(c) for c in (200, 404, 503, 302)])
実行結果:
['成功', '見つからない', 'サーバー側', 'その他']
使い分けの表
| 書き方 | 向いている場面 | 気を付ける点 |
|---|---|---|
条件式 A if 条件 else B |
2択で値を決める。内包表記・lambda・f文字列の中 | 3段以上のネストは読みにくくなる |
| if / else 文 | 処理が複数行ある。副作用(表示・保存など)がある。else が要らない | 値を返す式としては使えない |
| if / elif / else 文 | 分岐が3つ以上で、条件がそれぞれ違う形 | ― |
x or 既定値 |
空文字・0・None・空リストをまとめて既定値にしたい | 0 や空文字が有効な値なら使わない |
条件 and A or B |
既存コードを読む時の知識として | A が偽とみなされる値だと B になる |
| 辞書 + get() | 値と値の対応表になっている分岐 | 範囲(以上・未満)の判定には使いにくい |
| match 文 | 値や構造のパターンで分ける(3.10 以降) | 文なので、式の中には書けない |
max() / min() / abs() |
上限・下限・絶対値 | max(0, -5) は 0、min(100, 120) は 100、abs(-3) は 3 |
最後の行のように、条件式で書けるものの中には組み込み関数のほうが短く正確に書けるものがあります。x if x > 0 else 0 は max(x, 0)、-x if x < 0 else x は abs(x) で表せます。
避けたい使い方:副作用だけの条件式
x = 5
print("大") if x > 3 else print("小")
この書き方は動きますが、条件式の値(print の戻り値 None)を捨てています。実行すると「大」と表示されます。値を使わない処理の分岐は if 文で書くと、「ここは値ではなく処理を分けている」と一目で伝わります。
if x > 3:
print("大")
else:
print("小")
また、タプルの添字で選ぶ ("偽", "真")[条件] という書き方もあります。
print(("偽", "真")[True], ("no", "yes")[5 > 3])
try:
print((1 / 0, "ok")[True])
except ZeroDivisionError as e:
print("ZeroDivisionError:", e)
実行結果:
真 yes
ZeroDivisionError: division by zero
こちらは両方の値を先に評価するため、選ばれない側でも例外が起きます。条件式は選ばれた側だけを評価するので、安全に書けます。
場面別のコピペ集
条件式がよく使われる場面を、実行結果つきで並べます。
returnでそのまま返す
def discount_rate(member, total):
return 0.1 if member and total >= 5000 else 0.0
print(discount_rate(True, 6000), discount_rate(True, 3000), discount_rate(False, 9000))
0.1 0.0 0.0
関数の引数や辞書の値に書く
stock = 0
print("在庫あり" if stock > 0 else "在庫なし")
user = {"name": "佐藤", "age": 17}
row = {"name": user["name"], "group": "一般" if user["age"] >= 18 else "ジュニア"}
print(row)
在庫なし
{'name': '佐藤', 'group': 'ジュニア'}
文字列の末尾を条件で足す
names = ["佐藤", "鈴木", "高橋", "田中"]
print(", ".join(names[:3]) + (" ほか" if len(names) > 3 else ""))
佐藤, 鈴木, 高橋 ほか
連結の一部として使うので、条件式をかっこで囲んでいます。
範囲の判定と、全件の判定
t = 25
print("適温" if 18 <= t <= 28 else "調整が必要")
tasks = [{"done": True}, {"done": False}]
print("完了" if all(x["done"] for x in tasks) else "作業中")
適温
作業中
Python では 18 <= t <= 28 のように比較をつなげて書けます。all() や any() と組み合わせると、「全部そろったら」「1つでもあれば」という条件を1行で表せます。
合計や件数を条件付きで数える
nums = [1, 2, 3, 4, 5, 6]
print(sum(n if n % 2 == 0 else 0 for n in nums), sum(n for n in nums if n % 2 == 0))
print(sum(1 for n in nums if n > 3))
12 12
3
1行目の2つは同じ結果(12)です。「合わないものを 0 として足す」より「合うものだけ足す」ほうが短く、意図も伝わりやすいので、集計では for の後ろの if が向いています。
条件式を使わなくてよい形
| 書いたコード | 短く書ける形 | 結果 |
|---|---|---|
True if 5 > 3 else False |
5 > 3 |
True |
True if [] else False |
bool([]) |
False |
sorted(xs, reverse=True if desc else False) |
sorted(xs, reverse=desc) |
同じ並び |
100 if v > 100 else 0 if v < 0 else v |
max(0, min(100, v)) |
v=130 で 100 |
比較の結果はそれ自体が True / False なので、条件式で包む必要はありません。
読みやすく書き直す:直す前と後
条件式を重ねすぎたコードを、辞書と変数に分けて整理する例です。
直す前:
def before(user):
return ("管理者" if user["role"] == "admin" else "編集者" if user["role"] == "editor" else "閲覧者") + ("(停止中)" if not user["active"] else "")
直した後:
ROLE_NAMES = {"admin": "管理者", "editor": "編集者"}
def after(user):
role = ROLE_NAMES.get(user["role"], "閲覧者")
suffix = "" if user["active"] else "(停止中)"
return role + suffix
3人分のデータで両方を呼んだ結果(左が直す前、右が直した後):
users = (
{"role": "admin", "active": True},
{"role": "editor", "active": False},
{"role": "guest", "active": True},
)
for u in users:
print(before(u), "|", after(u))
管理者 | 管理者
編集者(停止中) | 編集者(停止中)
閲覧者 | 閲覧者
結果は同じまま、次の3点が変わりました。
| 直した点 | 効果 |
|---|---|
| 役割名の対応を辞書に移した | 役割が増えても辞書に1行足すだけで済む |
| 条件式に名前(suffix)を付けた | 何を決めている式なのかが変数名で伝わる |
not を外して真と偽の値を入れ替えた |
「active なら空、そうでなければ停止中」と肯定形で読める |
条件式は「短い2択」に使い、長くなったら名前を付けて分けると、1行の短さと読みやすさを両立できます。
条件式で書くかif文で書くかのチェックリスト
- [ ] 2つの「値」のどちらかを選ぶ処理になっている(処理の分岐ではない)
- [ ] 1行が長くなりすぎない(目安として80〜100文字以内)
- [ ] ネストは2段までに収まっている
- [ ] 条件式の結果に演算を続ける箇所は、かっこで囲んである
- [ ] 偽の側の条件でも実行して結果を確かめた
- [ ] 内包表記では、絞り込み(for の後ろ)と値の切り替え(for の前)を取り違えていない
- [ ] 「None の時だけ」なのか「空や0も含めて」なのかを決めて、is not None と or を選んだ
よくある質問
Q. else なしで1行に書く方法はありますか?
A. 条件式では else を省けません。条件を満たす時だけ処理したいなら、if x > 3: label = "大" のように if 文を1行で書けます。内包表記で「条件に合うものだけ残す」なら、for の後ろに if を置きます(こちらは else なし)。
Q. 条件式と if 文で速さは変わりますか? A. どちらも「条件を判定して、片方へ進む」という同じ流れに変換されます。条件式で書いた関数を dis モジュールで見ると、比較のあと条件ジャンプが1回あり、選ばれた側の値だけを読み込んでいました。速さより、読みやすさで選ぶのがおすすめです。
Q. A と B で型が違っても大丈夫ですか?
A. 文法上は問題なく、1 if cond else "a" も動きます。ただ、受け取る側が型ごとに処理を分ける必要が出てくるので、同じ型にそろえるか、「値がない」ことを None で表すと扱いやすくなります。
Q. 「三項演算子」と「条件式」はどちらが正しい呼び方ですか? A. Python の用語としては条件式(conditional expression)です。3つの項(A・条件・B)を取ることから、他言語にならって三項演算子とも呼ばれています。検索や会話ではどちらでも通じます。
まとめ
- 書き方は「A if 条件 else B」。 他言語の「条件 ? A : B」と違い、条件が真ん中に来る
- else は省けず、A と B に書けるのは式だけ。 代入・return・pass・raise を書くと SyntaxError になる
- elif 相当は else の後ろに条件式を続ける。 3つ以上はかっこで囲んで改行すると読みやすい
- 内包表記では、for の前の if else が値の切り替え、for の後ろの if が絞り込み
- 条件式は結び付きが弱い。
1 + 10 if x > 3 else 20は x=1 で 20 になるので、演算と組み合わせる時はかっこで囲む - and/or の形は A が空や0だと B になる。 None の時だけ既定値にしたいなら is not None の条件式を使う
- 対応表の形なら辞書、パターンで分けるなら match 文、処理を分けるなら if 文 と使い分ける
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。