Python3のメモ

Pythonチュートリアル(第3版)を斜め読みした際のメモ．
チートシート的に使いたい． 追記するかも．

# 構文
```py3
f = lambda x:  x*x
f(10) #=> 100

def pow(x):
    return x * x

h = pow
h(100) #=> 10000
```

```py3
m = { "key": "value" }
for k,v in m.items():
  ...
``` 

```py3
while True:
    try:
        # 何らかのValueError
        raise ValueError("えらー")
    except OSError as err:
        # エラーハンドル
    except ValueError: as err:
        # エラーハンドル
    except:
        # その他のエラーハンドル
        raise # 例外の再送出をしてもよい
    else:
        # try内で例外がスローされなかったら実行される
    finally:
        # 必ず実行される
```
     


# モジュール
ディレクトリに `__init__.py`があるとパッケージとして扱われる．
例えば `sound/effects/echo.py` があったとき， `echo.py` 内の `echofilter` 関数を使うには，

```py3
from sound.effects.echo import echofilter
```
と書く．

# 出力
あらゆるPythonオブジェクトがrepr()の引数になれる．

```py3
# {formatの引数のインデックス : フォーマット}

import math
for x in range(1,11):
    print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))

print( 'Pi: {}'.format(math.pi) )
print( 'Pi: {!r}'.format(math.pi)) # !r は repr()を適用
print( 'Pi: {!s}'.format(math.pi)) # !s は str()を適用

m = { 'key1': 42, 'key2': 84 }
print( 'K1: {0[key1]:d}, K2: {0[key2]:d}'.format(m))
# K1: 42, K2: 84

# こっちの書き方もできるけど，古いらしい
print( 'Pi: %5.3f' % math.pi )
# Pi: 3.142
```

`vars()` はローカル変数をすべて含んだディクショナリを返す関数．

# ファイル操作
```py3
f = open('filepath', 'r+') # r/w/a/r+

f.read(サイズ) # サイズ省略するとすべて読む
f.readline() # 1行読む
for line in f:
    print(line)

f.write('This is a test\n')

f.close()
```

オブジェクトによっては，不要時のクリーンアップ動作が定義されている．
with文を使うと使用後すぐに適切な方法でクリーンアップされる保証の下で利用できる．

```py3
with open("filepath") as f:
    for line in f:
        print(line)
```

# json

```py3
j = json.dumps( obj )
obj = json.load(j)
```

# クラス
```py3
class Complex:
    clazz_var = 'value' # クラス変数
    def __init__(self, r, i):
        self.r, self.i = r, i # インスタンス変数
    def to_s(self):
        return "{0:.3f} + {1:.3f}i".format(self.r, self.i)

c = Complex(3.0, -4.5)
print(c.r, c.i) # 3.0 -4.5
print(c.to_s()) # 3.000 + -4.500i
print(Complex.to_s(c)) # 3.000 + -4.500i
```

# ジェネレータ
```py3
def reverse(data):
  for i in range(len(data)-1, -1, -1):
      yield data[i]

",".join(list(reverse('golf')))
#=> "f,l,o,g"
```

# 標準ライブラリ

```py3
import os
os.getcwd()  # カレントディレクトリ
os.chdir("path/to/dir") # cd コマンド相当
os.system("mkdir today") # シェルコマンド実行
help(os) # でモジュールのヘルプを確認できる

import shutil # ディレクトリ操作
shutil.copyfile('src.txt', 'dst.txt')
shutil.movefile('src.txt', 'dst.txt')

import glob # ディレクトリ走査
glob.glob('*.py')

import sys
print(sys.argv) # コマンドライン引数
# getopt モジュールやargparseモジュールで sys.argv をうまく処理できる

import re # 正規表現
re.findall( r'[a-z]+', 'hoge hoge string')
#=> ['hoge', 'hoge', 'string']

import math # 数学関連
math.cos(math.pi /4) #=> 0.707
math.log(1024, 2) #=> 10.0

import random # 乱数
random.choice(['a', 'b', 'c']) #=> a,b,cから無作為抽出する
random.sample(range(100), 10) # 0から99の値から重複なしで10個抽出
random.random() # 0から1の間の乱数(実数)
random.randrange(6) # range(6)からランダムに選んだ整数

import statistics # 統計量
statistics.mean([1,2,3]) # 平均値
statistics.median([1,2,3]) # 中央値
statistics.variance([1,2,3]) # 分散
# SciPyにはもっとたくさんあるよ

from urllib.request import urlopen # webページ取得
with urlopen('http://.....') as res:
    for l in res:
        print( l.deecode('utf-8') )
    
import smtplib # メール送信

from datetime import  date # 日付と時間
now = date.today()
now.strftime("%m-%d-%y %d %b %Y")

import zlib # zip圧縮
src = b'hogehoge fugafuga'
c = zlib.compress(src)
s = zlib.decompress(c)
print(s) # hogehoge fugafuga

from timeit import Timer # 計測
Timer('evalされる文字列', 'evalされる文字列').timeit() # それぞれの式の評価時間の差

import logging # ログ
logging.debug('でばっぐ') # 他には info,warning, error, critical 

import weakref # 弱参照, WeakReference

```