Python入門(4) if文

プログラミングにおいて、特定の情況に応じた処理を行なう必要があり、これをif文という。

if文

キーワード if の後に2値 True(真) または False(偽)だけを取る論理式を評価して、True のときにだけ 文1,..,文n を実行するスクリプトをif文といい、Pythonでは次のように書く。

if 論理式 :
    文1
    ....
    文n

2つの点に注意して欲しい。

次のスクリプト if_example.py を見てみよう。

x = 100
y = 200
if x > y:
    print('x, y = ', x, y)
    print(x, ' is bigger than ', y)
print(y, ' is bigger than ', x)
演習: スクリプト if_example.py を実行し、その結果を説明しなさい。

スクリプト if_example.py では、3行目の論理式の後にコロン(:) で改行、4行目と5行目が字下げされていることがポイントである。 字下げを軽く考えはいけない。たとえば次のように書いてしまったとしよう。

x = 100
y = 200
if x > y:
    print('x, y = ', x, y)
print(x, ' is bigger than ', y)
print(y, ' is bigger than ', x)
演習: 上のスクリプトを実行し、何故間違っているのかを説明しなさい。

[重要] Pythoinの字下げ

Pythonでは、1行には1ステートメント(statement)しか書けない(他のプログラム言語では、コロン(;)で区切っていくらでも書くことができる場合が多い)。 Pythonにおける字下げは、可読性を高めるために利用される他のプログラム言語と異なり、ブロック文(block)を指定するための本質的に必要な書式である。


Pythonにおける字下げは行頭にある空白文字が重要で、同じ数の空白文字で字下げされたステートメント行がブロックとみなされる。 このためにPythonでは、タブ文字 "\t" をキー入力して見た目に字下げされているように見えても、字下げしたとは見なさない(IndentationError: unexpected indentのようなエラーが発生する)。 多くのテキストエディタでは、空白文字で字下げした行の次の行をタブ文字で埋め合わせることができるので注意が必要だ。

他の言語のブロック文の指定

Pythonでは、他のプログラム言とは違って単純化されていて、文(statement)の区切り文字はなく、1行に1つの文を書いて改行する。 ただし、複数の文を1つの塊であるブロック文に指定するには、上の例で見たように行頭を揃えて字下げする。 ブロック文の表し方はプログラム言語によって異なる。

C(C++)では、文はコロン(;)で区切り、ブロックは括弧 { と } で囲む(しかも変数は使う前に事前に宣言しなければならない)。 同じようしてブロックを { } で囲んで記述をする言語に、Javaなど多くの言語がある。

int x, y; x = 100; y = 200;
if (x > y) {
    printf(x, " is bigger than ", y);
    printf(y, " is bigger than ", x);
}
printf(y, " is bigger than ", x);

Pascal(Delphi)では、次のようにブロックを begin とend で挟んで書く。

integer x, y;
x = 100;
y = 200;
if (x > y) then 
begin
     writeln('x, y = ', x, y);
     write(print x, ' is bigger than ', y);
end;
writeln(y, ' is bigger than ', x);

if-else文

if文では論理式の値が True のときだけの処理を記述するが、False のときの処理も併せて記述したい場合が多い。 このときは次のように、if-else文を書く。

x = 100
y = 200
if x > y:
    print('x, y = ', x, y)
    print(x, ' is bigger than ', y)
else:
    print(y, ' is bigger than ', x)
    print(x, ' is less than ', y)
print('Do you understand if-else statement?')

次の2点に注意して欲しい。

最後のprint('Do you understand...')' は if-else文の外にあることに注意する。

演習: 上のスクリプトを実行し、その実行結果を説明しなさい。

if-elif-else文

if-else文のように2分岐でなく、途中にelifを複数回加えて、複数に処理を分岐させることができる。

x = 100
if x > 150:
    print(x, ' is big.')
elif x < 50:
    print(x, ' is small.')
    print('Are you OK?')
else:
    print(x, ' is midium.')
    print('Are you really OK?')
print('Do you understand if-ilif-else statement?')

ここでも次の3点に注意して欲しい。

最後のprint('Do you understand...'') は if-elif-else文の外にあることに注意する。

演習: 上のスクリプト if_elif_else.py を実行し、実行結果を説明しなさい。

値を比較する

2つの(変数の)値を比較演算子によって比較した評価結果は True または False を返す。

比較演算子
比較演算子意味
a < ba は b より小さい
a <= b a は b 以下
a > ba は bより大きいい
a >= ba は b 以上
a == ba は b に等しい
a != ba は b に不一致

Python shellで実際に比較演算を確かめて見ることができる。

>>>100 > 200
False
>>> 100 >= 200
False
>>> 100 < 200
True
>>> 100 <= 200
True
>>> 100 == 200
False
>>> 100 != 200
True

文字列同時でも比較できる。 同じ小文字または大文字同士では辞書式順序で比較されるが、大文字は小文字より小さいとなっているので注意しよう。

>>> 'he' < 'hellow'
True
>>> 'he' < 'happy'
False
>>> 'H' < 'h'
True
>>> 'HI' < 'Hi'
True

一見、比較不可能であるような値同士でもエラーを返さずに比較してしまうことも知っておく必要がある。

>>> 'hello' < 3
False
>>> True > False
True
>>> False == 0
True
演習(重要): キー入力関数 input(Python3)を使ってキーボードから整数文字列 n を入力して、関数 int でこれを整数値にキャストする。 整数 n を整数 3 で割った整数商 0, 1, 2 に応じて計算結果を次のように表示する if-elif-else 文を使うスクリプト if_modulo.py を書きなさい。
Input an integer: 9
9  divided by 3:  3
9 is a multiple of 3

Input an integer: 7
7  divided by 3:  2
7  has a remainder 1 if divided by 3

Input an integer: -7
-7  divided by 3:  -3
-7  has a remainder 2 if divided by 3

論理演算子

論理式を論理演算子 and , or, not を組み合わせて、複雑な命題を表す論理式を構成することができる。 四則演算と同様に、論理式を括弧 ( ) で囲むと評価が優先される。

論理演算子
論理演算子意味
P and Q論理式 P が True かつ(and) 論理式 Q が True であるときに限ってTrue
P or Q論理式 P が True または(or)論理式 Q が True のどちらかであるときにTrue
not P論理式 P が Flaseのときに True

次のスクリプト logical_op.py は 変数 x の値が 80りよ大きく120未満であるかを判定する。

x = 100

if (80 < x) and (x < 120) :
    print(x, ' is greater than 80 and less than 120')
elif x <= 80:
    print(x, ' is equal or less than 80')
else: # 120 <= x
    print(x, ' is equal or greater than 120')
演習: キーボードから入力した文字列が10文字以上15文字以下であるかを判定するスクリプト input_str-length.py を書きなさい。
(ヒント);文字列の長さを返す関数 len を使う。
Input sting : a long long ago
length:  15  is appropriate

Input sting : apple
length:  5  is too short

Input sting : there were two brothers
length:  23  is too long
演習(重要): キーボード入力関数 nput(Python3)を使ってキーボードから整数文字列 n を入力して、関数 int でこれを整数値にキャストする。 入力した整数 n が3または4の倍数ではなく、5の倍数であることを判定するスクリプト logical_multi_conditions.py を書いて実行しなさい。
Input an integer: 10
10  is a multiple of 5 but not of 3 or 4

Input an integer: 15
What is properties of the number 15 ?

Input an integer: 20
What is properties of the number 20 ?