python学習メモ

#pythonのバージョンが最新版に切り替わらない場合
pyenvでpythonのバージョンが切り替わらない場合は、下記コマンド。

```text
$ eval "$(pyenv init -)"
```

#構文メモ
##データ型とは？
アトリビュート（変数）とメソッド（関数）を持つ。PHPでいうクラス？
ただデータ型の関数を使うには初期化（変数への格納）が必要というわけではない。
データ型.関数()で使用可能

##データ型が持つ関数
文字列の持つsplit()などデータ型がそれぞれ関数を持っている。この持っている関数を **メソッド** という。メソッドは変数.メソッド名()で実行する

```py
a = 'tokyo,shibuya'
b = a.split(',')
print(b) # ['tokyo','shibuya']
```
##関数の作り方
構造

```text
def 関数名(引数)
	処理
	return x
```

引数にデフォルト値を設定する

```text
def 関数名(引数=デフォルトの値)
	処理
	return x
```
##データ型（クラス）の作り方

```py
#サイコロのデータ
class Dice :
  def __init__(self,val=6): # ①
  	if val not in [4,6,8,12,20]:
  		raise Exception('そんな正面体はありません') #②
  	self.face_num = val #③
  def shoot(self):
    return random.randint(1,self.face_num)
```

①　`__init__`の関数で呼び出された時（初期化）の時に実行する関数を指定できる。
②　raise　でエラーの表示が可能。if 引数 in 対象 で引数の数値チェックを行っている。exception('')のカッコ内のエラーメッセージが表示可能
③ selfはクラス内でメソッドを作成する際には必ず引数に指定しなくてはならない。またクラス内のメソッドで使用する変数にもself.を前に付ける。

##クラスの継承
```text
class クラス名(継承元のデータ型):
	#初期化メソッドに処理を追加する場合は親クラスの初期化メソッドも読み込む
	def __init__(self) :
		super(クラス名,self).__init__()
		#superはデータ型とselfの2つの引数を持ち、自分の親クラスを返してくれる。
		追加の処理
		
```

##クラスからオブジェクトの作成
```py
class A() :
	age = 37

a = A()
a.age # 37
```
変数にクラス名()を代入するとオブジェクトが作成できる。()をつけないとただのクラスのコピーと成ってしまうので注意！

```py
class A() :
	age = 37

a = A
a.age = 20

a.age # 20
A.age # 20

b= A()
b.age #20
```
コピーをしてしまうと上記のようにオブジェクトの変数を変えようと思ったところクラスの変数を変えてしまい、その後オブジェクトを作った際にもその値が初期値となってしまう。

##selfの意味
自分自身を引数に入れるという意味。クラスはメソッドと変数を持つ

#関数メモ
##文字数を数える
```py
len()
```
##文字列に変換
```py
str()
```
##データを画面に出力
```py
print()
```
##リストを作成
intに指定した数の連続した整数リストを作る。引数を,で区切ることでスタート位置と終了位置を決めることができる。第一引数でスタート。第二引数の手前まで。

```py
range(3)     # [0,1,2]
range(1,5)   # [1,2,3,4]
range(10,11) # [10]
```

##文字列型の持っている関数
###特定の文字で文字列を区切る
文字列の持っているメソッド。引数に指定した文字で文字列を区切り、結果を配列で返す。

```py
a = 'tokyo,nagoya'
b = a.split(',')
print(b) #[tokyo, nagoya]
```
###文字列を大文字にする
```py
文字列.upper()
a = 'abcd'
b = a.upper()
print(b) # ABCD
```
###特定の文字の出現位置を返す
一番初めを0として引数に指定した文字の最初の出現位置を返す

```py
a = 'abcdefg'
b = a.index('c')
print(b) # 2
```

#モジュールメモ

##モジュールの読み込み
```text
import モジュール名
モジュール名.関数
```
その他asを使うとモジュール名に名前をつけられる

```
import モジュール名 as A
A.関数 #=モジュール名.関数
```

##乱数値の生成
```text
import random
#範囲を区切った整数値のランダム表示
random.randint(1,100)
#配列の中の値をランダムに表示
random.random.choice(配列or文字列)
```

#組み込み関数
##関数をリスト全てに適応 map
```py
map(関数,リスト)
map(str,[1,2,3]) #['1','2','3']
```

##日時時刻の表示
```py
import datetime
#日付の表現
b = datetime.date(2013,12,11)
print(b) #2013-12-11
#曜日の計算（0が月曜,6が日曜)
c = b.weekday() 
print(c) # 2
```

#リスト型の持っている関数・特徴
##項目数を取得 len
```py
a = [1,2,3]
len(a) # 3
```
##最後の項目を取得
```py
a = [1,2,3]
a[-1] # 3
a[-2] # 2
```

##要素の追加 append
```py
a = [1,2,3]
a.append(4)
print(a) # [1,2,3,4]
```

##特定位置への要素の追加 append
```py
a = [1,2,3]
a.insert(1,5)
print(a) #[1,5,2,3]
```

##要素の削除 pop
```py
a = [1,2,3]
a.pop(2)
print(a) #[1,2]
```

##指定の値を持つ要素を削除 remove
```py
a = ['da','ai','oo']
a.remove('ai')
print(a) #['da','oo']
```

##リストの結合 extend
```py
a = [1,2]
b = [3,4]
a.extend(b)
print(a) #[1,2,3,4]
```

##リストの合計の取得
```py
a = [1,2,3]
b = sum(a)
b # 6
```
##リストの最大、最小の取得
```py
a = [1,2,3]
b = max(a) # 3
c = min(c) # 1
```
##リストの切り出し
```py
a = [1,2,3,4,5,6,7,13,15]
a[0:3] #[1,2,3]
a[2:5] #[3,4,5]
a[3:]  #[4,5,6,7,13,15]
a[:3]  #[1,2,3]
```

##リストの並び替え
```py
a = [3,2,1,4,5,6]
#昇順に並び替え
a.sort()
a # [1,2,3,4,5,6]
#逆順に並び替え
a.reverse()
a # [6,5,4,3,2,1]
```
文字列も辞書順に並び替えられる（大文字>小文字）
##空のリストの作成
```py
a = []
```

#関数的なもの
##文字列の結合
```py
a = 'なか'
b = 'そと'
c = a + 'と' + c
c # なかとそと
```

##含まれるかどうかのチェック
```py
a = '12345'
if '3' in a :
	print 'true'
```

##配列のひとつひとつの数値に関数を実行
```py
#例として配列の各要素をキャスト
a = [1,2,3]
a_str = map(str,a)
a_str # ['1','2','3']
```

##正規表現
###当てはまるものを検索、取り出し
```py
import re
c = '私の年齢は65歳です'
pat = r"(\d{1,2})歳"
d = re.search(pat,c)
d.group(1) # 65
```
###置き換え・位置入れ替え
```py
re.sub(r'パターン','置き換え文字',対象データ）
#例
import re
a = 'my name is ryo, i like programing'
n = re.sub(r"\w*(ryo)\w*",'yu',a)
n # 'my name is yu, i like programing'
#単語の位置を置き換え。パターンの()と置き換えのとき\数字で指定できるのでそれを利用する。
a = '1is2 3is4 5is6'
b = re.sub(r"(\d)is(\d)",r"\2is\1",a)
b # '2is1 4is3 6is5'
```

##ラムダ式
###ラムダ（lambda)式とは
関数名がない関数で無名関数と呼ばれる。主に変数に入れて使用する。またlistの各要素に関数を実行するmapや、listの各要素を関数で選別するfilterで使用すると便利。

```py
lis = range(1,11) # [1,2,3,4,5,6,7,8,9,10]

#lisから偶数を取り出す
lis_even = list(filter(lambda a : a % 2 == 0,lis))
print(lis_even) # [2,4,6,8,10]

#lisの要素をそれぞれ3倍する
lis_x3 = list(map(lambda a : a * 3, lis))
print(lis_x3) # [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
```