Python学習2日目～基本的な文法第二回～

## 変数
値を記憶しておくための領域

### 変数はオブジェクトを参照する

~~~Python:example.py
x = 123
y = z = 456
~~~

例えば上記のようなリストがあったとしてyとzはそれぞれ別の変数だが、同一オブジェクトとなる
(id関数使えばわかる)

### デリミタ
区切り文字(,;とか)

## 演算子

|演算子|機能|備考|
|:----:|:----:|:----:|
|+|加算||
|-|減算||
|*|乗算||
|/|除算||
|//|整数除算。計算結果にfloor関数が適用される|5 // 2 だと結果は2に、5.0 // 2 は2.0になる|
|%|剰余|割り算の余り|
|**|べき乗||

### 演算子の優先順位

ちょっと長いので省略。
下記リンクを参照。

https://www.javadrive.jp/python/num/index3.html

基本的には日常的に使ってる計算とあまり変わりないが、Pythonの場合は関数が優先されるケースがあるため注意が必要

## イミュータブルとミュータブル
大前提として数値や文字列といったPythonの組み込み型はすべてオブジェクトとして扱われる。

### イミュータブル
変更不可能。
数値や文字列はイミュータブルなオブジェクト。

### 文字列が連結できる原理
文字列はイミュータブルなオブジェクトにもかかわらず連結できる理由は元の文字列を一つのオブジェクト、連結する文字列を新たなオブジェクトという感じにオブジェクトを連結するイメージなので、連結できる。

### ミュータブル
変更可能。
リスト、タプル、辞書、集合はミュータブルなオブジェクト。

## インデックス
整数を使用して要素を指定する

~~~Python:example.py
x = 'apple'
print(x[1])
~~~

~~~:実行結果
p
~~~

文字列はイミュータブルなので、インデックスを使って置き換えすることはできない。

## スライス
複数の整数を使って要素の範囲を指定する。
開始インデックスと、　終了インデックスを使用。

~~~Python:example.py
# 開始インデックスと終了インデックスまでを指定
文字列[開始インデックス:終了インデックス]

# 先頭から終了インデックスまで指定
文字列[:終了インデックス]

# 開始インデックスから末尾まで指定
文字列[開始インデックス:]

# 先頭から末尾まで指定
文字列[:]
~~~

ちなみにスライスを使えばイミュータブルなオブジェクトでも置き換えることが可能。

~~~Python:example.py
x = 'hello.txt'
x[:5] + '-' +x[6:]

>>>'hello-txt'
~~~

### ストライド
スライスの機能の3つめの値。増分。
指定した個数ごとに要素を取り出す。

~~~Python:example.py
x = '-W-E-L-C-O-M-E-'
x
>>>'-W-E-L-C-O-M-E-'

x[1::2]
>>>'WELCOME'
~~~

## メソッド
オブジェクトに対する処理をまとめたもの
関数との違いはオブジェクトに対する操作、処理であるということ。

### メソッドの呼び出し方
文字列に関するメソッドの呼び出し方

~~~Python:example.py
文字列.メソッド名(引数,...)
~~~

### 組み込み型メソッド

|メソッド名|使い方|書き方|備考|
|:-:|:-:|:-:|:-:|
|upper|文字列を大文字にする|文字列.upper()|
|lower|文字列を小文字にする|文字列.lower()|
|startwith|先頭が指定した接頭辞から始まるときにTrueを返す|文字列.startwith()|
|endwith|末尾が指定した接尾辞で終わるときにTrueを返す|文字列.endwith()|
|replace|文字列の一部を置き換える|文字列.replace(旧文字列,新文字列,個数)|
|copy|リストのコピー|変数 = リスト.copy()|
|append|リストに値を追加する|リスト.append(値)|
|expand|リストに要素(イテラブル)を追加する|リスト.expand(イテラブル)|
|pop|リストの要素を削除する|リスト.pop(インデックス)|
|remove|値を指定して要素を削除|リスト.remove(値)|
|insert|リストに要素を追加|リスト.insert(インデックス,値)|
|clear|リストを空にする|リスト.clear()|
|split|文字列をリストに変換|文字列.split(デリミタ)|
|join|リストを文字列に変換|'デリミタ'.join(イテラブル)|
|count|指定した値に一致した要素の個数を取得|リスト.count(値)|
|index|要素のインデックスを取得|リスト.index(値,開始インデックス,終了インデックス)|
|sort|リストの並べ替え|リスト.sort()|
|add|集合に値を追加|集合.add(値)|
|discard|集合から要素を削除|集合.discard(値)|

その他にもたくさんあるで

https://docs.python.org/ja/3/library/stdtypes.html

## リスト
シーケンスでミュータブルなデータ構造

リストに格納する値の型は複数格納可能。
例えば文字列、整数などを混在させることができる。

### 使い方

[]で指定する

~~~Python:example.py
x = ['A','B','C','D']
x
>>>['A','B','C','D']
~~~

### list関数
イテラブル(繰り返し可能なオブジェクト)であれば使用可能。

~~~Python:example.py
list(range(10))
>>>[0,1,2,3,4,5,6,7,8,9]
~~~

### その他
##### len関数をリストに使うと

~~~Python:example.py
len(リスト)
~~~

リストの要素数を返してくれる。

#### minとmax

~~~Python:example.py
min(イテラブル) # 要素の最小値を取得
max(イテラブル) # 要素の最大値を取得
~~~

## タプル

* 複数のデータの格納に向いている
* シーケンス
    * インデックスやスライスが使える
* イミュータブル
    * 要素の変更、追加、削除はできない

### 作成方法

~~~Python:example.py
(値,値,...)
# 括弧を省略しても作成は出来る
~~~

~~~Python:example.py
tuple(イテラブル)
~~~

### タプルにインデックスとスライスを使用する

~~~Python:example.py
# インデックス
タプル[インデックス]

# スライス
タプル[開始インデックス:終了インデックス:ストライド]
~~~

### タプルの使い道

例えば、商品の名前、価格、カロリーを格納したいときに使える。

処理が高速

## 集合

* 値が含まれているかどうかを瞬時に判断できるデータ構造
* ミュータブル
    * 要素の追加・削除ができる
* 値を取り出すときの順序は保証されていない
* イミュータブルな値だけを格納することができる

商品の色やサイズの一覧などの、**重複しない**値を格納するのに向いている。

### 作成

~~~Python:example.py
{値,...}

set(イテラブル)

# 空の場合
set{}
~~~

#### set関数(クラス)の補足

~~~Python:example.py
set('qiita')
>>> {'a', 'i', 'q', 't'}
~~~

set関数にて文字列を指定すると分割して集合にしてくれる。
更に重複した文字は1文字だけ格納してくれる。

### 値の有無を調べる

~~~Python:example.py
q = set('qiita')

# 含まれているか確認
'i' in q
>>> True

# 含まれていないか確認
'b' not in q
>>> True
~~~

### 集合特有の演算

|使い方|結果|
|:-|:-|
集合 A \| 集合 B|集合Aまたは集合Bに含まれる要素の集合(和集合)
集合 A & 集合 B|集合Aかつ集合Bに含まれる要素の集合(積集合)
集合 A - 集合 B|集合Aかつ集合Bに含まれる要素を削除した集合(差集合)
集合 A ^ 集合 B|集合Aまたは集合Bの片方だけに含まれる要素の集合(対称差)
集合 A \|= 集合 B|集合Aに集合Bの要素を追加
集合 A &= 集合 B|集合Aから集合Bに含まれない要素を削除
集合 A -= 集合 B|集合Aから集合Bに含まれる要素を削除
集合 A ^= 集合 B|集合Aに集合Bの要素を追加し、両者に共通する要素を削除

~~~Python:example.py
# 2つのリストを作成する
a = {'blue' , 'red' , 'green' , 'yellow'}
b = {'black' , 'red' , 'green' , 'yellow' , 'pink'}

# 和集合
a | b
>>> {'black', 'blue', 'green', 'pink', 'red', 'yellow'}

# 積集合
a & b
>>> {'green', 'red', 'yellow'}

# 差集合
a - b
>>> {'blue'}

# 対称差
a ^ b
>>> {'black', 'blue', 'pink'}
~~~

## 辞書

* キーと値の組み合わせで格納できるデータ構造
* ミュータブル
* 同じキーを重複して格納することはできない
    * 値は重複してもよい
* イミュータブルなキーだけを格納することができる
    * 値はミュータブルでもよい
* キーを取り出すときの順序はキーを格納した順序に一致する

### 作成方法

~~~Python:example.py
{キー : 値,...}

dict(イテラブル)
dict(キー = 値,...)
~~~

### 辞書の中身を取得

~~~Python:example.py
辞書[キー]

# 辞書の値を取得
辞書.get[キー,デフォルト値]

# 要素の追加
辞書[キー] = 値
~~~

### 辞書ビューオブジェクト
辞書を閲覧するためのオブジェクト

~~~Python:example.py
# キーの一覧を取得
辞書.keys()

# 値の一覧を取得
辞書.values()

# キーと値の組の一覧を取得
辞書.items()
~~~