1-3. 論理・比較演算と条件分岐の基礎

論理・比較演算と条件分岐の基礎について説明します。

参考

if文による条件分岐

制御構造については第2回と第3回で本格的に扱いますが、 ここでは if による条件分岐if文)の基本的な形だけ紹介します。

[1]:
def bmax(a,b):
    if a > b:
        return a
    else:
        return b

上の関数 bmax は、2つの引数の大きい方 (正確には小さくない方)を返します。

ここで if による条件分岐が用いられています。

if a > b:
    return a
else:
    return b

ab より大きければ a が返され、そうでなければ、b が返されます。

ここで、return a が、if より右にインデントされていることに注意してください。 return a は、a > b が成り立つときのみ実行されます。

elseif の右の条件が成り立たない場合を示しています。 else: として、必ず : が付くことに注意してください。

また、return b も、else より右にインデントされていることに注意してください。 ifelse は同じインデントになります。

[2]:
bmax(3,5)
[2]:
5

関数の中で return と式が実行されますと、関数は即座に返りますので、 関数定義の中のその後の部分は実行されません。

たとえば、上の条件分岐は以下のように書くこともできます。

if a > b:
    return a
return b

ここでは、if から始まる条件分岐には else: の部分がありません。 条件分岐の後に return b が続いています。 (ifreturn b のインデントは同じです。)

a > b が成り立っていれば、return a が実行されて a の値が返ります。 したがって、その次の return b は実行されません。

a > b が成り立っていなければ、return a は実行されません。 これで条件分岐は終わりますので、その次にある return b が実行されます。

なお、Pythonでは、max という関数があらかじめ定義されています。(すなわち、max は組み込み関数です。)

[3]:
max(3,5)
[3]:
5

様々な条件

if の右などに来る条件として様々なものを書くことができます。これらの条件には >< などの比較演算子が含まれています。

x < y         # x は y より小さい
x <= y        # x は y 以下
x > y         # x は y より大きい
x >= y        # x は y 以上
x == y        # x と y は等しい
x != y        # x と y は等しくない

特に等しいかどうかの比較には == という演算子が使われることに注意してください。 = は代入の演算子です。

<= は小さいか等しいか、>= は大きいか等しいかを表します。 != は等しくないことを表します。

さらに、このような基本的な条件を、 andor を用いて組み合わせることができます。

i >= 0 and j > 0   # i は 0 以上で、かつ、j は 0 より大きい
i < 0 or j > 0     # i は 0 より小さいか、または、j は 0 より大きい

i が 1 または 2 または 3 である、という条件は以下のようになります。

i == 1 or i == 2 or i == 3

これを i == 1 or 2 or 3 と書くことはできませんので、注意してください。

また、not によって条件の否定をとることもできます。

not x < y          # x は y より小さくない(x は y 以上)

比較演算子は、以下のように連続して用いることもできます。

[4]:
1 < 2 < 3
[4]:
True
[5]:
3 >= 2 < 5
[5]:
True

練習 absolute

数値 x の絶対値を求める関数 absolute(x) を定義してください。 Pythonには abs という絶対値を求める組み込み関数が用意されていますが、それを使わずに定義してください。

[6]:
def absolute(x):
    ...

定義ができたら、次のセルを実行して、エラーがでないことを確認してください。

[7]:
assert absolute(5) == 5
assert absolute(-5) == 5
assert absolute(0) == 0
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
/tmp/ipykernel_1274/2128338628.py in <module>
----> 1 assert absolute(5) == 5
      2 assert absolute(-5) == 5
      3 assert absolute(0) == 0

AssertionError:

練習 sign

x が正ならば 1、負ならば -1、ゼロならば 0 を返す関数 sign(x) を定義してください。

[8]:
def sign(x):
    ...

定義ができたら、次のセルを実行して、エラーがでないことを確認してください。

[9]:
assert sign(5) == 1
assert sign(-5) == -1
assert sign(0) == 0
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
/tmp/ipykernel_1274/586867812.py in <module>
----> 1 assert sign(5) == 1
      2 assert sign(-5) == -1
      3 assert sign(0) == 0

AssertionError:

真理値を返す関数

ここで、真理値を返す関数について説明します。

Pythonが扱うデータには様々な種類があります。 数については既に見て来ました。

真理値とは、 True または False のどちらかの値のことです。 これらは変数ではなく、組み込み定数であることに注意してください。

  • True は、正しいこと()を表します。

  • False は、間違ったこと()を表します。

実は、if の後の条件の式は、TrueFalse を値として持ちます。

[10]:
x = 3
[11]:
x > 1
[11]:
True

上のように、x に 3 を代入しておくと、 x > 1 という条件は成り立ちます。 したがって、x > 1 という式の値は True になるのです。

[12]:
x < 1
[12]:
False
[13]:
x%2 == 0
[13]:
False

そして、真理値を返す関数を定義することができます。

[14]:
def is_even(x):
    return x%2 == 0

この関数は、x を 2 で割った余りが 0 に等しいかどうかという 条件の結果である真理値を返します。

x == y は、xy が等しいかどうかという条件です。 この関数は、この条件の結果である真理値を return によって返しています。

[15]:
is_even(2)
[15]:
True
[16]:
is_even(3)
[16]:
False

このような関数は、if の後に使うことができます。

[17]:
def is_odd(x):
    if is_even(x):
        return False
    else:
        return True

このように、直接に TrueFalse を返すこともできます。

[18]:
is_odd(2)
[18]:
False
[19]:
is_odd(3)
[19]:
True

オブジェクト

Pythonにおける値(式の評価結果)は全てオブジェクトと総称されます。 変数の値もオブジェクトです。

したがって、数や真理値もオブジェクトです。 今後、文字列やリストなど、様々な種類のデータが登場しますが、 それらは全てオブジェクトです。

今後、オブジェクトという用語がところどころで出て来ますが、 オブジェクトとデータは同義と思って差し支えありません。 正確には、式の評価結果や変数の値となるデータがオブジェクトです。

None

None というデータがあります。

セルの中の式を評価した結果が None になると、 何も表示されません。

[20]:
None

print で無理やり表示させると以下のようになります。

[21]:
print(None)
None

None という値は、特段の値が何もない、 ということを表すために使われることがあります。

条件としては、None は偽と同様に扱われます。

[22]:
if None:
    print('OK')
else:
    print('NG')
NG

return の後に式を書かないことがあります。

return

この場合、以下のように None が指定されているとみなされます。

return None

このようなreturn文を実行すると、関数の実行はそこで終了して None が返ります。

▲条件として使われる他の値

TrueFalse の他に、他の種類のデータも、条件としても用いることができます。

たとえば:

  • 数のうち、0 や 0.0 は偽、その他は真とみなされます。

  • 文字列では、空文字列 '' のみ偽、その他は真とみなされます。(文字列については2-1を参照。)

  • 組み込み定数 None は偽とみなされます。(None については上記参照。)

[23]:
if 0:
    print('OK')
else:
    print('NG')
NG
[24]:
if -1.1:
    print('OK')
else:
    print('NG')
OK

▲再帰

一般に、定義しようとするもの自身を定義の中で参照することを、 再帰と言います。 再帰による定義を再帰的定義と言います。

たとえば、数列の漸化式は再帰的定義と考えられます。 実際に、n 番目のフィボナッチ数を fib(n) とおくと、 fib(n) は次のような漸化式を満たします。

fib(n) = n  ただし n<2
fib(n) = fib(n-1) + fib(n-2)  ただし n>=2

この漸化式を用いて以下のように実際にフィボナッチ数を計算することができます。

fib(0) = 0
fib(1) = 1
fib(2) = fib(1) + fib(0) = 1 + 0 = 1
fib(3) = fib(2) + fib(1) = 1 + 1 = 2
fib(4) = fib(3) + fib(2) = 2 + 1 = 3
fib(5) = fib(4) + fib(3) = 3 + 2 = 5
...

この漸化式から、以下のように fib(n) の再帰的定義が得られます。

[25]:
def fib(n):
    if n < 2:
        return n
    else:
        return fib(n-1) + fib(n-2)

実際に、以下のように fib(n) の値が求まります。

[26]:
fib(10)
[26]:
55

練習の解答

[27]:
def absolute(x):
    if x < 0:
        return -x
    else:
        return x
[28]:
def sign(x):
    if x < 0:
        return -1
    if x > 0:
        return 1
    return 0