PyLearn 03: if文、型チェック

システムを作るとき、状況に応じて制御を変えることは一般的です。例えば、年齢入力欄があって、年齢が20代なら若者向けの商品紹介ページに行く、などです。ここでは、状況によって処理を変えるif文を扱います。

初めに、キーボードからの入力を受け取るinput関数について説明します。以下のように記述すると、キーボードから数字を入力できるようになります。左辺は、入力された値を代入するものです。

In [1]:
print("年齢を入力してください。")
x=input()
年齢を入力してください。
14

このようにして、xには26という値が入っています。ただ、input関数はあらゆる入力を文字として受け取ってしまいます。したがって、xには数字が入力されているように見えても、文字が入ってしまっています。そのため、計算しようとすると、以下のようにエラーが出ます。

In [2]:
res=x+10
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-421d579ad47f> in <module>
----> 1 res=x+10

TypeError: can only concatenate str (not "int") to str

これを回避するためには、文字ではなく数値ですよと教えてあげる必要があります。このような操作をキャストと呼びます。整数に変換したい場合はint()、実数に変換したい場合はfloat()を使用します(整数と実数の違いがわからない人は自分で調べてください)。特に制約がない場合には、実数として扱えば良いです。

In [3]:
res=float(x)+10
print(res)
24.0

文字を実数にキャストしたので、エラーが出ずに計算することができました。inputで数字を入れた場合はキャストしなければいけない、と覚えておくといいと思います。 inputとキャストのことがわかったので、if文の説明に移ります。もし入力された年齢が20歳未満であれば、あなたは未成年ですと出力するコードを以下に示します。

In [4]:
print("年齢を入力してください。")
x=input()
xf=float(x)

if xf < 20:
    print("あなたは未成年です。")
年齢を入力してください。
10
あなたは未成年です。

if の後に条件を入れることで、for文と同じで、インデントされている領域を実行します。これで、20未満の数値を入力したとき、未成年だと言われたと思います。しかし、成人の場合には何も出力されません。これを回避するためには、elifを使用します。これは、「そうではなく、もし」という訳し方をします。

In [5]:
print("年齢を入力してください。")
x=input()
xf=float(x)

if xf < 20:
    print("あなたは未成年です。")
elif xf >= 20:
    print("あなたは成年です。")
年齢を入力してください。
27
あなたは成年です。

ここで記したように、大なり小なり記号の右にイコールをつけると、その値も含めることができます。上のコードは、20歳未満なら「未成年」といい、もしそうではなく20歳以上なら「成年」という意味があります。ところで、よくよく考えてみると、「20歳未満である」という条件が否定されれば、わざわざ「20歳以上か?」というチェックは必要ありません。このように、「そうでないならば」という文脈にしたい場合には、elseを用います。

In [6]:
print("年齢を入力してください。")
x=input()
xf=float(x)

if xf < 20:
    print("あなたは未成年です。")
else:
    print("あなたは成年です。")
年齢を入力してください。
27
あなたは成年です。

elif を使った場合も、elseも使った場合も、同じ出力になると思います。うまく使い分けることが必要です。ところで、if、elif、elseはすべて使うこともできます。以下のコードは、「年齢にマイナスが入力されたら警告を出し、そうではなく20歳未満なら未成年といい、そうでないなら成年という」機能を持ちます。

In [7]:
print("年齢を入力してください。")
x=input()
xf=float(x)

if xf < 0:
    print("Warning!: マイナスの年齢はあり得ません!")
elif xf < 20:
    print("あなたは未成年です。")
else:
    print("あなたは成年です。")
年齢を入力してください。
-100
Warning!: マイナスの年齢はあり得ません!

次のように、for文のなかにif文を入れることもできます。入力された数字が奇数か偶数かを判定し、奇数ならば「OddNumber」のリストにappend、偶数なら「EvenNumber」のリストにappendしています。偶数か奇数かの判定は、剰余演算により判定します。2で割ったときの余りが0と等しいならば偶数、余りが0ではないならば奇数と判定します。等しいかどうかは「==」、等しくないかどうかを判定するには「!=」を使います。int(input())という記述は、文字を即座に整数に変換するという意味があります。ちょっと難しいですが、頑張って解読してみてください。

In [9]:
EvenNumber=[]  # <- even は偶数という意味です。
OddNumber=[]   # <-  odd は奇数という意味です。

for i in range(0, 5):
    
    # 数字入力
    print("*** 整数を入力してください ***")
    x = int(input())
    
    # もし偶数ならば...
    if x % 2 == 0:
        print("これは偶数だ!")
        EvenNumber.append(x)
        
    # そうではなく、もし奇数ならば...
    elif x % 2 != 0:
        print("これは奇数だ!")
        OddNumber.append(x)

print("*** for文を抜けました。***")
print("偶数:", EvenNumber)
print("奇数:", OddNumber)
*** 整数を入力してください ***
12
これは偶数だ!
*** 整数を入力してください ***
17
これは奇数だ!
*** 整数を入力してください ***
26
これは偶数だ!
*** 整数を入力してください ***
29
これは奇数だ!
*** 整数を入力してください ***
30
これは偶数だ!
*** for文を抜けました。***
偶数: [12, 26, 30]
奇数: [17, 29]

上のコードは、5回数字を入力する必要がありました。しかし、ときとして途中で辞めたくなる時もあります。for文を抜けるには、break文を使います。以下のコードは、「-1」が入力されたらfor文の下に抜ける機能を持ちます。

In [10]:
EvenNumber=[]  # <- even は偶数という意味です。
OddNumber=[]   # <-  odd は奇数という意味です。

for i in range(0, 5):
    
    # 数字入力
    print("*** 整数を入力してください ***")
    x = int(input())
    
    # マイナス1が入力されたらfor文を抜ける
    if x == -1:
        print("for文を脱出します!!")
        break
    
    # もし偶数ならば...
    if x % 2 == 0:
        print("これは偶数だ!")
        EvenNumber.append(x)
        
    # そうではなく、もし奇数ならば...
    elif x % 2 != 0:
        print("これは奇数だ!")
        OddNumber.append(x)

print("*** for文を抜けました。***")
print("偶数:", EvenNumber)
print("奇数:", OddNumber)
*** 整数を入力してください ***
12
これは偶数だ!
*** 整数を入力してください ***
-1
for文を脱出します!!
*** for文を抜けました。***
偶数: [12]
奇数: []

整数で年齢を入力するシステムを作っていたとして、いたずらで変な値を入力する輩も出てきます。このような不正な値を入力されたかどうかを調べるために、型チェックという概念を覚えておくと便利です。まず、以下のように入力してみてください。

In [11]:
a = 12
b = 12.3
c = "じゅうにさい"
print("aの型: ", type(a))
print("bの型: ", type(b))
print("cの型: ", type(c))
aの型:  <class 'int'>
bの型:  <class 'float'>
cの型:  <class 'str'>

intは整数、floatは実数、strは文字であることを意味しています。このように、type関数を用いると、値の種別がなんなのかわかるようになっています。この種別のことを型と言います。プログラマの方が「この変数はint型」など言ったりしますが、それは「この変数は整数を入れるためのものだよ」という意味があります。次に、以下のコードを実行してみてください。

In [12]:
a=12
print(type(a) == float)
print(type(a) == int)
False
True

「type(a) == float」を翻訳すると「aの型は実数と等しい」という命題になります。aは整数ですから「誤り」です。このような場合は、「false」を返してきます。一方、「type(a) == int」を翻訳すると「aの型は整数と等しい」という命題になります。これは正しいですね。このように正しい場合は、「true」を返してくれます。これらをまとめると、うまく型をチェックできそうです。

In [13]:
val = "じゅうにさい"

if type(val) == str:
    print("これは文字です!")
    
if type(val) == int:
    print("これは整数です!")

if type(val) == float:
    print("これは実数です!")
これは文字です!

このように、変数の型を自動判定するプログラムを書くことができました。型チェックは、実際にシステム開発を行なっているとたまに必要になってきます。

続いて、if文でかなり重要な概念であるandについて説明します。andとは、複数の条件を同時に満たしているかどうかをチェックする記法です。例えば、あなたが学校の先生だとして、試験の点数が60点以上70点未満の人数が何人だったのか、知りたいとします。これを実現するには、「60点以上かつ70点未満か否か」をチェックするif文が必要です。これをカウントするプログラムを書いてみます。

In [14]:
Score=[30, 10, 65, 50, 100, 90, 68, 60, 85, 95]
# ↑60点以上、70点未満は3人います。これをカウントしてみます。

Counter=0

for i in range(0, len(Score)):
    if Score[i] >= 60 and Score[i] < 70:
        Counter = Counter + 1
        
print("60点以上70点未満の人数は", Counter, "人です。")
60点以上70点未満の人数は 3 人です。

「Score[i] >= 60 and Score[i] < 70」のように、条件をandでつなげると、2つの条件両方とも満たしたときのみ、if文の中に入ることができるようになります。andの仲間に、orがあります。これにより、2つの条件のうちどちらか一方を満たしたときのみ、if文の中に入ることのできる処理を実現することができます。以下は、試験得点で極端に成績が良い、あるいは極端に成績が悪い人を同時にカウントするコードです(実際こんなことをする場合はありませんが...)。

In [15]:
Score=[0, 3, 4, 94, 98, 100, 50, 60, 70, 76]
# ↑10点以下の人数は3人で、90点以上の人数も3人です。
#  どちらかを満たすのは6人です。

Counter=0

for i in range(0, len(Score)):
    if Score[i] <= 10 or Score[i] >= 90:
        Counter = Counter + 1
        
print("極端に成績が悪い人、良い人の合計人数は", Counter, "人です。")
極端に成績が悪い人、良い人の合計人数は 6 人です。

これで、どちらか一方を満たす場合のみ、カウントされるコードを実現できました。

if文はこれで終わりです。以下の点、復習してください。

  • 「>, <, >=, <=, ==, !=」はわかりますか?
  • 「if, elif, else」はわかりますか?
  • 「and, or」はわかりますか?
  • 「int, float, str」はわかりますか?

これらはプログラミングにおいて、どんな言語でも必須事項です。 ぜひ暗記してください!