レッスン 22
レッスンの目標⌗
パイソンの基本をもっと勉強してみましょう
前回の続きです。
リスト(配列)⌗
前回、最終的に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回目の名前と年齢が表示されてしまいました。なぜでしょう?
name
やage
という変数にはそのままでは値は1つしか入りません。そのため1回目にけんという値をname
という変数に入れても、2回目にはマイケルに、3回目には梓に書き変わってしまい。表示するときには毎回最後に書き換えた梓という値とその年齢が表示されてしまいます。
これを解決するため、変数に複数の値を入れることができるようにする仕組みをリスト(配列)
といいます。
name
とage
という変数を以下のように書き換えてみましょう。
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 歳です。
私はお酒が飲めません。
name
やage
に複数の値を入れたり、出したりすることができるようになりました。
ここで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()関数
がお酒を飲める歳か否かを判断して、True
かFalse
を戻り値
として返し、その戻り値
に従って条件文(if)
で以下の処理を切り替えています。
なお、戻り値
がない場合は、return
を省略することも可能です。ただし、return
を入れておくと関数の終わりがわかりやすくなるので、できるだけ入れるようにしましょう。
このように関数
は、自分で定義することもできますが、既にあらかじめ定義されている関数(組み込み関数)
も沢山用意されています。
例えば今まで意識せずに使ってきたprint()
やinput()
も組み込み関数の一部です。これらの組み込み関数を活用することで、わざわざ自分で一から作らなくても色々な処理を簡単に行うことができます。