Pythonチートシート(for C++経験者)

#目的:C言語を学んだことある人が"楽して"pythonを学ぶ(python特有の記法やルールのみ記述)
ただしチートシートなので機能の存在を教えるだけにとどめ、詳しい説明は見通しの良さのために記述しない。

##Python全体のルール
- 明示的な型付けは不要
- 全てがオブジェクト(関数もメンバ変数を持っている)
- 関数自身も第一オブジェクトなので、関数名を関数の引数や戻り値として使える
- サブルーチンは存在しない(戻り値がかならずある Noneも含め)
- ```で囲った部分はコメントアウトになる
- 関数を呼ぶたびにその関数内のローカル変数用に名前空間が作成され関数を抜けたら開放される
- 変更不能オブジェクトの代入以外はすべて参照渡しになる
- ifやforはスコープにならない


##関数定義
- def 関数名(引数1,引数2,...)
- 名前付き引数により、引数の順序を任意にできる(C++にない機能)
> ただし引数リストを左から右へ読んだときに名前付き引数が現れたら、それ以降の引数には必ず名前を付けなければならない(名前付き引数は右詰め)。

- 引数にデフォルト値が利用可能(C++と同様。)
> 名前付き引数の存在によりC++よりデフォルト値の設定が自由(名前付き引数により引数の順序が自由だから)
>>c++はデフォルト値は右詰めでないといけない

- 関数の定義にヘッダファイルは不要

- 関数定義に戻り値の型は指定不要(型付け不要なので)

##import (#includeに当たるもの)

- sys.pathに入ってるリストに入ってるディレクトリの.pyファイルのモジュールをimportしにいく。
>```import sys```を最初に行う必要あり

- sys.pathは配列なので普通に編集可能。
>例```sys.path.insert(0, new_path)```
モジュール名.クラス名.関数名()

### fromを使うとモジュール内のクラスをグローバルの名前空間に読み込む(モジュール名を省略できる)
>例```from sys import path
fromモジュール名 import クラス名 

なのでモジュール中のクラスを全部呼びたいときは
```from モジュール名 import *```

##データ型

###組み込み型
| 型名 | 機能 | 具体的な中身 |
|-----------|------------|------------|
| Bool       | 真 or 偽 |    True False  , 0≠真 0=偽   |
| 数値     |      整数、小数、複素数 (castは切り捨て)|  1, 1.0,     |
|リスト|任意のブジェクとを収納できる配列(リストの要素にリストも代入可)|```a_list = ['a', 'b', 'mpilgrim', 'z', 'example']  ```|
|タプル|リストに変更できないようロックをかけた状態(もとのタプルが破壊的変更を受けるメンバ関数なし)|```a_tuple=('a', 'b', 'mpilgrim', 'z', 'example')```|
|集合|順序付けがなく、重複を許さないリスト| ```a_set ={'a', 'b', 'mpilgrim', 'z', 'example'}```|
|辞書(キー付き集合)|キーと値のペアの集合(集合ではインデックスの代わりにキーが使える)キーはユニーク|``` a_dict = {'key1': 'value1', 'key2': 'value2'}```|
|NoneType|nullのみを扱う型|nullはNoneType固有のもの|

###演算子

| 演算子 | 機能 |コメント |
|-----------|------------|------------|
| ** |べき乗 ||

###リストにたいする操作
| 機能 | 方法 | コメント |
|-----------|------------|------------|
|要素へのアクセス| ```a[indesx]``` | 境界が周期的 ```a[-1]```は最後の要素を指す|
|スライスして部分列を生成|```a[n:m]```| n<=i<mのa[i]をリストとして抜き出す。```a[:]```は全ての要素を指す|
|要素を追加|```a.append(n)``` ```a.insert(n,m)```|appendは最後に追加、nをm番目に追加、```+``` でリストの結合も可能|
|要素を追加(リストを使った)|```a.extend([list])``` |extendは最後に追加、リストオブジェクトを引数に取る|
|要素の削除|```del a[1]``` ```a.remove('要素名')```|位置で削除する方法と、具体的な要素名で削除する方法|


##ループ

以下のループが有用である

```
for i,word in enumerate(['a','b','c']):
　　print i,word
```

出力結果

```
0　a
1　b
2　c
```
```0から10までループ
for i in range(0,11,1) 
```

##ファイルの読み書き

pythonでは数字を直接書き出すことはできない(読み書きは文字列or バイナリ)
なので数字として取り扱うためには、float(a)やstr(a)が必要となる

```複数の列を読み込む場合
f = open('text.txt', 'r')
addressList = []
for line in f:
    name, zip, address = line[:-1].split('\t')
    print name, zip, address
	addressList.append(float(address))
```
数字は読み込んだらすぐにfloatにキャストすべし

##クロージャ
clojuresとはグローバルスコープ以外で定義された関数が, 「定義時」の自分を囲むスコープの情報を記憶している機能のこと。
関数中で関数を定義できるpythonでは必要な機能

```clojures.py
>>> def outer():
...     x = 2
...     def inner():
...         print x
...     return inner
>>> foo = outer()   #inner関数が戻り値
>>> foo()
2	#inne関数のスコープにない2を覚えている
```
これを利用すると固定の引数を取るようにカスタマイズした関数を生成できる。

##デコレーター
関数に機能を追加する(元の関数を引数に取り機能を追加してアレンジした関数を元の関数に再代入する機構を用いて)
@を利用した略記ができる

```ログを出力する機能をデコーダー用いて負荷.py
def logger(func):
     def inner(*args, **kwargs): #機能を追加した関数を作る
         print "Arguments were: %s, %s" % (args, kwargs)
         return func(*args, **kwargs) #元となる任意の関数
     return inner
          
#loggerをfoo関数に付加する
@logger
def foo(x, y):
     return x * y
#この@logger def fooは foo=logger(foo)のシンタックスシュガー

foo(2,3)
Arguments were: (2, 3), {}
6
```
##内包表現

以下のようにリストを生成することができる。Sに含まれる要素xの中で条件P(x)を満たすxを使ってf(x)を要素にしたリストをつくる
ちなみにifはオプションで省略可(２つ目の例はジェネレーター)

```
[f(x) for x in S if P(x)] 
max(x*x for x in [1,5,3] if x<3)
```

##Tips

####日本語のコメントを打つ

```
# -*- coding: utf-8 -*-
```
####リストの最大値のインデックス

```
>>> a = [2,3,4,3,4,4,4]
>>> b = [i for i,j in enumerate(a) if j == max(a)]
>>> b
[2, 4, 5, 6]

#最大となる要素が1つのとき
>>>a.index(max(a))
```

####行列生成(配列をMxNの行列に)

```reshoapeは行列A_N,M
    A = []
    for i in range(0,M+1):
            for j in range(0,N+1):
                tmp = i+j
                A.append(tmp)
    A = array(A).reshape(M,N)
```

####線形方程式を解く

```
results_vector = np.linalg.solve(A_matrix,T_vector)
```

####グラフ
```python
import matplotlib.pyplot as plt


plt.plot( [1,2,3], '-')  # 折れ線
plt.plot( [1,2,3], '--') # 破線
plt.plot( [1,2,3], '-.') # 一点破線
plt.plot( [1,2,3], ':')  # 点線
plt.plot( [1,2,3], '.')  # 点
plt.plot( [1,2,3], ',')  # ドット
plt.plot( [1,2,3], 'o')  # 円
plt.plot( [1,2,3], 'v')  # 下向き三角
plt.plot( [1,2,3], '^')  # 上向き三角
plt.plot( [1,2,3], '<')  # 左向き三角
plt.plot( [1,2,3], '>')  # 右向き三角
plt.plot( [1,2,3], 's')  # 正方形
plt.plot( [1,2,3], 'p')  # 五角形
plt.plot( [1,2,3], 'h')  # 六角形 (縦)
plt.plot( [1,2,3], 'H')  # 六角形 (横)
plt.plot( [1,2,3], '+')  # 十字
plt.plot( [1,2,3], 'x')  # バツ
plt.plot( [1,2,3], 'd')  # 菱形
plt.plot( [1,2,3], 'D')  # 正方形 (斜め)
plt.plot( [1,2,3], '|')  # 縦線
plt.plot( [1,2,3], '_')  # 横線

# 合わせ技
plt.plot( [1,2,3], '-o')   # 折れ線 + 円
plt.plot( [1,2,3], '--o')  # 破線 + 円

plt.plot( [1,2,3], 'b') # 青
plt.plot( [1,2,3], 'g') # 緑
plt.plot( [1,2,3], 'r') # 赤
plt.plot( [1,2,3], 'c') # シアン
plt.plot( [1,2,3], 'm') # マゼンタ
plt.plot( [1,2,3], 'y') # イエロー
plt.plot( [1,2,3], 'b') # 黒
plt.plot( [1,2,3], 'w') # 白

# プロット方式と同時指定
plt.plot( [1,2,3], '--b') # 破線 + 青
plt.show() #描画
plt.savefig("graph.png") #保存
```


#### 型とメソッドを調べる

```
print type(obj) #型
print dir(obj) #method一覧
```