このガイドでは、Python で三項演算子の使用方法を説明します。構文を学習し、いくつかの例をコーディングして、その仕組みを理解します。
まず、if-else 条件文がどのように機能するかを確認し、次に三項演算子を使用して同等の式を作成する方法を学びます。
次に、いくつかの例をコーディングし、Python タプルと辞書を使用して Python の三項演算子の動作をエミュレートする方法を学びます。最後に、三項演算子の使用を推奨するいくつかのユースケースを確認します。
さぁ、始めよう!
Python の If-Else ステートメント: レビュー
Python REPL を開始するか、 のオンライン Python エディターでコーディングを行うことができます。
Python の if-else ステートメントの一般的な構文は次のとおりです。
if condition:
# do this
else:
# do this
上記のスニペットでは、
condition
チェックされる条件を示します。条件が
True
と評価されると、 if ブロックがトリガーされます。条件が
False
と評価された場合、else ブロック内のステートメントが実行されます。
以下は、
energy
の値がゼロ以下かどうかに応じて、
game_over
変数にブール値が割り当てられる例です。
-
energy <= 0
の場合、game_over
はTrue
です。 -
それ以外の場合、
game_over
は False です。
次のコード スニペットは、if-else 条件文を使用してこれを行う方法を示しています。
energy = -1
if energy <= 0:
game_over = True
else:
game_over = False
print(game_over)
# True
この例では、
energy
は -1 で、0 より小さいため、
game_over
は True になります。
Python 三項演算子: 構文と例
Python には、C や C++ などの言語の 三項条件演算子 とよく似た動作をする三項演算子があります。これを使用するための一般的な構文は次のとおりです。
expression1 if condition else expression2
上記の構文を解析してみましょう。
-
condition
: チェックする条件。 -
expression1
: 条件が True かどうかを評価する式。 -
expression2
: 条件が False かどうかを評価する式。
ここで、コードの if-else バージョンから、
expression1
、
expression2
、および
condition
がどのようなものであるべきかを特定します。
これらをすべてまとめると、Python の三項演算子を使用すると次のようになります。
game_over = True if energy <= 0 else False
print(game_over)
# True
別の例をコーディングしてみましょう。あなたが書店を経営しており、過去 1 年間に読者があなたの店を訪れた頻度に応じて、読者に購入の割引を提供するとします。
numVisits
訪問数を表すものとします。
-
numVisits > 7
の場合、割引率、discount_perc
は 20 です。 -
それ以外の場合、
discount_perc
5 です。
三項演算子を使用して、
discount_perc
変数に値を割り当てます。
numVisits = 10
discount_perc = 20 if numVisits > 7 else 5
print(discount_perc)
# 20 (as numVisits = 10 which is > 7)
次に、Python タプルと辞書を使用して三項演算子をエミュレートする方法を学びます。
Python タプルを使用した三項演算子のエミュレーション
Python のすべてのイテラブルと同様に、タプルはゼロ インデックスに従います。したがって、タプルに 2 つの要素がある場合、
tuple_name[0]
タプルの最初の要素を示し、
tuple_name[1]
タプルの 2 番目の要素を示します。
Python の基本的なデータ型は、整数、浮動小数点数、文字列、およびブール値です。 Python は、特定のデータ型を別のデータ型の同等の表現で表現できる型キャストをサポートしています。
Python REPL を開始し、次の例を実行します。整数をブール値に変換しようとすると、次のことに気づくでしょう。
-
bool(0)
False
です。 -
bool(<any non-zero integer>)
True
を返します。
>>> bool(0)
False
>>> bool(1)
True
>>> bool(-1)
True
>>> bool(10)
True
同様に、ブール値を整数にキャストすると、次のようになります。
>>> int(True)
1
>>> int(False)
0
型のキャストとインデックス付けをまとめると、次のようになります。
-
タプル内のインデックス 0 の要素:
condition
False
の場合に使用される値。 -
タプル内のインデックス 1 の要素:
condition
True
の場合に使用される値。
上記を使用すると、次のようになります。
>>> numVisits = 10
>>> discount_perc = (5,20)[numVisits > 7]
>>> discount_perc
# 20
ここで、
numVisits
10 であるため、条件
numVisits > 7
は
True
です
int(True)
が 1 であるため、
discount_perc
の値は 20 (インデックス 1 の要素) になります。
Python 辞書を使用した三項演算子のエミュレーション
辞書のキーとして
True
と
False
を設定できます。また
expression1
と
expression2
それぞれキー
True
と
False
に対応する値として設定できます。
some_dict = {True: expression1,
False: expression2
}
次に何をしますか?ここで、
some_dict[condition]
を使用すると、
condition
True
の場合、
True
キーに対応する
expression1
が評価されます。そして、
expression2
condition
False
の場合に評価されます。
discount_perc
の例を (もう一度) コーディングしましょう。ただし、今回は Python 辞書を使用します。
>>> numVisits = 10
>>> discount_dict = {True: 20, False:5}
>>> discount_perc = discount_dict[numVisits > 7]
>>> discount_perc
# 20
ここで、
numVisits = 10
は 7 より大きいです。したがって、条件
numVisits > 7
は
True
です。したがって、
discount_dict[numVisits > 7]
値 20 である
discount_dict[True]
と評価されます。
常に Python 三項演算子を使用する必要がありますか?
ここまでは、三項演算子の使用方法を学習しました。 しかし、常に三項演算子を使用する必要があるのでしょうか? まあ、三項演算子がすべてのユースケースにとって最良の選択であるとは限りません。このセクションでは、if-else ステートメントではなく三項演算子を使用する必要がある場合について詳しく説明します。また、三項演算子の代わりに if-else ステートメントの使用を検討する必要がある場合についても説明します。
If-Else ブロックよりも簡潔
前述したように、Python では、三項演算子の式は if-else ステートメントよりも簡潔です。したがって、これを使用して条件をチェックし、オンザフライで条件付きで式を評価できます。
次の例では、
nums
ランダムに生成された 100 個の整数のリストです。 100 個の数値のそれぞれについて、奇数か偶数かをチェックします。そして、この評価は f 文字列内でインラインで行われます。
import random
nums = [random.choice(range(100)) for i in range(10)]
for num in nums:
print(f"{num} is {'even' if num%2==0 else 'odd'}")
# sample output
0 is even
56 is even
6 is even
53 is odd
62 is even
7 is odd
8 is even
77 is odd
41 is odd
94 is even
三項演算子には Else 節が必要です
if-else 条件文を使用する場合、else 句はオプションです。例を挙げてみましょう。
energy
ゼロ以下の値に低下すると、
game_over
変数は
True
に設定されます。
ただし、
energy
がゼロより大きい場合、
game_over
変数は初期化されません。したがって、
game_over
変数にアクセスしようとするとエラーが発生します。
energy = 5
if energy <= 0:
game_over = True
print(f"Is the game over? {game_over}")
Traceback (most recent call last):
File "ternary_op.py", line 39, in <module>
print(f"Is the game over? {game_over}")
NameError: name 'game_over' is not defined
これを修正する 1 つの方法は、最初に
game_over
False
に設定し、エネルギー レベルが 0 以下の場合に
True
に更新することです。
energy = 5
game_over = False
if energy <= 0:
game_over1 = True
print(f"Is the game over? {game_over}")
ただし、上記と同等の Python 三項演算子を使用する場合、else 句はオプションではありません。三項演算子では、
condition
が
False
の場合に式を評価する必要があります。
game_over = True if energy <= 0 else False
else 部分を削除して上記のコードを
game_over = True if energy <= 0
に変更すると、次のような構文エラーが発生します。
File "ternary_op.py", line 42
game_over = True if energy <= 0
^
SyntaxError: invalid syntax
複数の条件を確認するには、If-Else ステートメントを使用します
例を考えてみましょう。コーディング面接の一連の質問のすべての質問には、関連付けられた難易度スコアがあります。このスコアに応じて、特定の質問に 3 つの難易度 (簡単、中、または難しい) のいずれかが割り当てられます。次のものがあると仮定します。
スコア | 難易度 |
10未満 | 簡単 |
10~20の間 | 中くらい |
20を超える | 難しい |
難易度スコアを考慮すると、次のように Python 三項演算子を使用して難易度レベルを取得できます。
score = 12
difficulty_level = "easy" if score < 10 else "hard" if score > 20 else "medium"
print(difficulty_level)
# medium
上記のコード ブロックの三項演算子の式は次の形式です。
expression1 if condition1 else expression2 if condition2 else expression3
簡潔ではありますが、読んで理解するのは少し難しいです。次の図は、この場合の制御フローがどのように発生するかを示しています。
次のコード スニペットは、if-else ステートメントを使用した同等の実装を示しています。ご覧のとおり、制御フローは非常に理解しやすくなり、コードも読みやすくなりました。
if score < 10:
difficulty_level="easy"
elif score > 20:
difficulty_level="hard"
else:
difficulty_level="medium"
print(difficulty_level)
したがって、複数の条件がある場合は、三項演算子の代わりに if-else ブロックを使用する必要があります。これにより、コードが読みやすく、理解しやすくなります。
また、条件が true か false に応じて複数のステートメントを実行する必要がある場合は、if-else ステートメントの使用を検討する必要があります。
結論
このチュートリアルで学んだ内容を要約します。
-
Python では、三項演算子は次の構文で使用できます:
expression1 if condition else expression2
。 - Python のタプルと辞書を使用して、三項演算子の動作をエミュレートできます。
- 三項演算子は if-else ブロックのより簡潔な代替手段になりますが、コードが読みやすいことを確認する必要があります。コードの読みやすさを向上させるために、特に複数の条件を連鎖させる必要がある場合には、三項演算子の代わりに if-else ステートメントを使用できます。
次に、Python の等価演算子と不等価演算子に関するチュートリアルを確認してください。