Pythonビギナーズガイド（変数・配列編）

# 概要
何回かに渡り、python3の初学者向けの記事を書こうかと思います。
基本的に[オライリー本の入門Python3](https://www.oreilly.co.jp/books/9784873117386/)を購読して、まとめた記事です。
自分の復習用のメモですが、誰かの役に立つかも・・・と思い、投稿しました。 
読者はPythonプログラミング初級者を想定しております。

今回は、第２章「数値・文字列・変数」／第３章「リスト・タプル・辞書・集合」についてまとめます。

## 第2章：数値・文字列・変数
２章は他の言語を学習したことがある人であれば、特に知らないといけないことは無さそう。
強いていうと、型を気にせず宣言できるとことぐらいでしょうか・・・

< 重要なこと >

* 数値・文字列の振る舞いは基本的に他言語と同様。  
注意スべきは、<Font color='red'>Pythonはすべて（ブール値、整数、浮動小数点、文字列、もっと大きなデータ構造、関数、プログラム）がオブジェクト</Font color>として実装されている。  
C・Java・C#などとは違い、変数の型を気にせず宣言できる。
* 組み込み関数をオーバーライドできるため、書き換えてしまう危険性あり

```
print(__import__('keyword').kwlist)  # 予約語一覧

for funcs in dir(__builtins__):
    print(funcs)  # 定義済み組み込み関数一覧

str = "hoge"  # 定義済み組み込み関数はオーバーライド可能(危険)
print(str)  # hoge
str(2016)  # TypeError

# None = "huga"  # 
```
* pythonは整数オーバーフローを起こさない
* エスケープは`\`（バックスラッシュ）
* print()で出力するときの改行は`\n`
* <Font color='red'>3項演算子が特殊</Font>

```sample.py
foo = x if (x >= 0) else -x # Pythonの3項演算子
```

```sample.c
foo = if (x >= 0) ? x : -x; //c,java,jsなどの3項演算子
```

* 文字列周りの操作が少しだけ、変わったことができる（以下参照）

####文字列・配列の独特な操作

|表現|意味|
|:---:|:---|
|[0]|配列・文字列の1番目（先頭）を取得|
|[5]|配列・文字列の6番目を取得|
|[0:5]|配列・文字列の1番目から5番目まで取得（6番目を含まない）|
|[:5]|配列・文字列の1番目から5番目まで取得（開始位置を省略すると先頭から）|
|[5:]|配列・文字列の6番目から最後まで取得（終了位置を省略すると最後まで）|
|[:]|配列・文字列の全部を取得（先頭から最後まで）|
|[-1]|配列・文字列の最後から数えて1番目（最後）を取得|
|[-5:-1]|配列・文字列の最後から数えて5番目以降最後から2番目まで取得（[-1]を含まない）|
|[::5]|配列・文字列を5ステップごとに取得|
|[::-5]|配列・文字列を5ステップごと後ろから取得|
|[::-1]|配列・文字列を逆順から取得| 


####算術演算子(整数の除算と冪乗は他言語と違うかも・・・)

|演算子|意味|例|結果|
|:---:|:---:|:---:|:---|
| + |加算|5+3|8|
| - |減算|5-3|2|
| * |乗算|5*3|15|
| / |除算|5/3|1.6|
| // |整数の除算（切り捨て）|5//3|1|
| % |剰余|5%3|2|
| ** |冪乗|5**3|125|

####配列・文字列を操作する関数

|表現|意味|
|:---:|:---|
|len(var)|varの長さ|
|var.split(",")|var（文字列）を","ごとに区切って配列を返す|
|",".join(var)|var（文字列か文字列配列）を","で結合した文字列を返す|
|var.replace(",", "")|var（文字列）を置換し、新しい文字列を返す(この例では","を""に置き換える)|

## 第3章：リスト・タプル・辞書・集合
3章も他の言語を学習したことがある人であれば、特に問題は無さそう。
しかし、Pythonライクな書き方（イテレータを上手く活用した書き方）がある。 
<Font color='red'>「for文」の書き方に関して、初めは違和感を覚えるかもしれない。
慣れれば「in」を使った、配列内の要素へアクセスする記述は便利です。</Font color>

< 重要なこと >

* 負のインデックスを使えば、末尾から逆に数えて要素にアクセスができる。('arr[-1]'のような表記）
* 負のインデックスを上手く活用して、配列を逆順から取得する方法は　'arr[::-1]'
* リストの中にリストを作成し、多次元配列を実現できる。 

```py3
two_dim_array = [["hoge", "huga"], [0, 1, 2], False]  # リスト内リスト
print(two_dim_array[1][0])  # output = 0
```
* 配列の結合はextend()または+=を使用する
* 辞書内のキーの順序は決まっておらず、要素を追加した順番とは限らない
* Pythonのリスト、タプル、辞書、集合は、色々な型の変数を混ぜて使用することができる

```py3
list_sample = ["hoge", 0, False]
tuple_sample = ("hoge", 0, False)
dict_sample = {0: "hoge", "huga": 0, 1: False}
set_sample = set("hoge", 0, False)
```
* for-in-,if-in-など、配列の要素にアクセスする記述にinを用いる

####リスト周りの記述方法

|名称|書き方|
|:---:|:---:|
|リスト|foo = ['tom', 'mike', 'nancy', 'jenny', 'jack']|
|タプル|foo = ('tom', 'mike', 'nancy', 'jenny', 'jack')|
|辞書|foo = {'tom': 20, 'mike': 21, 'nancy': 'unknown', 'jenny': 12, 'jack': 55}|
|集合|foo = set('tom', 'mike', 'nancy', 'jenny', 'jack')|

* タプル：重複不可の配列
* 辞書：KEYとVALUEをセットにした配列（連想配列）
* 集合：辞書からKEYのみを残した配列？


####多次元配列の書き方
* 数値計算ライブラリとして有名なnumpyの中に、配列を扱うクラスが用意されています。  
配列を扱う'numpy.ndarray'を利用して多次元配列を扱う。ただし、'numpy.ndarray'には以下の制約がある。

>  * 配列内要素の型は全て同じ
>  * 配列長は固定 (固定長配列)
>  * 配列の各次元の要素数は同じ

また、numpyを利用せずライトに使用したい場合は、` arr = [[]]`でも動く。
推奨されていないアンチパターンかもしれませんので、調べておきます。

####リスト操作関数

|関数|意味|
|:---:|:---|
|append( val )|リストの末尾に1つの要素を追加|
|extend( arr )|リストの末尾に配列（複数要素）を追加|
|insert( index, val )|リストの指定したインデックスに要素を追加|
|del( index )|インデックスで指定したリストの要素を削除|
|remove( val )|リストから指定した値をもつ要素を削除|
|pop()|要素のポップ|
|index( val )|リストから指定した値をもつ要素のインデックスを取得|
|count( val )|リスト内で指定した値をもつ要素の数を取得|
|join( arr )|リストの文字列への変換（split関数の逆）|
|sort( reverse= True/False )|リストをソートする（数値なら昇順,文字列ならアルファベット順）|
|len( arr )|リスト内要素数を取得|

※valは変数、arrは配列を表します。
####辞書操作関数

|関数|意味|
|:---:|:---|
|update( dict )|辞書の結合|
|del( key )|指定したkeyをもつ要素の削除|
|clear( )|全要素削除|

※valは変数、arrは配列、dictは辞書を表します。

<Font color='red'><注意事項> 
update( dict )を使用するときは、複数の要素をもつ辞書を追加するときに使用する。 
1つの{key:value}を追加したいときは、'='で代入することで追加される。
(ただし、keyがダブっている場合は上書きされてしまうので注意)</Font color>

```py3
dict_sample = {"red": 100, "green": 0, "blue": 200}
dict_sample2 = {"cyan": 50, "magenta": 60, "yellow": 70, "key_plate": 80}
dict_sample.update(dict_sample2)  # 辞書の結合
# > dict_sample = {"red": 100, "green": 0, "blue": 200, "cyan": 50, "magenta": 60, "yellow": 70, "key_plate": 80}
dict_sample["black"] = 123  # keyが重複していなければ、追加されます
# > dict_sample = {"red": 100, "green": 0, "blue": 200, "cyan": 50, "magenta": 60, "yellow": 70, "key_plate": 80, "black": 123}
dict_sample["red"] = 123  # keyが重複していたら、上書きされます
# > dict_sample = {"red": 123, "green": 0, "blue": 200, "cyan": 50, "magenta": 60, "yellow": 70, "key_plate": 80, "black": 123}
```
####集合操作関数

|関数|演算|意味|例|
|:---|:---|:---|:---|
|set1.union( set2 )|set1 &#124; set2|和集合|{1,2,3} &#124; {2,4,6} ⇒ {1, 2, 3, 4, 6}|
|set1.intersection( set2 )|set1 & set2|積集合（共通集合）|{1,2,3} & {2,4,6} ⇒ {2}|
|set1.difference( set2 )|set1 - set2|差集合|{1,2,3} - {2,4,6} ⇒ {1, 3}|
|set1.symmetric_difference( set2 )|set1 ^ set2|排他的OR（どちらか片方のみに属する）|{1,2,3} ^ {2,4,6} ⇒ {1, 3, 4, 6}|

※setは集合を表します。

####for,inとの組み合わせ
Pythonのfor文は「初期化式; 継続条件式; 再初期化式」を組み合わせた形の実装は行わない。 
そのため、C,C++などで書くような書き方はしない。
JavaScript,Javaなどで用意されているfor-each文のように、配列や辞書の全ての要素に含まれる値を取り出していく書き方と類似している。

```py3
list_sample = ["hoge", "huga", "hage"]
# Pythonのfor文のアンチパターン
for x in range(0, len(list_sample)):
    print(list_sample[x])  # 配列の要素を1つずつ表示
# Pythonのfor文パターン
for x in list_sample:
    print(x)  # 配列の要素を1つずつ表示
```
辞書に関しても、for文と上手く組み合わせて全ての要素に含まれる値を取り出していくことができます。

```py3
dict_sample = {"red": 100, "green": 0, "blue": 200}
# Pythonのfor文パターン(辞書のkeyのみ)
for k in dict_sample.keys():
    print(k)  # 辞書のkeyを1つずつ表示
# Pythonのfor文パターン(辞書のvalueのみ)
for v in dict_sample.values():
    print(v)  # 辞書のvalueを1つずつ表示
# Pythonのfor文パターン(辞書のkey,value両方)
for k, v in dict_sample.items():
    print(k + ":" + str(v))  # 辞書の中身を1つずつ表示
```

####if,inとの組み合わせ
inは条件式として利用することも多々あります。
リスト・タプル・辞書・集合内に指定した要素があるか有無の判定ができます。 
(辞書の場合はkeyの有無の判定)

```py3
list_sample = ["hoge", "huga", "hage"]
if "hoge" in list_sample: # True
    pass
```