python Dive Into Python3 第2章　データ型

参考本：http://diveintopython3-ja.rdy.jp/native-datatypes.html
今日もやる。よろしくdive into python。

#####データ型
pythonではすべての値がデータ型を持っている。しかし、変数のデータ型を宣言する必要はない。楽だよね。
pythonは代入されたときの値で何の型か把握し、内部的に追跡してくれる。

1. ブール値。boolean：True or false
2. 数値：整数1,2,4 浮動小数点1.1, 1.2 分数1/2　複素数さえ表してやらァ。
3. 文字列：Unicode文字の並べ（シーケンス)。シーケンスはforの範囲として使えるのぜ。 例）HTMLドキュメント。
4. バイト列、バイト配列： 例)JPEG画像。←へー。初めて知った。
5. リスト：値のシーケンス。要素は順序付けされる
6. タプル。初見：値のシーケンス。リストとの違いはイミュータブル。後述だって。要素は順序付けされる
7. 集合。初見：値をつめこんだ袋。順序付けなし
8. 辞書。i know。キーと値のペアをつめた袋。順序付けなし
コレら以外にも多数の型が存在。
**pythonはあらゆるものがオブジェクト**。モジュール、関数、クラス、メソッドとかの型も存在。
例）モジュールは名前をもつ。関数はdocstringを持つ。など


#####2.2 ブール値
真。偽。どちらかのみを表す。True。False。
if文などで、式を評価した結果はブール値であることを要求される。ブール値のコンテクスト(context:文脈)と呼ばれる。事実上どんな式でも使える。すげー。
ex)humansize.pyから


```
if size < 0:
    raise ValueError('number must be non-negative')
```
size 整数
0 整数
< 数値演算子。
size < 0の結果は常にブール値になる。
pythonシェルでsizeに適当に代入して,size<0をやればTrueかFalseかエラーだね。

またpythonシェル上で
True + True = 2
True - False = 1
True * False = 0
True / False 0除算エラー
つまりTrueは１。Falseは０としても扱われている。
ただこれはやるなよ！お姉さんとの約束だぞだと。生理的に無理らしい。


######2.3 数値
数値は素晴らしい。選択肢が膨大だから。（ほんと？選択肢が多すぎると面倒くさいぞ…。）
pythonは整数と浮動小数点の両方サポートしている。
２つを区別するための型宣言は存在しない。小数点があるかないかで区別をしている。

```
>>> type(1)                 ①
<class 'int'>
>>> isinstance(1, int)      ②
True
>>> 1 + 1                   ③
2
>>> 1 + 1.0                 ④
2.0
>>> type(2.0)
<class 'float'>
```

①type()関数は、値や変数の型を調べることが出来る
②値や変数が特定のデータ型か調べるには、isinstance()関数。instanceはsじゃなくcだ。
③int　+ int  　　→ int
④int + float 　　　→ float intからfloatにpythonが強制的に型変換してからfloatを加算。結果float
遊びで試した。
size = 1　   →　int
size + 31.5    → float
int(size)　   → 32と表示される
type(size)    → float　代入してないからな。
代入したつもりではまりそうだ。


#####2.3.1　整数から浮動小数点数への型強制。またその反対
float(int)
int(float)関数で型を変換できる。
round()は四捨五入で小数点以下切り捨て。

```
>>>int(-2.5)
-2
```

#####2.3.2　一般的数値演算

```
>>> 11 / 2      ①
5.5
>>> 11 // 2     ②
5
>>> −11 // 2    ③
−6
>>> 11.0 // 2   ④
5.0
>>> 11 ** 2     ⑤
121
>>> 11 % 2      ⑥
```

1. int型同士の割り算でも、浮動小数点数の除算を行う。つまりfloatを返す
2. //演算子。始めてみたコレ。結果が正なら、整数へ切り捨て。0.5は切り捨てられた
※//は整数除算と呼ぶ。
3. 負の数を//で整数除算する場合。最も近い整数に繰り上がる。
数学的には-5より-6のが小さいから繰り下げだが。-5.5は-6になる。
-11.2//2は -6 だ。
-10.8//2は -6　だ。負の数ならより小さくなるほうに合わせられるようだ。
4. //の整数除算でもfloat型に使われるとfloat型で帰ってくる。
5. ** も初めてみた。**は「べき乗」を意味する。11 * 11だ。
11^2だ。つまり１２１だ。
6. %は整数除算の余りを返す11/2は5あまり１。ゆえにあまりの１が表示。西暦２０１５年とかの下二桁をとるのに % 100で１５がとれる。


#####2.3.3 分数

```
>>> ｆrom fractions import Fraction      ①
>>> x = Fraction(1, 3)                  ②
>>> x
Fraction(1, 3)
>>> x * 2                               ③
Fraction(2, 3)
>>> Fraction(6, 4)                      ④
Fraction(3, 2)
>>> Fraction(0, 0)                      ⑤
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "fractions.py", line 96, in __new__
    raise ZeroDivisionError('Fraction(%s, 0)' % numerator)
ZeroDivisionError: Fraction(0, 0)
```

1. 分数を使うためにfractionsモジュールからFractionだけimport。例ではfractionsまるごとimportしてた。
2. Fraction(a, b)関数でaが分子。bが分母になる。
3. 四則演算ならなんでもできるってさ。新しいFractionオブジェクトが返ってくる。2/3 * 2 = 4/3
4. Fractionオブジェクトでは自動的に約分される
5. 分母ゼロの分数は許されないって。


####2.3.4　三角法
πとかsin,tanとかも使える。

```
>>> import math
>>> math.pi                ①
3.1415926535897931
>>> math.sin(math.pi / 2)  ②
1.0
>>> math.tan(math.pi / 4)  ③
0.99999999999999989
```

1. mathは円周率π(円の周りの長さと直径の比)の定数がある
2. mathには基本的三角関数sin(),cos(),tan（）, asin()などもはいってる。
3. pythonにも有効桁数がある。tan(π/4)は1.0のはずが、0.99999999以下略となってしまう。


#####2.3.5　ブール値のコンテクストでの数値
数値はif文のようなbooleanのコンテクストで使える

```
>>>if 0:
    print("True")
>>>else:
    print("False")
False
```

この場合,Falseが表示される。
数値は０の場合,False
数値が０以外の場合、Trueになる

```
if size == 0 or 21:
    print("True")
```

pythonだとsizeの値に関わらずこの場合必ずTrueになる。
21が常にTrueを返すからだ。前ハマった。


```
if size == 0 or size == 21:
　　　　print("True")
```

この場合、条件文に当てはまった場合のみ通る。　　　　　　

```
>>> def is_it_true(anything):    まる１
...     if anything:
...         print("yes. true")
...     else:
...         print("no, false")
... 
>>> is_it_true(1)                         
yes. true
>>> is_it_true(-1)
yes, it's true
>>> is_it_true(0)                         ②
no, it's false
>>> is_it_true(0.1)                       ③
yes, it's true
>>> is_it_true(0.0)
no, it's false
>>> import fractions
>>> is_it_true(fractions.Fraction(1, 2))  ④
yes, it's true
>>> is_it_true(fractions.Fraction(0, 1))
no, it's false
```

1. インデントが当然必要だが、pythonシェル上で独自の関数を定義できる。初めて知ったわ。各行の終わりでEnterで次の行に移れる。空行でEnterを押すと完了。
２． ０はFalse。
3. 0でない浮動小数点数はTrue。0.0はFalse。
でかい桁で0を返さず0.0000000000001とか起きることがあるって。ナビィ「listen。気をつけてリンク」
4. 分数もつかえる。



#####2.4 リスト
pythonにおいてリストとは、
「サイズを予め宣言する必要はない、同じ型の要素以外も含むことができる」だけじゃない。
これよりずーっと素晴らしいものがリストだ。
pythonでは変数名はなんでもよく。pythonが内部的にデータを追跡してくれる。
```
a_list = ["a", "b", "mp", "z", "example"]
```

1.リストは元の順番通りに保持される。
2.リストはlist_name[0]でindex番号0からはじまる配列のように扱える。**a_list[0]はa_listの最初の要素だ。**
3.要素数が5個なら最後のindex番号は4。0-4の５個。
4.負のインデックスはa_list[-1]　は　"example"が表示される。後ろから逆順に要素にアクセスする。空でないならリストの最後は常にa_list[-1]かつa_list[len(a_list)-1]だ。
負のインデックスは：a_list[-n] == a_list[len(a_list) - n]　とも言いかえられる。
n=２のとき。 
a_list[len(a_list) - 2 ] は
a_list[5 - 2]となる。a_list[3]の"z"がでる。

#####2.4.2　リストのスライス
a_list[a, b]とa,bで２つのインデックスを指定すると、リストの一部を取得できる。スライスと呼ぶ。
戻り値はa_list[a] ~ a_list[b]を含まない直前まで。

```
>>> a_list = ["a", "b", "mp", "z", "example"]
>>> a_list[-1]
'example'
>>> a_list[1:3]                           ・・・1
['b', 'mp']
>>> a_list[1:-1]                          ・・・2
['b', 'mp', 'z']
>>> a_list[0:4]                           ・・・3
['a', 'b', 'mp', 'z']                     ・・・4
>>> a_list[:3]
['a', 'b', 'mp']                          ・・・5
>>> a_list[3:]
['z', 'example']                          ・・・6
>>> a_list[:]
['a', 'b', 'mp', 'z','example']　　　　　　　　　　　　　　　　・・・7
```

1.２つのインデックスの指定で、リストの一部を取得できる。[a:b]とかく。これがスライス。
２．　スライスは要素番号が負の数でも働く。スライスのときに指定された１つ目の要素から、２つ目のほしくない要素までが戻り値だ。と言いかえてもいい。
3.　0なら最初から。
４．　 ０のときは省略も出来る。[:3]は[0:3]だ
５． スライス指定の右側もリストと同じ長さなら省略できる。[3:]はつまり[3:len(a_list)]だ。
6.[:]とどちらも省略されたら、リスト全てだ。**しかしこれはa_listのコピーであって、元のリストではない。**a_list[:]は元のリストの完全なコピーを作るのに使える
───────
1. ２つのインデックスの指定で、リストの一部を取得できる。[a:b]とかく。
2. スライスは要素番号が負の数でも働く。スライスのときに指定された１つ目の要素から、２つ目のほしくない要素までが戻り値だ。と言いかえてもいい。
3. 0なら最初から。
4. ０のときは省略も出来る。[:3]は[0:3]だ
5. スライス指定の右側もリストと同じ長さなら省略できる。[3:len(a_list)]だ。
6. [:]とどちらも省略されたら、リスト全てだ。しかしこれはa_listのコピーであって、元のリストではない。a_list[:]は元のリストの完全なコピーを作るのに使える
↑↑↑↑↑↑↑ 編集リクエストの内容


#####2.4.3　要素をリストに追加する
方法は４つだ。
a_listを例に取るなら
↓↓↓↓↓↓↓ あなたの記事の内容

```
───────

```pycon
↑↑↑↑↑↑↑ 編集リクエストの内容
>>> a_list = a_list + [2.0, 3]    ①
>>> a_list                        ②
['a', 2.0, 3]
>>> a_list.append(True)           ③
>>> a_list
['a', 2.0, 3, True]
>>> a_list.extend(['four', 'Ω'])  ④
>>> a_list
['a', 2.0, 3, True, 'four', 'Ω']
>>> a_list.insert(0, 'Ω')         ⑤
>>> a_list
['Ω', 'a', 2.0, 3, True, 'four', 'Ω']
```

1, a_list = a_list + [2, 3.0] リストの結合。
　リストは要素をメモリの限り含むことができる。
2, a_list.append(value)　　末尾に追加。引数のデータ型はなんでもいい
3, a_list.extend([value, value, value ....])　　末尾に追加。引数のデータ型はリストのみ。リストの作成は実際にはクラスのインスタンス化なのだとか。ゆえに自身を操作するメソッドがある。引数として与えられたリストの各要素を元リストへ追加する。
4, a_list.insert(index, value)　　1つの要素をリストの要素番号位置に挿入する。元々の要素番号からそれ以降の値が要素位置が１ずれる。また、リストの中に同じ値が複数存在しても問題ない。


append()とextend()の違い。
ざっとまとめると、
・extend()は引数にリストの型をとる。[value1, value2,...]そして、そのリストの内部に複数の値を持つなら分割されて別のインデックスとしてリストに追加される。
・append()で[value1, value2,...]のように複数の値をもつリストを追加した場合、末尾という１つのインデックスにリストとして格納される。


* extend()は引数にリストの型をとる。[value1, value2,...]そして、そのリストの内部に複数の値を持つなら分割されて別のインデックスとしてリストに追加される。
* append()で[value1, value2,...]のように複数の値をもつリストを追加した場合、末尾という１つのインデックスにリストとして格納される。

```
>>> a_list = ['a', 'b', 'c']
>>> a_list.extend(['d', 'e', 'f'])  ①
>>> a_list
['a', 'b', 'c', 'd', 'e', 'f']
>>> len(a_list)                     ②
6
>>> a_list[-1]
'f'
>>> a_list.append(['g', 'h', 'i'])  ③
>>> a_list
['a', 'b', 'c', 'd', 'e', 'f', ['g', 'h', 'i']]
>>> len(a_list)                     ④
7
>>> a_list[-1]
['g', 'h', 'i']
```

1.extend()メソッドは単一の引数としてリストを取る。リストの各要素がa_listへ追加。
２．　３つの要素をもつリストが引数なら、extend()によりa_listより元3+新3=６つの要素を持つリストになる
3.append()の引数はなんでもいい。リストである必要はない。今回はリストだけどね。引数はなんでもおｋ．懐でかし。
４．append()は末尾の要素に引数それじたいをひとまとめに突っ込む。リストはあらゆるデータ型を内包できる。つまりリストをリストのなかに含むことができる。

---
---
pythonシェルで動作確認はしてても、実際に使ったほうが実感として残るよな。
とりまcheckioって英語のサイトも初める。
Elementaryから始める

---
---


#####2.4.4　　リストの値を検索する

1. a_list.count(value) valueが何回出現するか数える
2. value in a_list 　特定の値があるかどうか知りたいとき。booleanで返ってくる。何回現れるかはわからない。何回か知りたいならcount()
3. a_list.index(value, 要素番号)  valueの要素番号を教えてくれる。要素番号は省略可能。要素番号の引数を指定した場合、その要素番号から検索を開始する。
　index()メソッドは最初に出現したもののみを検出する。同じの要素番号を記録するためにforとかで繰り返すなら、その番号をそのまま引数にすればいいんじゃね。また、値が見つからないとindex()メソッドは例外をだす。



#####2.4.5　リストから要素を取り除く
リストは自動的に伸長し、収縮してくれる。
伸長はには、　+,append(), extend(), insert()などだ。
収縮とはつまり要素の削除だ。

・インデックス番号が分かる場合
1. del a_list[n]  インデックス番号がnの該当要素を削除する。該当の要素番号にある値が消え、それ以降の値が存在するならずれてくる。**リストは決して隙間を持たない**

・インデックス番号がわからず、消したい値が分かる場合
2. a_list.remove(value)  remobe()メソッドでは、指定された値を１つだけ削除する。同じ値が複数あっても１つだけだ。また指定した値が存在しない場合は、例外を返す。

3. a_list.pop(index)  pop()メソッドを引数無しで呼び出すと、最後の要素a_list[-1 or len(a_list)]が削除される。そして削除された値が返ってくる。引数に任意の要素番号を指定することもできる。空リストに対してpop()すると例外が起きる。


'''
※Qita。数字.と スペース１回の形だとtabキーで空白を作れる
例) 12. 3. 5. 500.
    12.　←space１回
    3.　←space１回
    5. ←space１回
    6. ←space１回
    500. ←space１回
    999999.　←space１回
    0. なぜだ？理由はわからない
    使えるときが来るのかも分からない。
'''

#####2.4.7 ブール値のコンテクストでのリスト
1. a_list = [] のように空だと、
    if a_list: はFalseだ。
2. a_list = ["a"]　のように要素を１つでも持てば、直上の条件文はTrueになる。
3. a_list = [False] とa_listに　Boolean型のFalseが入っていようと、要素をもってさえすればリストはTrueで真になる。

```
>>> a_list = [False]
>>> a_list
[False]
>>> if a_list:
...   print("This is True")
... else:
...   print("This is False")
... 
This is True
```

#####2.5　タプル
初めて見る。こんにちは。immutableなリストらしい。immutableとは"不変"を指す。
1.　a_tuple = ("a", "b", "sox", "siri", "c")
[]ではなく、()でくくられたらタプルのようだ。

```
>>> a_tuple[0]
'a'
>>> a_tuple(0)
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable

```

かといってa_tuple(n)で取り出せるわけではない。a_tuple[n]で要素の取り出し方はlistと同じ。

2. a_tuple[-1] はリストと同様に後ろ側から数えられる。
3. a_tupe[1:3] リストと同様にスライスもできる。！。これリストだ！！！！
4. 違いは？タプルは変更ができない。immutable。不変だからね。append(), extend(), insert()で追加はできない。remove(), pop()で削除もできない。そもそもこれらのメソッドをtupleクラスは持ってないらしい。


```
>>> a_tuple.remove("a")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'remove'
>>> a_tuple.pop()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'pop'
>>> a_tuple.extend(["a", "b"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
↓↓↓↓↓↓↓ あなたの記事の内容
AttributeError:
 'tuple' object has no attribute 'extend'
全部例外
```

5.　まぁカウントcount()やスライスやinで調べたりはできる。**スライスはあくまで元のリストのコピーを作っているからだ。**

```
>>>a_tuple
("a", 'b', 'sox', 'siri')
───────
AttributeError: 'tuple' object has no attribute 'extend'
```

5. まぁカウントcount()やスライスやinで調べたりはできる。**あくまでスライスは元のリストのコピーを作っているからだ。**

```
>>>a_tuple
("a", 'b', 'sox', 'siri')
>>> a_tuple.count("a")
1
>>> a_tuple[1:4]
('b', 'sox', 'siri')
```

6. タプルは何の役に立つ？
 * タプルはリストよりずーっと早い。変更を加える予定がない集合はタプルのがいい。
 * タプル内部のデータは保護状態のようなものだ。あやまって値が上書きされない
 * ある種のタプルは、文字列とか数字とか他のタプル、辞書のキーとして使える。不変だからな。リストの内部の値はかわるから辞書のキーとしては使えない。

備考：タプルはリストに変換できる。逆もまた然り。
tuple(list) 関数はリストを引数に取る。
list(tuple) 関数はタプルを引数にとってリストを返す。ぶっちゃけlist()はmap型とかも引数にとれる。


#####2.5.1　ブール値のコンテクストでのタプル


```
>>> a_tuple = ()
>>> a_tuple
()
>>> if a_tuple:
...   print("True")
... else:
...   print("False")
... 
False
>>> is_it_true((False,))     ...3  
yes, it's true
>>> type((False))              
<class 'bool'>
>>> type((False,))　　　　　　　...3
<class 'tuple'>
```


1.　空のタプルはリストの同様にFalse
2.　タプルが要素を1つでも持てばTrue
3.　この, はタプルの区切りだ。1つの要素からなるタプルには ,　がいる。
タプルの中身がBoolean型のFalseでも要素がありさえすれば、タプルはTrueになる。




#####2.5.2　タプルによって複数の値を一度に代入する。多値代入。

```
>>> v = ("a", 2, True)
>>> (x, y, z) = v
>>> x
'a'
>>> y
2
>>> z
True
```

1. v は3つの要素を持つタプル。(x, y, x)は3つの変数を持つタプル。上記のように代入すればx, y, zに値がそれぞれ代入される。
これはすげー便利なんだって。実際に使ってみんとわからんわ。


```
>>> (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)
>>> MONDAY
0
>>> THURSDAY
3
>>> SUNDAY
6
```


1.組み込みのrange()関数は、整数のシーケンス（sequence, 連続）を作る。iterator、イテレータと呼ばれ厳密にはリストやタプルを違うのだとか。ここではrange(7)で0-6の数字を、曜日の変数名にそれぞれ同時に放り込んでいる。イテレータはあとで学ぶって言うてるから今は放置。

このタプルで複数に代入することを、多値代入　と呼ぶ。
複数の戻り値を返す関数を作るのにも使えると。単純にすべての戻したい値を含むタプルを作ればいい。
例)1, "a", Trueをまとめて返したいなら()でくくりタプルにすればいい。これら戻り値をタプルとして扱ってもいいし、別個の変数にそれぞれ代入しても良い。


#####2.6 集合
初めまして、集合さん。
一意（１つに確定した）な値をつめた袋、入れ物。
中の要素は順序付けされない＝インデックス番号を持たない。
immutableなデータ型の値？ならなんでも含めることができる。
=どんなデータ型でもふくめるよ！
2つの集合を作り、和集合、差集合、積集合といった演算もできる。

###2.6.1　集合の作成

```
1. a_set = {1}  
a_set = {} 中を値ごとに,で区切るで集合を作れる。
>>> a_list
[1, 2, 3, 4, 5, 6, 'a', False]
>>> a_set = set(a_list)
>>> a_set
{False, 1, 2, 3, 4, 5, 6, 'a'}
>>> a_list
[1, 2, 3, 4, 5, 6, 'a', False]

```
2. set()関数でリストから集合を作れる。

3. 上記で述べた通り、集合はあらゆるデータ型でも含めることができる。インデックスを持たないため、順番は適当。（自分のpythonシェルだと見かけ上整理されているけど）

４. a_set = set()　　空の集合も作れる
   a_set = {}　では空の集合ではなく、空の辞書が作られる。理由はpython2からのなんちゃらほにゃー

```
>>> a_set = {}
>>> type(a_set)
<class 'dict'>
>>> a_set = set()
>>> type(a_set)
<class 'set'>
```

#####2.6.2 集合に値を追加する
1. a_set.add()　　１つの引数をとり、それを集合に追加する。どんなデータ型でも追加できる。
例) a_set.add(199) 199がa_setに追加される

```
>>> a_set = {1, 2, 4}
>>> a_set
{1, 2, 4}
>>> a_set.add(1)   ...2
>>> a_set
{1, 2, 4}
>>> a_set.add("1") ...3
>>> a_set
{1, 2, '1', 4}
>>> len(a_set)
4
```

2. a_set.add(1)は今回の場合何もおこらない。本当に何も起こらない。集合は同じデータ型で同じ値を追加することはできない。一意的とはそういう意味。
3. 同じ１でもこの場合数値のint型ではなく、String型の"1"のような文字なら追加できる。
4. a_set.update(集合) 
例1） a_set.update({2,4,6,8,10})
update()メソッドは１つの引数として集合を取る。その集合すべての要素を元の集合に追加する。同じ値があっても無視される。


```
>>> a_set.update({2,4,6,8,10})
>>> a_set
{1, 2, 4, 6, 8, 10, '1'}
```
例2)　a_set.update({2,3,5}, {4,5,6,7,8})
複数の集合を引数に取れる。
↓↓↓↓↓↓↓ あなたの記事の内容

```
>>> a_set
{1, 2, 4, 6, 8, 10, '1'}
───────

    ```pycon
↑↑↑↑↑↑↑ 編集リクエストの内容
>>> a_set.update({2,3,5}, {4,5,6,7,8})
>>> a_set
{1, 2, 3, 4, 5, 6, 7, 8, 10, '1'}
↓↓↓↓↓↓↓ あなたの記事の内容
```

例３）a_set.update([100,200,"300"])
───────
```
例3)　a_set.update([100,200,300])
↑↑↑↑↑↑↑ 編集リクエストの内容
リストのようないくつかの異なるデータ型から構成されるオブジェクトを受け取れる。
↓↓↓↓↓↓↓ あなたの記事の内容
int１０があるとfloatの10.0はうけとれない。intとfloatの関係どうなってんだ？
───────
int 10 があるとfloatの10.0はうけとれないらしいな。
↑↑↑↑↑↑↑ 編集リクエストの内容

#####2.6.3 集合から値を取り除く
1. a_set.discard()　　引数の値を１つうけとり、集合から除く。値がない場合は何も起こらない。
2. a_set.remove()　　同上。しかし、値が集合内部にない場合、例外がおきる。
3. a_set.pop()　　集合はpop()メソッドも持っている。しかし、インデックスば存在しないので何が削除されるかは完全にランダム。貴様という集合を徐々にpop()してやんよ。
4. a_set.clear()  すべての値を集合から削除。からの集合を残す。

#####2.6.4　一般的な集合演算
1. value in a_set  inを使えば、特定のvalue値があるか検索できる。TrueかFalseが返る。
2. a_set.union(b_set)  引数は集合。どちらかの集合に含まれるすべての要素を含んだ新しい集合を返す。A+B。和集合

3. a_set.intersection(b_set)    引数は集合。両方の集合のどちらにも重複して存在する値のみの集合を返す。AかつB。積集合。
例) 集合a　= {1,2,3} 集合b = {3, 4, 5, 6}
{3}　が返ってくる

4. a_set.difference(b_set)　 集合Bにある値を集合Aから除いた集合Aの要素を集合にして返す。A-B。
↓↓↓↓↓↓↓ あなたの記事の内容

5. a_　set.symmetric_Difference()　　全体-(AかつB)。どちらか一方だけの集合に含まれる要素すべてを含んだ新しい集合を返す
・symmetric_difference()において、集合aと集合bの要素が完全に同一であるならば
───────
5. a_set.symmetric_Difference()　　全体-(AかつB)。どちらか一方だけの集合に含まれる要素すべてを含んだ新しい集合を返す
 * symmetric_difference()において、集合aと集合bの要素が完全に同一であるならば
 
    ```pycon
↑↑↑↑↑↑↑ 編集リクエストの内容
>>>b_set.symmetric_difference(a_set) == a_set.symmetric_difference(b_set)  
True
↓↓↓↓↓↓↓ あなたの記事の内容
である。集合a集合bが等しいなら、積集合も当然等しい。そらそうや。
・和集合のunion(), 積集合のintersection()も集合A,Bが同一なら同じ結果が返ってくる

```
───────
```
である。
 * 和集合のunion(), 積集合のintersection()も集合A,Bが同一なら同じ結果が返ってくる
    
    ```pycon
↑↑↑↑↑↑↑ 編集リクエストの内容
>>> a_set = {1, 2, 3}
>>> b_set = {1, 2, 3, 4}
>>> a_set.issubset(b_set)    ...6
True
>>> b_set.issuperset(a_set)  ...7
True
>>> a_set.add(5)             ...8
>>> a_set.issubset(b_set)
False
>>> b_set.issuperset(a_set)
False
↓↓↓↓↓↓↓ あなたの記事の内容
```

───────
```
 
↑↑↑↑↑↑↑ 編集リクエストの内容
6. a_set.issubset()  is subset。a_setはb_setの部分集合。
↓↓↓↓↓↓↓ あなたの記事の内容
７． ６とは逆にb_setはa_setの上位集合。superset。
───────
7. 6.とは逆にb_setはa_setの上位集合(superset)
↑↑↑↑↑↑↑ 編集リクエストの内容
8. bに含まれない新しい値をaに追加すれば、aとbは部位集合でも上位集合の関係でも中唸る

#####2.6.5 ブールの値のコンテクストにおける集合
1. からの集合は、Flase
2. 要素を１つでも持てばTrue.
3. 要素の中身は問わず、要素をもてばTrue
つまりリストと同じ。


#####2.7 辞書
辞書とはキーと値のペアからなる順序付けされていない集合である。キーに対応する値も同時に追加しなければならない。

1. a_dict = {key_name1 : value1, key_name2 : value2, ....}  大事なのはキー名:値, の流れ。dictはdictonaryで辞書の略。辞書名ならなんでもいい。{}の波括弧を使う。  
例)a_dict = {"oppai": 83, "siri":85}
2. a_dict["key_name"]  値を取り出す時はリストのインデックス番号の代わりに,key_nameを使う。key_nameが文字列なら当然""が必要になる。
例)a_dict["oppai"]　　
82　が返ってくる

3. a_dict[82] と値でキーを取得することはできない。例外が発生する。

↓↓↓↓↓↓↓ あなたの記事の内容
4.辞書に上限サイズはない。新しいキーと値のペアをいつでも辞書に追加できる。既存のキーに対応する値もいつでも変更可能。

```
a_dict["siri"] = 87　 値を新しく書き換えられる。
───────
4. 辞書に上限サイズはない。新しいキーと値のペアをいつでも辞書に追加できる。既存のキーに対応する値もいつでも変更可能。
ex)

    ```py
a_dict["siri"] = 87   値を新しく書き換えられる。
↑↑↑↑↑↑↑ 編集リクエストの内容
a_dict["waist"] = 59  新しいキーと値の組を追加できる
a_dict["name"] = "simamura uduki"　　新しいキーと値を追加できる
```

5. pythonはあらゆる状況で小文字大文字を区別する。
a_dict["Name] = "simamura uduki"は　すでに存在するキー"name"の値を書き換えない。新しく"Name"が追加される。

#####2.7.3 値が混在する辞書
辞書の値はどんなデータ型でもいい。あらゆるオブジェクトを値として使える。
辞書のキーとして使えるデータ型は値より制限されている。文字列、数値、その他いくつかある。しかし、キーのデータ型を統一する必要はない。
↓↓↓↓↓↓↓ あなたの記事の内容

```
───────
例)

```py
↑↑↑↑↑↑↑ 編集リクエストの内容
SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
            1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
```

```pycon
>>> SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
...             1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
>>> len(SUFFIXES)      ①
2
>>> 1000 in SUFFIXES   ②
True
>>> SUFFIXES[1000]     ③
['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
>>> SUFFIXES[1024]     ④
['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']
>>> SUFFIXES[1000][3]  ⑤
'TB'
```

1. リストや集合と同じくlen()関数でキーの数を調べられる
2. in演算子で特定のキーがあるか調べられる
3. キーに対応した値が出てくる。a_dict[key_name]が値をだす方法だ
4. 同上
5. SUFFIXES[1000]はリストであり、つづけて値のインデックスを指定できる。SUFFIXES[1000][n] ｎはSUFFIXESに格納されたリストのインデックスだ。リストの中のリストを指定する方法を知ってしまったぜ。

#####2.7.4 ブール値のコンテクストでの辞書
リストと同じ。

1. 空の辞書はFalse
2. キーと値のペアを１つでも持っていれば、キーに対する値がなんだろうとだろうと、Trueを返す


#####2.8 None
NoneはPythonの特別な定数。null値（無効値）だ。noneはFalseではない。０でもない。空の文字列でもない。NoneをNone意外と比較すると常にFalseが返る。
NoneはNoneTypeというデータ型をもつ、唯一のnull値だ。
Noneを任意の変数に代入できる。しかし、他のNoneTypeというデータ型をNone以外につくることはできない。
↓↓↓↓↓↓↓ あなたの記事の内容
値としてNoneをもつすべての変数は、お互いに等しい。

```
>>> type(None)
───────
値としてNoneをもつすべての変数は、お互いに等しい

```pycon
>>> type(None)
↑↑↑↑↑↑↑ 編集リクエストの内容
<class 'NoneType'>
>>> None == False
False
>>> None == 0
False
>>> None == ""
False
>>> None == None
True
>>> x = None
>>> x == None
True
>>> y = None
>>> x == y
True
```

#####2.8.1 ブール値のコンテクストでのNone
↓↓↓↓↓↓↓ あなたの記事の内容
```
>>>if None:
False
>>>if not None:
True
```

───────

```py
if None:
    →False
if not None:
    →True
```
↑↑↑↑↑↑↑ 編集リクエストの内容

すげぇ長かったぞ。胡麻棒消滅したし、今回の一回メモったデータ消えたからすげぇ虚無をかんじた。
保存こまめにするぞ。しろ。心バッコン。