python3チートシート

Python Cheat Sheet

よく忘れるやつ


## 演算
```python
>>> 1 + 2
3
>>> 3 - 2
1
>>> 3 * 5
15
>>> 7 / 2
3.5
>>> 7 // 2
3
>>> 7 % 2
1
>>> 3 ** 3
27
>>> 27 ** 0.5
3.0
```

## ビット操作
```python
>>> bin(0b1 << 8)
'0b100000000'
>>> bin(0b1000 >> 3)
'0b1'
>>> bin(0b1111 & 0b110)
'0b110'
>>> bin(0b1000 | 0b1001)
'0b1001'
>>> bin(0b1100 ^ 0b1001)
'0b101'
```


## 型の確認
```python
>>> isinstance(0.1, float)
True
>>> type(0.1)
<class 'float'>
```

## フォーマット関数
呼び出し

```python
>>> '{1}, {0}, X: {2[0]}, Y: {2[1]}, parrot is {parrot}'.format(
...     'egg',
...     'bacon',
...     [10, 20],
...     parrot='DEAD'
... )
'bacon, egg, X: 10, Y: 20, parrot is DEAD'
```

幅指定

```python
>>> '{:<20}'.format('left aligned')
'left aligned        '
>>> '{:>20}'.format('right aligned')
'       right aligned'
>>> '{:^20}'.format('center')
'       center       '
>>> '{:-^20}'.format('fill center')
'----fill center-----'
```

表記制御

```python
>>> '{:05}'.format(23)
'00023'
>>> '{0:,}'.format(1234567890)
'1,234,567,890'
>>> '{0}, {0:f}, {0:.2f}, {0:.0%}'.format(0.345)
'0.345, 0.345000, 0.34, 34%'
>>> '{0:d}, 0x{0:x}, 0x{0:X}, 0o{0:o}, 0b{0:b}'.format(42)
'42, 0x2a, 0x2A, 0o52, 0b101010'
>>> '{:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now())
'2018-08-06 13:24:11'
>>> '{0:{1}}'.format(12, '>10')
'        12'
```

## ロギング
基本形

```python
from logging import getLogger, DEBUG, StreamHandler
logger = getLogger(__name__)
logger.setLevel(DEBUG)
logger.addHandler(StreamHandler())

logger.debug('hello! %s', 'world')
```

各ファイルは基本的に以下のように定義すればよい

```python
from logging import getLogger
logger = getLogger(__name__)
```

``` from logging import ... ```という書き方を使うのは```logging```と```logger```を書き間違えやすいため。（```logging.debug()```のような関数も存在するのでエラーが発生せず、間違いに気づきづらい）

### ログレベル
- logger.critical()
- logger.error()
- logger.warning()
- logger.info()
- logger.debug()

### ログのファイル出力
これが基本形

```python
from logging import getLogger, INFO, Formatter
from logging.handlers import TimedRotatingFileHandler
logger = getLogger('handler_name')
logger.setLevel(INFO)
handler = TimedRotatingFileHandler(
    '/var/log/apilog.log',
    when='d',
    backupCount=7,
    encoding='utf-8',
    utc=False
)
handler.setFormatter(Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger.addHandler(handler)
```

### 主なログフォーマット

- %(asctime)s	時刻
- %(created)f Unix時間
- %(filename)s ファイル名
- %(funcName)s 関数名
- %(levelname)s ログレベル
- %(lineno)d ロギングされた行番号
- %(message)s ログメッセージ
- %(module)s モジュール名
- %(name)s ロガー名
- %(pathname)s ファイルのフルパス
- %(process)d プロセスID
- %(processName)s プロセス名
- %(thread)d スレッドID
- %(threadName)s スレッド名


## datetime

```python
>>> import datetime
>>> now = datetime.datetime.now()
>>> now.strftime('%Y/%m/%d %H:%M:%S')
'2018/09/06 14:58:21'
>>> datetime.datetime.strptime('2018-08-07T17:29:20.581498Z', '%Y-%m-%dT%H:%M:%S.%fZ')
datetime.datetime(2018, 8, 7, 17, 29, 20, 581498)
```

### フォーマット
- %y 0埋めした2桁の年
- %Y 4桁の年
- %b 月の短縮形
- %B 月名
- %m 0埋めした月
- %d 0埋めした日
- %a 曜日の短縮形
- %A 曜日名
- %H 0埋めした時間(24表記)
- %I 0埋めした時(12表記)
- %p AM/PM
- %M 0埋めした分
- %S 0埋めした秒
- %s UnixTime
- %f 0埋めしたマイクロ秒
- %z UTCオフセット
- %Z タイムゾーン
- %c 無難な日時表示
- %x 無難な日付表示
- %X 無難な時刻表示


## 例外処理
```python
try:
    # some code
except IOError:
    ...
except (KeyError, ValueError) as e:
    ...
except Exception as e:
    logger.except(e)
```

### 主な組み込み例外
- Exception
- AttributeError
- ValueError
- IndexError
- ImportError
- KeyboardInterrupt
- RuntimeError
- StopIteration
- TypeError