Python | 2週間で身につく、アプリを作りながら学ぶPythonの基本 - 4日目

Python Python
スポンサーリンク

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つあります。

ひとつ目は、rangelen を組み合わせる方法です。

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人以上になったら、『たくさん登録されましたね』とコメントする」
「同じ名前が入力されたら、『同姓同名です』と表示する」

など、リストを“生きたデータ”として扱う練習をしてみると、
一気に「アプリを作っている感覚」が強くなってきます。

タイトルとURLをコピーしました