Pythonまたは演算子の使用方法
Pythonには、and
、or
、およびnot
の3つのブール演算子があります。 それらを使用して、条件をテストし、プログラムが実行する実行パスを決定できます。 このチュートリアルでは、Pythonのor
演算子とその使用方法について学習します。
このチュートリアルを終えると、次のことがわかります。
-
Python
or
演算子のしくみ -
ブールおよび非ブールコンテキストでPython
or
演算子を使用する方法 -
Pythonで
or
を使用して解決できるプログラミングの問題の種類 -
他の人がPython
or
演算子の特別な機能のいくつかを使用するときに、他の人のコードを読んでよりよく理解する方法
いくつかの実用的な例を作成して、Pythonのor
演算子の使用方法を学習します。 Pythonor
演算子が提供するすべての可能性を実際に使用していなくても、それを習得すると、より優れたコードを記述できるようになります。
Free Bonus:Click here to get access to a chapter from Python Tricks: The Bookは、Pythonのベストプラクティスと、より美しい+ Pythonicコードをすぐに適用できる簡単な例を示しています。
ブール論理
George Boole(1815–1864)は、現在Boolean algebraと呼ばれるものを開発しました。これは、コンピューターハードウェアとプログラミング言語の背後にあるデジタルロジックの基盤です。
ブール代数は、式とオブジェクトのtruth value(trueまたはfalse)を中心に構築され、ブール演算AND
、OR
、に基づいています。およびNOT
。 これらの操作は、論理演算子またはブール演算子を使用して実装されます。これにより、Boolean expressionsを作成できます。これは、trueまたはfalseと評価される式です。
ブール論理の助けを借りて、条件を評価し、それらの条件の真理値に応じて、プログラムが実行する操作を決定できます。 これはプログラミングの重要な基礎であり、プログラムの実行フローを決定するツールを提供します。
Pythonのブールロジックに関連するいくつかの基本概念を見てみましょう。
-
Booleanは、
True
またはFalse
のいずれかの値のタイプです。 Pythonでは、ブール型はbool
であり、これはint
のサブタイプです。 -
Boolean valuesは、Pythonの値
True
またはFalse
(大文字のTおよびF)です。 -
Boolean variableは、
True
またはFalse
のいずれかである変数です。 ブール変数は通常、特定の条件が存在するかどうかを示すためにflags
として使用されます。 -
Boolean expressionは、
True
またはFalse
のいずれかを返す式です。 -
Boolean contextは、
if
条件およびwhile
ループにすることができます。ここで、Pythonは、式がブール値に評価されることを期待します。 ブールコンテキストで事実上任意の式またはオブジェクトを使用でき、Pythonはその真理値を決定しようとします。 -
Operandsは、式(ブール式かどうか)に含まれ、演算子によって接続された部分式またはオブジェクトです。
-
Boolean or logical operatorsは、
AND
(論理AND
または接続詞)、OR
(論理OR
または論理和)、およびNOT
(論理NOT
)です。 sまたは否定)。 キーワードand
、or
、およびnot
は、これらの操作のPython演算子です。
ブール論理に関するより良いコンテキストが得られたので、Python固有のトピックをさらに進めましょう。
Pythonブール演算子
Pythonには、単純な英語の単語として入力される3つのブール演算子があります。
-
and
-
or
-
not
これらの演算子は、ブール式(およびオブジェクト)を接続して、複合ブール式を作成します。
Pythonブール演算子は、常に2つのブール式または2つのオブジェクト、あるいはそれらの組み合わせをとるため、binary operatorsと見なされます。
このチュートリアルでは、Pythonで論理OR
演算を実装する演算子であるPythonor
演算子について説明します。 仕組みと使用方法を学習します。
Pythonor
演算子のしくみ
ブールOR
演算子を使用すると、2つのブール式を1つの複合式に接続できます。 複合式が真であると見なされるためには、少なくとも1つの部分式が真である必要があり、それは重要ではありません。 両方の部分式が偽の場合、式は偽です。
これは、OR
演算子の背後にある一般的なロジックです。 ただし、次のセクションで説明するように、Pythonのor
演算子はこれ以上のことをすべて実行します。
ブール式でのor
の使用
Pythonor
演算子をコネクタとして使用してブール式を作成するには、2つの部分式が必要です。 or
を使用したブール式の基本的な構文は次のとおりです。
# Syntax for Boolean expression with or in Python
exp1 or exp2
部分式(exp1
またはexp2
)の少なくとも1つがTrue
と評価された場合、その式はTrue
と見なされます。 両方の部分式がFalse
と評価された場合、式はFalse
です。 この定義は、両方の可能性とどちらかを許可するため、inclusive orと呼ばれます。
Pythonor
の演算子の動作の概要は次のとおりです。
exp1 の結果 |
exp2 の結果 |
exp1 or exp2 の結果 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
表1。 論理Pythonor
演算子:真理値表
この表は、部分式の真理値に応じて、exp1 or exp2
などのブール式の結果の真理値をまとめたものです。
いくつかの実用的な例をコーディングして、Table 1で示される結果の真理値を説明しましょう。
>>>
>>> exp1 = 1 == 2
>>> exp1
False
>>> exp2 = 7 > 3
>>> exp2
True
>>> exp1 or exp2 # Return True, because exp2 is True
True
>>> exp2 or exp1 # Also returns True
True
>>> exp3 = 3 < 1
>>> exp1 or exp3 # Return False, because both are False
False
前の例では、部分式がTrue
と評価されると、グローバル結果はTrue
になります。 一方、両方の部分式がFalse
と評価された場合、グローバル結果もFalse
になります。
共通オブジェクトでのor
の使用
一般に、OR
演算を含む式のオペランドは、Table 1に示すようにブール値を持ち、結果として真理値を返す必要があります。 オブジェクトに関しては、Pythonはそれについてあまり厳密ではなく、オブジェクトがtrueまたはfalseと見なされるかどうかを決定する一連のルールを内部的に実装します。
デフォルトでは、オブジェクトは、そのクラスが
False
またはhttps://docs.python.org/3/reference/datamodel.html#object。%(を返すhttps://docs.python.org/3/reference/datamodel.html#object。bool [__bool__()
]メソッドを定義しない限り、trueと見なされます。オブジェクトで呼び出されたときにゼロを返すt5)s [__len__()
]メソッド。 これは、偽と見なされるほとんどの組み込みオブジェクトです。
falseと定義された定数:
None
およびFalse
。任意の数値型のゼロ:
0
、0.0
、0j
、Decimal(0)
、Fraction(0, 1)
空のシーケンスとコレクション:
''
、()
、[]
、{}
、set()
、range(0)
(Source)
or
演算に関係するオペランドがブール式ではなくオブジェクトである場合、Pythonor
演算子は、値True
またはFalse
ではなく、trueまたはfalseオブジェクトを返します。あなたは期待することができます。 このオブジェクトの真理値は、以前に見たルールに従って決定されます。
これは、Pythonがor
操作の結果をbool
オブジェクトに強制変換しないことを意味します。 Pythonでor
を使用して2つのオブジェクトをテストしている場合、演算子は、真理値に関係なく、trueと評価される最初のオブジェクトまたは式の最後のオブジェクトを返します。
>>>
>>> 2 or 3
2
>>> 5 or 0.0
5
>>> [] or 3
3
>>> 0 or {}
{}
最初の2つの例では、最初のオペランド(2
と5
)が真(ゼロ以外)であるため、Pythonのor
演算子は常に最初のオペランドを返します。
最後の2つの例では、左のオペランドはfalse(空のオブジェクト)です。 Pythonのor
演算子は、両方のオペランドを評価し、右側のオブジェクトを返します。オブジェクトは、trueまたはfalseのいずれかに評価されます。
Note:オブジェクトを含むブール式から値True
またはFalse
のいずれかを本当に取得する必要がある場合は、組み込み関数であるbool(obj)
を使用できます。これは、obj
の真理値に応じてTrue
またはFalse
を返します。
前のコードで示された動作を次のように要約できます。
左オブジェクト | 右のオブジェクト | x or y の結果 |
---|---|---|
|
|
|
表2 ブール式の代わりにオブジェクトをテストするときのPythonor
演算子の動作
つまり、Pythonのor
演算子は、真理値に関係なく、trueと評価される最初のオブジェクトまたは式の最後のオブジェクトを返します。
次のように、単一の式で複数の操作を連鎖させることにより、この動作を一般化できます。
a or b or c or d
この例では、Pythonのor
演算子は、最初に見つかった真のオペランド、または最後のオペランドを返します。 これは、Pythonでor
がどのように機能するかを覚えておくための経験則です。
ブール式とオブジェクトの混合
or
操作でブール式と一般的なPythonオブジェクトを組み合わせることもできます。 この場合、Pythonのor
演算子は引き続き最初の真のオペランドまたは最後のオペランドを返しますが、戻り値はTrue
またはFalse
、あるいはテストしているオブジェクトである可能性があります。
表現の結果 | オブジェクトの結果 | exp or obj の結果 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
表3 オブジェクトとブール式をテストするときのPythonor
演算子の動作
いくつかの例でこれがどのように機能するかを見てみましょう。
>>>
>>> 2 < 4 or 2 # Case 1
True
>>> 2 < 4 or [] # Case 2
True
>>> 5 > 10 or [] # Case 3
[]
>>> 5 > 10 or 4 # Case 4
4
Case 1およびCase 2では、部分式2 < 4
はTrue
と評価され、戻り値はTrue
でした。 一方、Case 3とCase 4では、部分式5 > 10
がFalse
に評価されたため、最後のオペランドが返され、空のリスト([]
)およびTrue
またはFalse
の代わりに整数(4
)。
演習として、3番目の列の式の順序を逆にすることでTable 3を拡張しようとすることができます。つまり、obj or exp
を使用して、結果を予測しようとします。
短絡評価
Pythonは、関連するすべての部分式とオブジェクトを評価する前に、ブール式の真理値を判断できる場合があります。 たとえば、Pythonのor
演算子は、真と見なされるものが見つかるとすぐにオペランドの評価を停止します。 たとえば、次の式は常にTrue
です。
>>>
>>> True or 4 < 3
True
or
式の最初のオペランドが2番目のオペランドの値に関係なくtrueと評価された場合(4 < 3
はFalse
)、式はtrueと見なされ、2番目のオペランドはtrueと見なされます。オペランドは評価されません。 これはshort-circuit (lazy) evaluationと呼ばれます。
別の例を考えてみましょう。
>>>
>>> def true_func():
... print('Running true_func()')
... return True
...
>>> def false_func():
... print('Running false_func()')
... return False
...
>>> true_func() or false_func() # Case 1
Running true_func()
True
>>> false_func() or true_func() # Case 2
Running false_func()
Running true_func()
True
>>> false_func() or false_func() # Case 3
Running false_func()
Running false_func()
False
>>> true_func() or true_func() # Case 4
Running true_func()
True
Case 1では、Pythonはtrue_func()
を評価しました。 True
を返すため、次のオペランド(false_func()
)は評価されません。 フレーズRunning false_func()
が出力されないことに注意してください。 最後に、式全体がTrue
と見なされます。
最初のオペランド(false_func()
)はFalse
であるため、Case 2は両方の関数を評価します。 次に、演算子は2番目の結果、つまりtrue_func()
によって返される値(True
)を返します。
両方ともFalse
を返すため、Case 3は両方の関数を評価します。 この演算は最後の関数の戻り値、つまりFalse
を返し、式はFalse
と見なされます。
Case 4では、Pythonは最初の関数であるTrue
のみを評価し、式はTrue
です。
short-circuit (lazy) evaluationでは、式の値が第1オペランドのみから決定できる場合、ブール式の第2オペランドは評価されません。 Pythonは(他の言語と同様に)パフォーマンスを優先してこの2番目の評価をバイパスします。これは、2番目のオペランドを評価するとCPU時間を無駄に消費するためです。
最後に、Pythonor
演算子を使用しているときのパフォーマンスに関しては、次のことを考慮してください。
-
Python
or
演算子の右側の式は、実質的または重要な作業を実行する関数を呼び出す場合や、短絡ルールが有効になっても発生しない副作用がある場合があります。 -
本当である可能性が高い条件は、左端の条件である可能性があります。 この方法は、Pythonが第1オペランドを評価するだけで条件が真かどうかを判断できるため、プログラムの実行時間を短縮できます。
セクションの要約
Pythonor
演算子がどのように機能するかを学び、その主な機能と動作のいくつかを見てきました。 これで、実世界の問題を解決する際に演算子を使用する方法を学習することで、レベルアップを続けるのに十分なことがわかりました。
その前に、Pythonのor
に関するいくつかの重要なポイントを要約しましょう。
-
これは、ブール
OR
演算子が従う必要のある一般的な規則を満たしています。 一方または両方のブール部分式が真の場合、結果は真になります。 それ以外の場合、両方の部分式が偽であれば、結果は偽になります。 -
Pythonオブジェクトをテストするときに、
True
またはFalse
の値の代わりにオブジェクトを返します。 つまり、式x or y
は、trueと評価された場合はx
を返し、それ以外の場合は(真理値に関係なく)y
を返します。 -
事前定義されたPython内部ルールのセットに従って、オブジェクトの真理値を決定します。
-
真であると考えられるものを見つけるとすぐに、オペランドの評価を停止します。 これは、短絡評価または遅延評価と呼ばれます。
ここで、いくつかの例を使用して、この演算子をどこでどのように使用できるかを学習します。
ブールコンテキスト
このセクションでは、Pythonor
演算子を使用する方法のいくつかの実用的な例を示し、そのやや変わった動作を利用してより良いPythonコードを作成する方法を学びます。
Pythonのブールコンテキストで作業していると言える主な状況は2つあります。
-
if
statements:の条件付き実行 -
while
loops:の条件付き繰り返し
if
ステートメントを使用すると、いくつかの条件の真理値に応じて、プログラムの実行パスを決定できます。
一方、while
ループを使用すると、特定の条件が真である限り、コードの一部を繰り返すことができます。
これらの2つの構造は、control flow statementsと呼ばれるものの一部です。 プログラムの実行パスを決定するのに役立ちます。
次の2つのセクションで説明するように、Pythonのor
演算子を使用して、if
ステートメントとwhile
ループの両方での使用に適したブール式を作成できます。
if
ステートメント
特定の実行パスを選択する前に、2つの条件のいずれか(または両方)が真であることを確認したいとしましょう。 この場合、Pythonのor
演算子を使用して、1つの式で条件を接続し、その式をif
ステートメントで使用できます。
ユーザーの回答に応じていくつかのアクションを実行するには、ユーザーから確認を取得する必要があるとします。
>>>
>>> def answer():
... ans = input('Do you...? (yes/no): ')
... if ans.lower() == 'yes' or ans.lower() == 'y':
... print(f'Positive answer: {ans}')
... elif ans.lower() == 'no' or ans.lower() == 'n':
... print(f'Negative answer: {ans}')
...
>>> answer()
Do you...? (yes/no): y
Positive answer: y
>>> answer()
Do you...? (yes/no): n
Negative answer: n
ここでは、ユーザーの入力を取得して、それをans
に割り当てます。 次に、if
ステートメントは左から右に条件のチェックを開始します。 それらの少なくとも1つがtrueと評価された場合、if
コードブロックを実行します。 elif
ステートメントも同じことをします。
answer()
の最初の呼び出しでは、ユーザーの入力は最初の条件を満たすy
であり、if
コードブロックが実行されました。 2番目の呼び出しでは、ユーザーの入力(n
)が2番目の条件を満たすため、elif
コードブロックが実行されました。 ユーザー入力が条件を満たさない場合、コードブロックは実行されません。
別の例として、数値が範囲外であるかどうかを判断する場合があります。 この場合、Pythonのor
演算子を使用することもできます。 次のコードは、x
が20
から40
の範囲外にあるかどうかをテストします。
>>>
>>> def my_range(x):
... if x < 20 or x > 40:
... print('Outside')
... else:
... print('Inside')
...
>>> my_range(25)
Inside
>>> my_range(18)
Outside
x=25
でmy_range()
を呼び出すと、if
ステートメントは25 < 20
、つまりFalse
をテストします。 次に、False
でもあるx > 40
をテストします。 最終結果はFalse
であるため、else
ブロックが実行されました。
一方、18 < 20
はTrue
に評価されます。 次に、Pythonのor
演算子が短絡評価を行い、条件はTrue
と見なされます。 メインブロックが実行され、値が範囲外です。
while
ループ
while
ループは、Pythonのor
演算子を使用できるブールコンテキストのもう1つの例です。 ループのヘッダーでor
を使用することにより、いくつかの条件をテストし、すべての条件がfalseと評価されるまで本体を実行できます。
一部の産業用機器の動作温度を100ºF〜140ºFの範囲になるまで測定する必要があるとします。 これを行うには、while
ループを使用できます。
from time import sleep
temp = measure_temp() # Initial temperature measurement
while temp < 100 or temp > 140:
print('Temperature outside the recommended range')
print('New Temperature measure in 30 seconds')
sleep(30)
print('Measuring Temperature...')
temp = measure_temp()
print(f'The new Temperature is {temp} ºF')
これはほとんど疑似コードのおもちゃの例ですが、アイデアを示しています。 ここで、while
ループは、temp
が100ºFから140ºFの間になるまで実行されます。 温度値が範囲外である場合、ループの本体が実行され、温度を再度測定します。 measure_temp()
が100ºFから140ºFの間の値を返すと、ループは終了します。 温度測定は、30秒ごとにusing sleep(30)
で行われます。
Note:前のコード例では、文字列のフォーマットにPythonのf-stringを使用しました。f-stringをさらに深く掘り下げたい場合は、Python 3’s f-Strings: An Improved String Formatting Syntax (Guide)を確認できます。
非ブールコンテキスト
ブールコンテキストからPythonor
演算子の特別な機能を利用できます。 経験則では、ブール式の結果は最初の真のオペランドまたは行の最後になります。
論理演算子(or
を含む)は代入演算子(=
)の前に評価されるため、一般的な式の場合と同じ方法でブール式の結果を変数に割り当てることができます。 :
>>>
>>> a = 1
>>> b = 2
>>> var1 = a or b
>>> var1
1
>>> a = None
>>> b = 2
>>> var2 = a or b
>>> var2
2
>>> a = []
>>> b = {}
>>> var3 = a or b
>>> var3
{}
ここで、or
演算子は期待どおりに機能し、最初のtrueオペランド、または両方がfalseと評価された場合は最後のオペランドを返します。
Pythonでのor
のこのやや特殊な動作を利用して、非常に一般的なプログラミングの問題に対するPythonのソリューションを実装できます。 いくつかの実世界の例を見てみましょう。
変数のデフォルト値
Pythonor
演算子を使用する一般的な方法の1つは、真理値に従ってオブジェクトのセットからオブジェクトを選択することです。 これを行うには、割り当てステートメントを使用します。
>>>
>>> x = a or b or None
ここでは、式の最初の真のオブジェクトをx
に割り当てました。 すべてのオブジェクト(この場合はa
とb
)がfalseオブジェクトの場合、Pythonのor
演算子は最後のオペランドであるNone
を返します。 これが機能するのは、or
演算子が、真理値に応じてオペランドの1つを返すためです。
この機能を使用して、変数にデフォルト値を割り当てることもできます。 次の例では、a
がtrueの場合はx
をa
に設定し、それ以外の場合はdefault
に設定します。
>>>
>>> x = a or default
前のコードでは、a
がtrueと評価された場合にのみ、a
をx
に割り当てます。 それ以外の場合、x
にはdefault
が割り当てられます。
デフォルトのreturn
値
空のイテラブルをmax()
またはmin()
に指定すると、ValueError
が取得されます。 ただし、Pythonのor
演算子を使用して、この動作を変更できます。 次のコードを見てみましょう。
>>>
>>> lst = [] # Empty list to test max() and min()
>>> max(lst)
Traceback (most recent call last):
File "", line 1, in
max(lst)
ValueError: max() arg is an empty sequence
>>> min(lst)
Traceback (most recent call last):
File "", line 1, in
min(lst)
ValueError: min() arg is an empty sequence
>>> # Use Python or operator to modify this behavior
>>> max(lst or [0]) # Return 0
0
>>> min(lst or [0]) # Return 0
0
max()
とmin()
のデフォルトの動作は、空のイテラブルでそれらを呼び出すと、ValueError
を上げることです。 ただし、Pythonのor
演算子を使用すると、これらの関数にデフォルトのreturn
値を指定し、それらのデフォルトの動作をオーバーライドします。
Note:前のコード例では、いくつかの問題が発生したときにPythonがどのように例外を発生させるかを見ました。 Pythonの例外について詳しく知りたい場合は、Introduction to Python Exceptionsを参照してください。
可変デフォルト引数
Pythonプログラマーが直面する一般的な問題は、関数のデフォルト引数として可変オブジェクトを使用しようとすることです。
デフォルト引数の可変値は、呼び出し間で状態を保持できます。 これはしばしば予期しないことです。 これは、デフォルトの引数値が一度だけ評価および保存されるため、つまり、結果の関数が呼び出されるたびではなく、def
ステートメントが実行されるときに発生します。 そのため、関数内の可変デフォルトを変更する際には注意が必要です。
次の例を見てください。
>>>
>>> def mutable_default(lst=[]): # Try to use a mutable value as default
... lst.append(1) # Change same object each time
... print(lst)
...
>>> mutable_default(lst=[3, 2]) # Default not used
[3, 2, 1]
>>> mutable_default() # Default used
[1]
>>> mutable_default() # Default grows on each call
[1, 1]
>>> mutable_default()
[1, 1, 1]
ここで、lst
は同じオブジェクト(デフォルトの[]
)への参照を保持しているため、mutable_default()
を呼び出すたびに1
がlst
の末尾に追加されます。 期待どおりに関数が呼び出されるたびに新しいlist
が取得されるわけではありません。
それが望みの動作ではない場合、従来の(そして最も安全な)解決策は、デフォルトを関数の本体に移動することです:
>>>
>>> def mutable_default(lst=None): # Use None as formal default
... if lst is None:
... lst = [] # Default used? Then lst gets a new empty list.
... lst.append(1)
... print(lst)
...
>>> mutable_default(lst=[3, 2]) # Default not used
[3, 2, 1]
>>> mutable_default() # Default used
[1]
>>> mutable_default()
[1]
この実装では、lst
のデフォルト値に依存して、引数なしでmutable_default()
を呼び出すたびに、lst
が空のlist
に設定されるようにします。
この例のif
ステートメントは、ほとんど割り当てlst = lst or []
に置き換えることができます。 このように、関数に引数が渡されない場合、lst
はデフォルトでNone
になり、Pythonのor
演算子は右側に空のリストを返します。
>>>
>>> def mutable_default(lst=None): # Use None as formal default
... lst = lst or [] # Default used? Then lst gets an empty list.
... lst.append(1)
... print(lst)
...
>>> mutable_default(lst=[3, 2]) # Default not used
[3, 2, 1]
>>> mutable_default() # Default used
[1]
>>> mutable_default()
[1]
ただし、これはまったく同じではありません。 たとえば、空のlist
が渡された場合、or
操作により、関数は、最初に渡されたlist
を変更して印刷するのではなく、新しく作成されたlist
を変更して印刷します。 if
バージョンのようなlist
で十分です。
空でないlist
オブジェクトのみを使用することが確実な場合は、このアプローチを使用できます。 それ以外の場合は、if
バージョンを使用してください。
ゼロ部門
数値計算を扱う場合、ゼロ除算は一般的な問題です。 この問題を回避するには、if
ステートメントを使用して、分母が0
に等しいかどうかを確認することになります。
例を見てみましょう。
>>>
>>> def divide(a, b):
... if not b == 0:
... return a / b
...
>>> divide(15, 3)
5.0
>>> divide(0, 3)
0.0
>>> divide(15, 0)
ここでは、分母(b
)が0
と等しくないかどうかをテストしてから、除算の結果を返しました。 b == 0
がTrue
に評価される場合、divide()
は暗黙的にNone
を返します。 同様の結果を得る方法を見てみましょう。ただし、今回はPythonのor
演算子を使用します。
>>>
>>> def divide(a, b):
... return b == 0 or a / b
...
>>> divide(15, 3)
5.0
>>> divide(0, 3)
0.0
>>> divide(15, 0)
True
この場合、Pythonのor
演算子は、最初の部分式(b == 0
)を評価します。 この部分式がFalse
の場合のみ、2番目の部分式(a / b
)が評価され、最終結果はa
とb
の除算になります。
前の例との違いは、b == 0
がTrue
に評価された場合、divide()
は暗黙のNone
ではなくTrue
を返すことです。
lambda
の複数の式
Pythonはlambda
expressionsを提供します。これにより、単純な無名関数を作成できます。 式lambda parameters: expression
は、関数オブジェクトを生成します。 この種の関数は、単純なコールバック関数とキー関数を定義する場合に役立ちます。
lambda
関数を作成するための最も一般的なパターンは、単一のexpression
を戻り値として使用することです。 ただし、これを変更して、Pythonのor
演算子を使用して、lambda
にいくつかの式を実行させることができます。
>>>
>>> lambda_func = lambda hello, world: print(hello, end=' ') or print(world)
>>> lambda_func('Hello', 'World!')
Hello World!
この例では、lambda
に2つの式(print(hello, end=' ')
とprint(world)
)を実行するように強制しました。 しかし、このコードはどのように機能しますか? ここで、lambda
は、2つの関数が実行されるブール式を実行します。
or
が最初の関数を評価すると、None
を受け取ります。これは、print()
の暗黙の戻り値です。 None
はfalseと見なされるため、or
は引き続き2番目のオペランドを評価し、最終的にブール式の結果として返します。
この場合、ブール式によって返される値は、lambda
によって返される値でもあります。
>>>
>>> result = lambda_func('Hello', 'World!')
Hello World!
>>> print(result)
None
ここで、result
は、lambda
によって返される値への参照を保持します。これは、ブール式によって返される値と同じです。
結論
これで、Pythonor
演算子がどのように機能するか、およびPythonで一般的なプログラミングの問題を解決するためにそれを使用する方法がわかりました。
Pythonのor
演算子の基本を理解したので、次のことができるようになります。
-
ブールおよび非ブールコンテキストでPython
or
演算子を使用する -
Python
or
演算子を効果的に使用して、いくつかの種類のプログラミング問題を解決します -
Pythonの
or
のやや特別な機能を利用して、より優れたPythonicコードを記述します。 -
他の人がPython
or
演算子を使用するときに、そのコードを読んで理解を深める
さらに、ブール論理とPythonの主要な概念についても少し学びました。