レッスンの目標

パイソンの基本をもっと勉強してみましょう

前回の続きです。

リスト(配列)

前回、最終的にp01.pyは以下のようになっていました。

for i in range(3):
    print(i+1, "回目:")
    name = input("あなたの名前は? ")
    print("私の名前は", name, "です。")
    age = int(input("何歳ですか? "))
    print("私は来年", age+1, "歳です。")
    if age >= 20:
        print("私はお酒が飲めます。")
    else:
        print("私はお酒が飲めません。")

ここで、入力は入力でまとめて行い、その後の出力処理は後で行うように以下のように変更してみましょう。

for i in range(3):
    print(i+1, "回目:")
    name = input("あなたの名前は? ")
    age = int(input("何歳ですか? "))

for i in range(3):
    print("私の名前は", name, "です。")
    print("私は来年", age+1, "歳です。")
    if age >= 20:
        print("私はお酒が飲めます。")
    else:
        print("私はお酒が飲めません。")

書き換えてファイルを保存したら、実行してみましょう。

python3 p01.py

1 回目:
あなたの名前は? けん
何歳ですか? 63
2 回目:
あなたの名前は? マイケル
何歳ですか? 43
3 回目:
あなたの名前は? 梓
何歳ですか? 11
私の名前は 梓 です。
私は来年 12 歳です。
私はお酒が飲めません。
私の名前は 梓 です。
私は来年 12 歳です。
私はお酒が飲めません。
私の名前は 梓 です。
私は来年 12 歳です。
私はお酒が飲めません。

毎回3回目の名前と年齢が表示されてしまいました。なぜでしょう?

nameageという変数にはそのままでは値は1つしか入りません。そのため1回目にけんという値をnameという変数に入れても、2回目にはマイケルに、3回目にはに書き変わってしまい。表示するときには毎回最後に書き換えたという値とその年齢が表示されてしまいます。

これを解決するため、変数に複数の値を入れることができるようにする仕組みをリスト(配列)といいます。

nameageという変数を以下のように書き換えてみましょう。

name = []
age = []
for i in range(3):
    print(i+1, "回目:")
    name.append(input("あなたの名前は? "))
    age.append(int(input("何歳ですか? ")))

for i in range(3):
    print("私の名前は", name[i], "です。")
    print("私は来年", age[i]+1, "歳です。")
    if age[i] >= 20:
        print("私はお酒が飲めます。")
    else:
        print("私はお酒が飲めません。")

書き換えてファイルを保存したら、実行してみましょう。

python3 p01.py

1 回目:
あなたの名前は? けん
何歳ですか? 63
2 回目:
あなたの名前は? マイケル
何歳ですか? 43
3 回目:
あなたの名前は? 梓
何歳ですか? 11
私の名前は けん です。
私は来年 64 歳です。
私はお酒が飲めます。
私の名前は マイケル です。
私は来年 44 歳です。
私はお酒が飲めます。
私の名前は 梓 です。
私は来年 12 歳です。
私はお酒が飲めません。

nameageに複数の値を入れたり、出したりすることができるようになりました。

ここでname = []というのはnameという変数が空のリスト(配列) であることを示しています。 そして、このリスト に値を追加するにはappend()という関数を使用します。

このリスト から値を取り出すにはname[0]のように何番目に入れた値であるかを[]で指定します。ここで、何番目を示す値は0から始めることに気を付けて下さい。また、name[i]のように変数で何番目かを指定することもできます。

リストにはあらかじめ空のリストを指定して後から追加するだけでなく

name = ["けん", "マイケル", "梓"]

のように、あらかじめ値を入れておくこともできます。 取り出し方は空のリストの時と同様で、name[0]のように何番目の値かを[]で指定して取り出します。

リストは、

name[0] = "わかな"

のように変更したい値の番号を指定して、値を書き換えることも可能です。

辞書

リストを使うことで複数の値を入れることができるようになりましたが、名前と年齢とは関連付けられていないので、このままでは、名前と年齢を入力した後、名前を入れて年齢を答えるようなプログラムを作るのは大変です。

これを解決する方法として、名前と年齢のような2種類の値を簡単に関連付ける仕組みのことを辞書と呼びます。

では、この辞書の仕組みを使って先ほどのプログラムを書き直してみましょう。

age = {}
for i in range(3):
    print(i+1, "回目:")
    name = input("あなたの名前は? ")
    age[name] = int(input("何歳ですか? "))

name = input("あなたの名前は? ")
print("あなたは現在", age[name], "歳です。")
if age[name] >= 20:
    print("あなたはお酒が飲めます。")
else:
    print("あなたはお酒が飲めません。")

書き換えてファイルを保存したら、実行してみましょう。

python3 p01.py

1 回目:
あなたの名前は? けん
何歳ですか? 63
2 回目:
あなたの名前は? マイケル
何歳ですか? 43
3 回目:
あなたの名前は? 梓
何歳ですか? 11
あなたの名前は? けん
あなたは現在 63 歳です。
あなたはお酒が飲めます。

最初とage = {}という部分はageという変数が空の辞書であることを示しています。 そしてage[name] = ...という部分で、ageという辞書にname変数に入っている名前を登録し、その名前と年齢を関連付けています。

その後age[name]name変数に入っている名前に関連付いた年齢を取り出すことができます。

辞書を使う際、注意しなければならないことがあります。それは辞書に登録されていない名前を指定するとエラーになってしまうことです。

例えば、先ほどのプログラムを実行し、けん、マイケル、梓を登録した後、あなたの名前は?という問いに対しゆうまと入力すると以下のようなエラーメッセージが出力され、プログラムが終了してしまいます。

Traceback (most recent call last):
  File "p01.py", line 8, in <module>
    print("あなたは現在", age[name], "歳です。")
KeyError: 'ゆうま'

これは、ageという辞書にゆうまという名前(キー)は登録されていないというエラーが発生したということを示しています。

このようなエラーを避けるため、以下のようにinを使用すると辞書に登録されているか否かをあらかじめ、確認し、処理を切り分けることができます。

if name in age:
    # 辞書に登録されている場合
else:
    # 辞書に登録されていない場合

この仕組みを使って、登録されていない名前を入力してもプログラムがエラー終了しないように書き換えてみます。

age = {}
for i in range(3):
    print(i+1, "回目:")
    name = input("あなたの名前は? ")
    age[name] = int(input("何歳ですか? "))

name = input("あなたの名前は? ")
if name in age:
    print("あなたは現在", age[name], "歳です。")
    if age[name] >= 20:
        print("あなたはお酒が飲めます。")
    else:
        print("あなたはお酒が飲めません。")
else:
    print(name, "さんは登録されていません。")

このプログラムを実行し、ゆうまと入力すると以下のようにエラーにはならず、正しく処理されます。

1 回目:
あなたの名前は? けん
何歳ですか? 63
2 回目:
あなたの名前は? マイケル
何歳ですか? 43
3 回目:
あなたの名前は? 梓
何歳ですか? 11
あなたの名前は? ゆうま
ゆうま さんは登録されていません。

関数

ある処理を何回も行いたい場合、同じ処理をコピペするのではなく、関数として定義し、その関数を呼ぶことで同じ処理を何回も行えるという仕組みがあります。

例えば年齢を判定してお酒が飲めるか否かを判断する部分を以下のようにdrinkという関数に書き換えてみます。

def drink(age):
    if age >= 20:
        print("あなたはお酒が飲めます。")
    else:
        print("あなたはお酒が飲めません。")
    return

def XXX(YYY):からreturnまでが関数の定義になります。ここでXXXの部分が関数の名前で、YYYの部分は関数の引数といって、関数に値を渡す仕組みになります 。引数はいくつ渡しても構いませんし、なくても構いません。複数の引数を渡す場合、引数引数の間には,を忘れずに入れてください。

では、先ほど定義したdrink関数を呼ぶように全体のプログラムを書き直してみましょう。

def drink(age):
    if age >= 20:
        print("あなたはお酒が飲めます。")
    else:
        print("あなたはお酒が飲めません。")
    return
age = {}
for i in range(3):
    print(i+1, "回目:")
    name = input("あなたの名前は? ")
    age[name] = int(input("何歳ですか? "))

name = input("あなたの名前は? ")
if name in age:
    print("あなたは現在", age[name], "歳です。")
    drink(age)
else:
    print(name, "さんは登録されていません。")

書き換えてファイルを保存したら、実行して、同じ結果になることを確認しましょう。

python3 p01.py

関数は、その関数を呼ぶ(使用する)前に定義しておく必要があります。ですからdef drink(age):以下の部分は、drink関数を呼ぶdrink(age[name])という部分より前に移動しています。

drink(age[name])のようにage[name]の値を引数として渡すと、drink関数の中ではage[name]の値が引数としてageという変数に変換され、変数ageが20以上か否かで、お酒が飲めるか否かを判断するようになっています。

また、関数の処理結果を値として返すこともできます。この値のことを戻り値と呼びます。戻り値を返す際は、最後のreturnの代わりにreturn 10のように戻り値を書きます。戻り値は、数値や文字列を直接入れてもいいですし、nのような変数でも構いません。戻り値がない場合は、returnだけになります。

先ほどのdrink関数を20歳以上か否かを戻り値(True/False)で返すように書き換えて見ましょう。

def drink(age):
    if age >= 20:
        return True
    else:
        return False
age = {}
for i in range(3):
    print(i+1, "回目:")
    name = input("あなたの名前は? ")
    age[name] = int(input("何歳ですか? "))

name = input("あなたの名前は? ")
if name in age:
    print("あなたは現在", age[name], "歳です。")
    if drink(age[name]):
        print("あなたはお酒が飲めます。")
    else:
        print("あなたはお酒が飲めません。")
else:
    print(name, "さんは登録されていません。")

drink()関数がお酒を飲める歳か否かを判断して、TrueFalse戻り値として返し、その戻り値に従って条件文(if)で以下の処理を切り替えています。

なお、戻り値がない場合は、returnを省略することも可能です。ただし、returnを入れておくと関数の終わりがわかりやすくなるので、できるだけ入れるようにしましょう。

このように関数は、自分で定義することもできますが、既にあらかじめ定義されている関数(組み込み関数)も沢山用意されています。 例えば今まで意識せずに使ってきたprint()input()も組み込み関数の一部です。これらの組み込み関数を活用することで、わざわざ自分で一から作らなくても色々な処理を簡単に行うことができます。

以上で基本的なpythonのプログラミングの仕組みの説明は終了です。