【技術書】独学プログラマー -第1部(2/2)-

はじめに
--
[(1)](https://qiita.com/giwasuke/items/a645d8852dc6132b61e4)の続きです。

目次
--
1. 第5章 コンテナ
2. 第6章 文字列操作
3. 第7章 ループ
4. 第8章 モジュール
5. 第9章 ファイル
6. 第10章 知識を1つにまとめる
7. 第11章 ハマったときの助け


第5章 コンテナ
---
- 「コンテナ」とは、書類棚のようなもので、データ構造を保持し、オブジェクトを保存しておける。3つの一般的なコンテナであるリスト、タプル、辞書を学ぶ。
- まず、関数に似たものとしてメソッドがある。特定のデータ型に密接に関連づけられている関数であり、オブジェクトに付けて呼び出す。

```python

"Hello".replace("o", "@")
>> 'Hell@'
```
詳細は、第二部で学ぶ。

- 「リスト」は、好きな順番でオブジェクトを保存しておけるコンテナ。list関数、もしくは角カッコで空のリストを作る。

```python
fruit = list()
# もしくは
fruit = []

# 初期化
fruit = ["Apple", "Orange", "Pear"]
fruit
>> ['Apple', 'Orange', 'Pear']

"Orange" in fruit
>> True
```

- 要素を追加するにはappendメソッド。どんなデータ構造のオブジェクトでも格納できる（←これがすごいところだ）。末尾から要素を取り除くにはpopメソッド。
- 文字列、リスト、タプルのように、繰り返し処理で要素を１つずつ取り出せるオブジェクトは、イテラブル（繰り返し可能）であるという。
- そして、リストはミュータブル（変更可能）であり、オブジェクトの追加・削除・入れ替えができる。
- 「＋」演算子でリストの連結。
- in演算子で、ある要素がリストに含まれているか調べる。

- 「タプル」はリストと違い、イミュータブル（変更不可能）なデータ構造。

```python

rndm = ("M. Jackson", 1958, True) # 一度定義したら変更できない（不変）
rndm
>> ("M. Jackson", 1958, True)
```

- 「辞書」は、キーとバリューとしてオブジェクトを保持するしくみ。dict関数、もしくは{}で定義。

```python

feeling = {"1": "happy",
           "2": "sad",
           "3": "sleepy"
          }
now = feeling["1"]
print(now)
>> happy
```

- コンテナの中に、コンテナを入れるようなこともできる。

第6章 文字列操作
--

- 文字列についてさらに深く学び、文字列を操作する有用な機能について説明。
- 複数行にわたる文字列を書くとき、三重クォートに挟む。

```python
"""line one
   line two
   line three
"""
```

- 文字列はイテラブルであり、インデックス指定して取り出せる。マイナスでインデックスを指定した場合、-1が一番右の要素となる。
- 文字列はイミュータブル。
- 文字列を足したり（連結）、かけ算したり（増やす）できる。
- 大文字小文字変換メソッド

```python

"We hold these truths...".upper()
>> 'WE HOLD THESE TRUTHS...'

"SO IT GOES.".lower()
>> 'so it goes.'

"four score and...".capitalize()
>> 'Four score and...'
```

- formatメソッドを使って、文字列の一部をあとで穴埋めして新しい文字列を返せる。次のような例で便利。(書式化)

```python

# プログラム利用者の入力値をもとに文字列をつくりたい

who = input("誰が")
do  = input("どうした")

r = "{}が{}。".format(who, do)
print(r)

>> '太郎が走った。'
```
- 他に、分割(split)、結合(join)、空白除去(strip)、置換(replace)包含(in演算子)、文字を探す(index)
- Pythonではバックスラッシュがエスケープ文字。\nで改行。

```Python
"彼女は\"そうだね\"と言った"
>> '彼女は"そうだね"と言った'
```

- スライスは、イテラブルなオブジェクトの一部分を取り出し、新しいオブジェクトを返す。リストや文字列に対して行える。

```python

ivan = "死の代わりにひとつの光があった。"
ivan[0:6]         # HDLっぽい
>> '死の代わりに'
```

第7章 ループ
--
- forループは、イテラブルを繰り返し処理するために使われる（反復処理）。
- 1回のループごとにイテラブルから渡される要素を、実行するコード群で使ったり、操作する。
- forループの構文:

```
for [変数名] in [イテラブル]
    [コードブロック]
```
変数名は、自由に指定できる。例を下に示す。

```python

name = "Ted"
for character in name:    #イテラブルの先頭要素から順に渡される
    print(character)

>> T
>> e
>> d
```

リストから要素を順に取り出す例：

```python

shows = ["GOT", "Narcos", "Vice"]
for show in shows:
    print(show)

>> GOT
>> Narcos
>> Vice
```

- Pythonには、各要素のインデックス値を自動的に用意してくれる、enumerate関数を使った方法がある。

```python

tv = ["GOT", "Narcos", "Vice"]
for i, new in enumerate(tv):   # リストtvをenumerate関数に渡す
    new = tv[i]                # インデックスを指す i が使える
    new = new.upper()
    tv[i] = new

print(tv)
>> ['GOT', 'NARCOS', 'VICE']
```

- 組み込み関数rangeは、整数を順番に生成する。2つの引数、整数れつの開始値と、終了値を指定できる。`range(1,11)`とした場合は、1~10の数字を生成する。

```python

for i in range(1, 11):
    print(i)

# 1, ..., 10を出力(11は含まない)
```
C言語などで繰り返しを行うときは、これに近い。

- whileループの構文は、次のようになる：

```
while [式]:
    [コードブロック]
```

while文のサンプルコード：

```python

x = 10
while x > 0:
    print('{}'.format(x))
    x -= 1
print("Happy New Year!")

>> 10
...
>> 3
>> 2
>> 1
>> 'Happy New Year!'
```

- continue、breakはC言語などと同じように使う。入れ子のループも書ける。

第8章 モジュール
--

- 10000行の大規模なプログラムを、全て1つのファイルに書こうとすると、読み書きするのが難しいし、デバッグも大変である。
- この問題を解決するために、プログラマーは大きなプログラムを複数に分割する。それぞれの分割したコードをPythonではモジュールと呼ぶ。Pythonファイルのこと。
- モジュールを使うには、まずインポートする。`import [モジュール名]`
- モジュール内のコードを利用したいときは`[モジュール名].[コード]`のようにする。[コード]は、関数や変数の名前。

```python

import math

math.pow(2, 3)
>> 8.0
```

- 自分の書いた.pyプログラムも、importして他のプログラム上で利用できる。
- モジュールをインポートすると、そのモジュールのコードはすべて実行される。それが困るなら、コードを`if__name__ == "__main__":`という文の下に書こう。

```python

if__name__ == "__main__":
    print("Hello!")
```
module1.pyをmodule2.pyでインポートすると、print関数は実行されずに済む。

```python

import module1

>>
```

第9章 ファイル
--

- まず、どのOSでも動作するファイルパスを組み立てるために、osモジュールを使おう。/Users/bob/st.txtというファイルを開きたいなら、次のようにする。

```python

import os
os.path.join("Users", "bob", "st.txt")

>> 'Users/bob/st.txt'
```
ファイルパスの扱いは、若干トラブルになりやすいので気をつける。

- open関数でファイルを開くとき、モードを指定できる。
`"r": 読み込み専用` `"w": 書き出し専用（既にあれば上書き、なければ新規作成）` `"w+": 読み書き両方できるようにファイルを開く。（あれば上書き、なければ新規作成）`

- open関数でファイルを開くのだが、「ファイルオブジェクト」というオブジェクトを返す。そのオブジェクトを介して、ファイルを読み書きする。書き込みはwriteメソッドで、終了はcloseメソッドで行う。

```python

st = open("st.txt", "w")        # st は、ファイルオブジェクト
st.write("Hi from Python!")     # ファイルオブジェクト(st)のメソッドwrite()
st.close()
```

- 日本語文字列を書き込む場合は、open関数の引数に`encoding="utf-8"`を加えること。
- ファイルの閉じ忘れを防止するために、ファイルオブジェクトを使う全てのコードをwith文の中に書こう。

```
with open([ファイルパス], [モード])as[変数名]:
    [コード]
```
ファイルのオープンにこの構文を使うと、[コード]が最後まで実行されたあと、ファイルが自動的に閉じられて便利。

```python

with open("st.txt", "w") as f:
    f.write("Hi from Python!")
```
with文のブロック中では、変数fがファイルオブジェクトを示す。

- readメソッドで、ファイルを読み込もう。

```python

with open("st.txt", "r", encoding="utf-8") as f:
    print(f.read())

>> Pythonからこんにちは！
```
ファイルがアスキー文字のみで書かれている場合でも、この開き方で問題ない。シフトJISなら`encoding="cp932"`を指定する。

- readしたファイルのコンテンツは、あとで使いやすいようにコンテナに入れておくとよい：

```python

my_list = []

with open("st.txt", "r") as f:
    my_list.append(f.read())

print(my_list)
>> ['Hi from Python!']
```

- データがカンマで区切られているCSVファイルも扱える。まず、書き込みの例から。

```python

import csv

with open("st.csv", "w", newline=") as f:
    w = csv.writer(f, delimiter=".")
    w.writerow(["one", "two", "three"])
    w.writerow(["four", "five", "six"])

"""
ファイルの中身は以下
one,two,three
four,five,six
"""
```

読み込みは次のように行う。csv.reader関数の返り値として、CSVを1行単位で扱えるイテラブルが返される。

```python

import csv

with open("st.csv", "r") as f:
    r = csv.reader(f, delimiter=",")
    for row in r:
        print(",", join(row))

>> one,two,three
>> four,five,six
```

第10章 知識を1つにまとめる
--

- これまで学んだ概念を1つのゲームプログラムでまとめる。初学者にとって、少し長いコードに思えるかもしれない。ハングマンという、古くからあるゲーム。
- コードの詳細は省く。（GitHubのリンクを貼ろうとしたが投稿禁止の内容に含まれた）
- このプログラムを理解して、改良したり、別のゲームを作ってみると良い経験になるかもしれない。

第11章 ハマったときの助け
--

- 日本語のPython公式ドキュメント(https://docs.python.org/ja/3/)
- 助けてもらうには... スタックオーバーフロー(https://ja.stackoverflow.com) や、日本の場合テラテイル(https://teratail.com/) など
- プログラミングコミュニティがどれほど友好的で助けになるかは、言葉では言い尽くせない。苦労して理解することも学習において大切だが、「ほかの人に助けてもらう」ことも重要である。困難に陥ったとき、質問サイトを見て似たような問題が投稿されているかを探し、見つからなければ、質問を投稿しよう。誰かが回答してくれるはずだ。
- 本書のコラムで、「プログラミングスキルを向上させるためにもっとも効果的なのはなんですか？」という問いに対していくつか箇条書きで回答がまとめられている。行き詰まったらまた見る。

感想
--
本に書かれていること、全てを理解しない。
軸になる基礎を中心に大体学んで、あとはコードを書きながらor必要に応じて調べよう。
[第2部](https://qiita.com/giwasuke/items/2d6813d0b77f0e3686ee)はこちら