Python Cheat Sheet
よく忘れるやつ
演算
>>> 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
ビット操作
>>> bin(0b1 << 8)
'0b100000000'
>>> bin(0b1000 >> 3)
'0b1'
>>> bin(0b1111 & 0b110)
'0b110'
>>> bin(0b1000 | 0b1001)
'0b1001'
>>> bin(0b1100 ^ 0b1001)
'0b101'
型の確認
>>> isinstance(0.1, float)
True
>>> type(0.1)
<class 'float'>
フォーマット関数
呼び出し
>>> '{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'
幅指定
>>> '{:<20}'.format('left aligned')
'left aligned '
>>> '{:>20}'.format('right aligned')
' right aligned'
>>> '{:^20}'.format('center')
' center '
>>> '{:-^20}'.format('fill center')
'----fill center-----'
表記制御
>>> '{: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'
ロギング
基本形
from logging import getLogger, DEBUG, StreamHandler
logger = getLogger(__name__)
logger.setLevel(DEBUG)
logger.addHandler(StreamHandler())
logger.debug('hello! %s', 'world')
各ファイルは基本的に以下のように定義すればよい
from logging import getLogger
logger = getLogger(__name__)
from logging import ...
という書き方を使うのはlogging
とlogger
を書き間違えやすいため。(logging.debug()
のような関数も存在するのでエラーが発生せず、間違いに気づきづらい)
ログレベル
- logger.critical()
- logger.error()
- logger.warning()
- logger.info()
- logger.debug()
ログのファイル出力
これが基本形
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
>>> 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 無難な時刻表示
例外処理
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