今回はリストの機能からです。
リストに格納されているオブジェクトの一部を切り出す機能を「スライス」と言います。
リストの変数[始点:終点 + 1:ステップ]
次に例を書いてみます。
>>> numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> numbers[3:8]
[3, 4, 5, 6, 7]
例はnumbersのインデックス3からインデックス7までのオブジェクトを取り出して表示しています。
始点は3で良いのですが、終点は7ではなくて1を足した8を指定します。
また、インデックスが偶数のオブジェクトだけを取り出すには、
>>> numbers[::2]
[0, 2, 4, 6, 8]
の様にステップのみに2を指定します。スライスの始点と終点を省略すると、先頭から最後までが対象になります。
また、
>>> numbers[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
の様に「-1」を指定すると、オブジェクトの並び方を逆にしたリストを表示する事も出来ます。
for v in リストの変数:
処理(vに対する処理)
上記はfor文を使って、まとめて処理をする時の構文です。ここで注意すべきは「処理はインデントして記述する」事です。
C/C++ではforやwhile等を使った処理を書く場合は、コードの可読性を上げるためにわざとインデントをして記述していました。
しかしPythonでは、これがルール化されています。インデントをせずに記述すると、思ったような結果は得られません。
変数vにはリストのオブジェクトがインデックス順に格納されます。例としてnumbersのオブジェクトを10倍して表示する処理を書いてみます。
>>> for v in numbers:
... print(v * 10)
...
0
10
20
30
40
50
60
70
80
90
2つめの「…」の後ろでEnterキーを押すと、処理が実行されます。
リストのコピーを作りたいとき、幾つか注意すべき点があります。
>>> fruits1 = ["リンゴ", "メロン", "バナナ"]
>>> fruits2 = fruits1
>>> fruits2
['リンゴ', 'メロン', 'バナナ']
一見すると「fruits2 = fruits1」と書く事でfruits2にfruits1がコピーされたように見えます。またfrutes2を表示しても、fruits1と同じ内容が表示されています。しかしこのコードはC言語で言うところのポインタのコピーに過ぎず、実はfruits2もfruits1も同じオブジェクトを指しています。
>>> fruits1[1] = "イチゴ"
>>> fruits2
['リンゴ, 'イチゴ', 'バナナ']
の様にfruits1の中身を書き換えたのに、fruits2の内容まで変わっています。
実際にコピーをするには、リストが持っている関数「copy関数」を使います。
>>> fruits1 = ["リンゴ", "メロン', 'バナナ']
>>> fruits2 = fruits1.copy()
>>> fruits2
['リンゴ', 'メロン', 'バナナ']
>>> fruits1[1] = "イチゴ"
>>> fruits2
['リンゴ', 'メロン', 'バナナ']
上記のようにfruits1を書き換えても、copy関数でコピーされたfruits2には影響が有りません。
但し、次の例を見て下さい。
>>> fruits3 = ["リンゴ", ["メロン", "バナナ"]]
>>> fruits4 = fruits3,copy()
>>> fruits3
['リンゴ', ['メロン', 'バナナ']]
>>> fruits3[1][1] = "イチゴ"
>>> fruits4
['リンゴ',['メロン', 'イチゴ']]
fruits[1][1]をイチゴに変えたら、fruits4も変わってしまいました。これを解決するには、標準ライブラリにある「copy」ライブラリが持つ「deepcopy」関数を使います。
>>> import copy
>>> fruits3 = ["リンゴ", ["メロン", "バナナ"]]
>>> frutst4 = copy.deepcopy(fruits3)
>>> fruits3[1][1] = "イチゴ"
>>> fruits4
['リンゴ', ['メロン', 'バナナ']]
この様にfruits3[1][1]を変更してもfruits4は変わっていません。
Pythonではcopy関数を使ったコピーを「浅いコピー」、deepcopy関数を使ったコピーを「深いコピー」と呼ばれます。
以上、今回はレッスン4の後半部をザッと流して書いてみました。
次回以降はレッスン5から始めたいと思いますが、それにはまず豚が勉強を進めなければなりません。次回はC/C++でも学んだ「関数」について、少し学んで行くようです。
少し間が空くかも知れませんが、今日はここまで。