オライリーpython3入門 学習メモ

#概要
オライリー社のpython入門よりpythonを学習。学んだ事をカテゴリ分けせず順不同でメモしています。

##基数の利用
数値の前に特定のキーワードを加えると基数を表現できる

```py
#2進数 0b
0b101 # 5

#8進数 0o
0o11 # 9

#16進数 0x
0x1a1 # 417
```

##割り算で//の利用
割り算は通常「/」だが「//」を使う事で小数点切り捨ての計算ができる

```py
a = 3
a / 2 # 1.5
a // 2 # 1
```

##文字列の作成で「'」と「"」の違い
基本どちらを使っても良い。ただ文中でどちらかを使用したい場合は、使用しない方のクウォートで囲む。その他「\」でエスケープすると囲みと同じクウォートでもエラーは出ない。

```py
a = 'a'bc'd' #エラー
a = "a'bc'd" #エラーなし
a = 'a\'bc\'d' #エラー
```

##リテラルとは
プログラムに直接記述した数値や文字列のこと。変数との対義語？。数値はそのままでも良いが、文字列は必ずクウォートで囲む。

##「*」による文字列の繰り返し
文字列の結合の際に「*」と数字を使用する事で文字列の繰り返しが可能


```py
start = 'na' * 4
print(start) #nananana
```

##[]による文字の抽出
文字列の中のある部分の文字を取り出したい場合は文字列変数に[順番]をつけて呼び出す。「-」をつけると末尾からの順番。

```py
code = 'abcdefg'
code[0] # a
code[-1] # g
code[-3] # e
```

##[]による文字列のスライス
`文字列[start:end:step]`で文字列の選択抽出ができる。
数え方が0から始まるため、end で指定した数値-1の番目までの抽出であることに注意。

```py
a = 'abcdefg'
a[:] # 全てをスライス '0123456789'
a[1:] # 1番目から全てをスライス 'bcdefg'
a[1:3] # 1番目から2番目までをスライス 'bc'
a[0:0] # ''
a[0:5:2] # 0番目から4番目まで1抜かしごとに 'ace'
a[:2] # 先頭から1番目まで 'ab'
a[-3:] #分末尾から3文字 'gfe'
a[::2] #先頭から末尾まで1抜かしで 'aceg'
```

##文字列の単語数を数える
```py
a = 'abc'
len(a) # 3
```

##文字列をリストへ分割する - split()
splitで文字列を特定の文字でリストに分割することができる。split()のように何も指定しない場合は、自動的に空白文字で分割する。splitは文字列特有の組み込み関数。文字列オブジェクトが持つメソッド？

```py
a = 'ab,cd'
a.split(',') # ['ab','cd']
a = 'ab cd'
a.split() # ['ab','cd']
```

##リストを結合し文字列にする - join()
join関数でリストの結合ができる。'str'.join(list)で、strを間に挟み、listの要素を結合する。

```py
line = ['a','b','c']
'x',join(line) # 'axbxc'
```

##文字列の置き換え - replace()
文字列.replace（置き換え文字列,置き換え後文字列,置き換え回数）で文字列の置き換えができる。回数を省略すると全て置き換える

```py
a = 'abc abc abc'
a.replace('abc','xxx',1) # 'xxx xxx abc'
a.replace('abc','xxx') # 'xxx xxx xxx'
```

##その他文字列操作関数
```py
a = '"This is a pen. That is a eraser"'

#ある文字列が最初に現れる位置を取得 - find()
a.find('pen') # 11

#ある文字列が最後に現れる位置を取得 - rfind()
a.rfind('is') # 21

#ある文字列が何個含まれるか計算 - count()
a.count('eraser') # 1
#両端から特定の文字列を削除する - strip()
a.strip('"') # 'This is a pen. That is a eraser'
```
##リストの作成
リストはlist()または[]で作成する。文字列をlist()した場合は、一文字づつのリストとなる。

```py
a = list()
a # [] 空のリスト
b = [] 
b # [] 空のリスト
c = 'abc'
list(c) # ['a','b','c']
```

##リストのスライス
リストも文字列と同様に[:]で要素を抽出することができる。

```py
a =  ['a','b','c']
#0から2番目の指数の要素を取得
a[0:2] # ['a','b']
#先頭から1つ飛ばしで要素を取得
a[::2] # ['a','c']
```

##リストへの要素の追加、削除、その他
```py
a =  ['a','b','c']
b = ['d','e','f']

#リストの結合 - extend()
c = a.extend(b)
c # ['a','b','c','d','e','f']

#要素の末尾への追加 - append()
a.append('d')
a # ['a','b','c','d']

#要素の指定位置への追加 -insert()
b.insert(1,'x')
b # ['d','x','e','f']

#番号を指定して削除 - pop()
a.pop(1) 
a # ['a','c','d']

#要素を指定して削除 - remove()
a.remove('a') 
a # ['c','d']

#要素のインデックスを調べる - index()
a.index('c') # 0

#値の有無を調べる in
a in c # true

```

##リストの要素並び替え - sort()  sorted()
sort()は引数に指定したリスト自体を並び替える。sorted()は並び替えたリストを戻り値として返す。（引数に指定したリスト自体の並び順は変わらない）

```py
a = [3,2,1]
b = [3,2,1]
#リスト自体のソート
sort(a)
a # [1,2,3]
c = sorted(b)
c # [1,2,3]
b # [3,2,1]
```

##タプルとは
タプルは定義した後に変更、追加が出来ない定数的なリスト。

```
#タプルの作成
a = ('a','b','c')

#配列のタプルへの変更 - tuple()
b = ['a','b','c']
c = tuple(b)
c # ('a','b','c')
```

##タプルのアンパック
タプルを使うと一度に複数の変数の代入ができる。これをタプルのアンパックという。

```
a , b , c = (1, 2, 3)
a # 1
b # 2
c # 3
```

これを使うと一時変数を使わずに変数の値の交換もできる

```py
a = 'cat'
b = 'dog'
a , b = b, a
a # 'dog'
b # 'cat'
```

##辞書とは
個々の要素と対応したkeyがあるリスト。phpの連想配列と同義。

```py
#辞書の作成
a = { 'cat' : 'ねこ', 'dog' : '犬' }
a['cat'] # ねこ

#空の辞書の作成
a = {}
```

##dict()を使った辞書への変換
dict()を使うと色々な要素を辞書型へ変換できる。

```py
#2次元リストを辞書に変換
line = [['dog','犬'],['cat','猫']]
dict(line) # {'dog': '犬', 'cat': '猫'}

#2文字づつの要素を持つリストを辞書に変換
line = ['ab', 'bd', 'cd', 'de']
dict(line) # {'a': 'b', 'c': 'd', 'd': 'e', 'b': 'd'}
```

##辞書の結合　- update
辞書型はupdate関数で結合できる。その際、同様のkeyを持つものがある場合は、update()の引数に指定したものにある要素が優先される。

```py
one = {'a': 'あ','b':'い'}
two = {'c':'う','b':'お' }
one.update(two)
one # {'a': 'あ', 'c': 'う', 'b': 'お'}
```

##辞書の要素の削除 - del , clear()
```py
 #指定したkeyを持つ要素の削除
one = {'a': 'あ','b':'い'}
del one['a']
one # {'b':'い'}

#全ての要素の削除
one = {'a': 'あ','b':'い'}
one.clear()
one # {}
```

##辞書型の値・keyの一括取得
python3から配列ではなくオブジェクトで帰ってくるため、list()で配列に変換するのが良い

```py
one = {'a': 'あ','b':'い'}

#全てのkeyの取得 - keys()
list(one.keys()) # ['a','b']

#全ての値の取得 - values() 
list(one.values()) # ['あ','い']

#全てのkyeと値の取得 - items()
list(one.items()) # [('a':'あ'),('b','い')]
```

##内部表記の書き方
```py
#0から4までの数値の二乗リスト
li = [i**2 for i in range(5)]

#以下と同意
li = []
for i in range(5):
	li.append(i**2)

#100までの偶数
li = [i for i in range(1,101) if i % 2 == 0]

#以下と同意
li = []
for i in range(1,101):
	if i % 2 == 0:
		li.append(i)

```

##yieldとジェネレーター
関数でreturnの代わりに「yield」を用いると、処理を一時停止して保存その後再回することができる。for文による値取り出しの場合はジェネレータの関数をそのまま利用して良いが、nextを使う場合は、一度オブジェクトにしなくてはならない。

```py
#ジェネレーターの作成
def func() :
	sum = 0
	while True :
		sum += 7
		yield sum

#nextによる値の取り出し				
sevens = func()
next(sevens) # 7
next(sevens) # 14
next(sevens) # 21
#よくオブジェクト.next()という記載があるがpython3より使えない。
#next()を使う場合は上記のようにnext(オブジェクト）とするか、
#オブジェクト.__next__と記載する

#for文による値の取り出し
for i in func()
	print(i,end=',')
	# func()はwhileの無限ループのためbreak条件を追加
	if i > 21
		break
#7,14,21,28,
```