4日目のゴールとテーマ
4日目のテーマは「複数のデータを“まとめて扱う”力を手に入れる」です。
ここまでで、1つの値(1人の年齢、1つの金額)を扱うことはできるようになりました。
今日はそこから一歩進んで、
同じ種類のデータをまとめて持つ「リスト」
リストをくり返しでなめるパターン
簡単な「名簿アプリ(コンソール版)」を作る
ここまでを狙います。
キーワードは list(リスト)と for の組み合わせです。
リストとは何かをイメージでつかむ
「同じ種類のものを、順番付きで並べたもの」
リストは、「同じ種類のデータを、順番付きで並べたもの」です。
例えば、3人の名前を扱いたいとき、変数だけだとこうなります。
name1 = "太郎"
name2 = "花子"
name3 = "次郎"
Pythonこれでも動きますが、「4人目」「5人目」と増えた瞬間に、管理がつらくなります。
そこでリストです。
names = ["太郎", "花子", "次郎"]
Pythonこれで、「名前たち」をひとまとめにできます。names という“箱”の中に、3つの要素が順番に入っているイメージです。
リストの要素を取り出す:インデックス
「0番目から始まる」というルールに慣れる
リストの中身を1つずつ取り出すには、「インデックス(index)」を使います。
インデックスは「何番目か」を表す番号です。
names = ["太郎", "花子", "次郎"]
print(names[0])
print(names[1])
print(names[2])
Python実行結果はこうなります。
太郎
花子
次郎
ここで重要なのは、「0から始まる」というルールです。
0番目 → 最初の要素
1番目 → 2番目の要素
2番目 → 3番目の要素
最初は違和感がありますが、「リストは0スタート」と体に覚えさせてしまうのが早いです。
リストの長さを調べる:len関数
「何個入っているか」をコードから知る
リストに何個の要素が入っているかは、len 関数で調べられます。
names = ["太郎", "花子", "次郎"]
count = len(names)
print("人数は" + str(count) + "人です")
Python実行結果はこうです。
人数は3人です
len(names) は、「names の長さ(要素数)」を返します。
この「長さ」と「インデックス」を組み合わせると、
「リストの全員を順番に処理する」パターンが書けるようになります。
リストとfor文の相性は最強
「リストの中身を、1つずつ順番に処理する」
リストを使うときに、ほぼ必ずセットで出てくるのが for です。
例えば、全員の名前を表示したいとき。
names = ["太郎", "花子", "次郎"]
for name in names:
print(name)
Python実行結果はこうなります。
太郎
花子
次郎
ここで起きていることを分解します。
for name in names: は、「names の中から1つずつ取り出して、name に入れる」という意味
インデントされた print(name) が、要素の数だけくり返される
さっきの for i in range(...) と似ていますが、
今度は「数字の列」ではなく「リストの中身」をなめています。
この書き方は、Pythonらしいとても自然な書き方です。
「リストの全員に対して何かしたい」ときは、まずこの形を思い出してください。
インデックスが欲しいときのパターン
「何番目か」も一緒に扱いたい場合
ときどき、「要素そのもの」だけでなく「何番目か」も知りたいことがあります。
例えば、「1番: 太郎」「2番: 花子」のように番号付きで表示したいときです。
やり方は2つあります。
ひとつ目は、range と len を組み合わせる方法です。
names = ["太郎", "花子", "次郎"]
for i in range(len(names)):
name = names[i]
print(str(i) + "番目: " + name)
Python実行結果はこうです。
0番目: 太郎
1番目: 花子
2番目: 次郎
「0番目」から始まるのが気になるなら、表示だけ1足してもいいです。
print(str(i + 1) + "番: " + name)
Pythonもうひとつの方法は、enumerate という便利な関数を使うやり方ですが、
それはもう少し先でも大丈夫です。
今日は「range(len(...)) でインデックスを回せる」とだけ押さえておきましょう。
リストに要素を追加する:append
「あとから増やせる」ことがリストの強み
リストは、あとから要素を追加できます。
そのときに使うのが append です。
names = []
names.append("太郎")
names.append("花子")
names.append("次郎")
print(names)
Python実行結果はこうなります。
['太郎', '花子', '次郎']
ここでのポイントは、「最初は空のリストから始めて、あとから追加していく」というパターンです。
names = [] # 空のリスト
Pythonこの形は、アプリで「ユーザーの入力をどんどん溜めていく」ときの基本になります。
リストから要素を削除する:popとdel
「最後の1つ」か「指定した位置」か
削除の方法もいくつかあります。
まずは「最後の要素を取り除く」pop です。
names = ["太郎", "花子", "次郎"]
last = names.pop()
print("取り除いたのは " + last)
print(names)
Python実行結果はこうです。
取り除いたのは 次郎
['太郎', '花子']
pop() は、「最後の要素を取り除いて、その値を返す」関数です。
特定の位置の要素を消したいときは、del を使います。
names = ["太郎", "花子", "次郎"]
del names[1]
print(names)
Python実行結果はこうです。
['太郎', '次郎']
ここでは「1番目(2人目)の花子」が消えています。
インデックスで指定しているので、「何番目を消すか」を自分で決められます。
4日目のミニアプリ:コンソール版「簡易名簿アプリ」
名前を登録して、一覧表示する
ここまでの要素をつなげて、小さな「名簿アプリ(コンソール版)」を作ってみます。
仕様はこうです。
最初は空の名簿
ユーザーに名前を入力してもらい、リストに追加する
「空文字が入力されたら、入力を終了する」
最後に、登録された全員の名前を番号付きで表示する
コードはこうなります。
print("=== 簡易名簿アプリ 4日目バージョン ===")
names = []
while True:
name = input("名前を入力してください(終了するには何も入力せずEnter): ")
if name == "":
print("入力を終了します。")
break
names.append(name)
print(name + " さんを名簿に追加しました。")
print("=== 名簿一覧 ===")
if len(names) == 0:
print("1人も登録されていません。")
else:
for i in range(len(names)):
print(str(i + 1) + "人目: " + names[i])
Python流れを丁寧に追います。
最初に names = [] で空のリストを用意するwhile True: で「とりあえず無限ループ」を作る
毎回、名前を入力してもらう
もし空文字(何も入力せずEnter)なら、break でループを抜ける
それ以外なら、names.append(name) で名簿に追加する
ループが終わったら、名簿の中身を番号付きで表示する
ここでの重要ポイントは二つです。
ひとつ目、「空文字で終了」という条件を自分で決めていること。if name == "": のように、「終了条件」をコードで表現しています。
ふたつ目、「入力フェーズ」と「表示フェーズ」を分けていること。
まずは全部 names に溜めておいて、最後にまとめて表示しています。
この「一度リストに集めてから処理する」というパターンは、アプリでもよく使います。
もう一歩だけ:名簿に「年齢」も持たせてみる
リストの中に「複数の情報」を入れる考え方の入口
今は「名前だけ」の名簿ですが、
現実には「名前+年齢」など、1人あたり複数の情報を持たせたくなります。
その入口として、「名前と年齢をセットで扱う」バージョンを少しだけ覗いてみましょう。
シンプルなやり方のひとつは、「2つのリストを並行して持つ」方法です。
names = []
ages = []
while True:
name = input("名前を入力してください(終了するには何も入力せずEnter): ")
if name == "":
print("入力を終了します。")
break
age_text = input("年齢を入力してください: ")
age = int(age_text)
names.append(name)
ages.append(age)
print("=== 名簿一覧 ===")
for i in range(len(names)):
print(str(i + 1) + "人目: " + names[i] + "(" + str(ages[i]) + "歳)")
Pythonここでは、
names[i] が i番目の人の名前ages[i] が同じ人の年齢
という対応関係になっています。
本格的には「1人分を辞書(dict)で持つ」やり方に進んでいきますが、
今日は「リストを使えば、複数人分のデータをまとめて扱える」という感覚がつかめれば十分です。
4日目で一番大事な感覚
「同じ種類のデータは、リストにまとめてしまう」
今日あなたに持ってほしい感覚はこれです。
「名前が何人分もある」
「点数が何教科分もある」
「商品が何個分もある」
こういうときに、バラバラの変数で持つのではなく、
「リストにまとめる」という発想を持つこと。
そして、
リストの中身を1つずつ処理したいときは for
何人いるか知りたいときは len
あとから増やしたいときは append
このセットが自然に出てくるようになると、
「複数データを扱うアプリ」が一気に作りやすくなります。
4日目のまとめ
今日のキーポイントを短く整理すると、こうなります。
リストは「同じ種類のデータを順番付きで並べたもの」。names = [] で空のリストを作り、append でどんどん追加できる。for 要素 in リスト: で、リストの全要素を1つずつ処理できる。len(リスト) で「何個入っているか」が分かる。
リストを使うと、「名簿」「商品一覧」「点数表」など“複数データのアプリ”が作りやすくなる。
もし余裕があれば、今日の名簿アプリを少しアレンジしてみてください。
例えば、
「削除したい番号を入力すると、その人を名簿から消せる」機能を足す
「人数が3人以上になったら、『たくさん登録されましたね』とコメントする」
「同じ名前が入力されたら、『同姓同名です』と表示する」
など、リストを“生きたデータ”として扱う練習をしてみると、
一気に「アプリを作っている感覚」が強くなってきます。
