プロジェクト

全般

プロフィール

模擬試験実施時メモ1 » 履歴 » バージョン 4

Tatsuya ISHIGAKI, 2025/08/27 12:22

1 1 Tatsuya ISHIGAKI
# 模擬試験メモ
2
## 実施模試
3
- [ExamApp](https://python-basic.com/) 実践/初級
4
  - 時間制限なし
5
  - 40問
6
7 3 Tatsuya ISHIGAKI
## 結果
8
- 正解 29 / 40
9
- 正答率 72 %
10
11 1 Tatsuya ISHIGAKI
## メモ
12
- pip
13
  - バージョン指定インストール `pip install package==2.0.1`
14
    - バージョンの範囲指定インストール
15
      - `pip install "package<3.0"`
16
      - `pip install "package>=2.0,<3.0"`
17
  - 別バージョンインストール `pip --upgrade install package==1.0.0`
18
    - 短いオプション `pip -U install package==1.0.0`
19
    - 指定バージョンは新旧どちらでもOK (ダウングレードもできる)
20
    - **??** `pip --upgrade install` `pip install --upgrade` 両方の記載があるが、どちらでも良いのか
21 4 Tatsuya ISHIGAKI
      - → **本の記述ミス** (--upgrade, -U オプションは install の後)
22
        - X : `pip --upgrade install` `pip -U install`
23
        - O : `pip install --upgrade` `pip install -U`
24 1 Tatsuya ISHIGAKI
  - アンインストール `pip uninstall package`
25
    - 指定パッケージのみ削除、依存パッケージはアンインストールされない
26
- flake8
27
  - flake8 はコーディングの静的チェックを、以下の3ツールを使用して行う
28
    - `pycodestyle` PEP8 への準拠チェック
29
    - `Pyflakes` 文法のチェック
30
    - `McCabe` コードの複雑度をチェック
31
  - エラーコード1文字目は使用ツールで変わる
32
    - `E` `W` pycodestyle
33
    - `F` Pyflakes
34
    - `C` McCabe
35
- 例外処理 try-except
36
  - `try` の後には `except` または `finally` が必須
37
  - `else` を入れる場合は全 `except` の後に記載
38
  - `finally` は必ず最後
39
  - 処理フロー
40
    - `try` で例外発生
41
      - 最初に適合した `except` 節の処理が実行され、存在すれば `finally` 節が実行される
42
      - 適合する `except` 節が無ければ、存在する場合は `finally` 節が実行され、例外は再送出される
43
- 引数
44
  - 位置引数としての呼び出しでは、仮引数の順に適用
45
  - 実引数にイテラブルを渡すと、位置引数に展開される
46
  - 実引数に `**` を前置した辞書を渡すと、キーワード引数として展開される
47
  - (`**` を前置した仮引数である) 可変数キーワード引数は、辞書として使用する
48
- イテラブル関連の変換
49
  - `items()` (辞書のメソッド) は、キーとバリューをタプルでまとめたイテレーターを返す
50
  - `enumerate()` 関数は、引数イテラブルに対してインデックスと値をタプルでまとめたイテレーターを返す
51
  - `zip()` 関数は、複数のイテラブルを引数にとり、それらの同一インデックスをタプルにまとめたイテレータを返す
52
    - 引数のうち最短のイテラブルに合わせたタプル数となる
53
  - `split()` (strのメソッド) は、指定文字で分割した文字列リストを返す
54
- 内包表記
55
  - フィルタを使う場合は `(変数を使って取得値を決める)式 for 変数 in イテラブル if 条件式`
56
    - 例(リスト): `[i * 2 for i in range(10) if i % 2 == 0]`
57
      - → `[0, 4, 8, 12, 16]`
58
  - 各種内包表記
59
    - リスト `[~]`
60
    - 集合 `{~}` (リストと同様で、括弧のみ異なる)
61
    - 辞書 `{key: value for ~}` (集合と同様で、先頭にコロンを使用してキーと値を記述)
62
    - ジェネレーター式 `(~)` (リストと同様で、括弧のみ異なる)
63
      - ジェネレーターなので、値取得の度に値が生成される
64
    - タプルの内包表記は存在しない
65
- 三項演算子
66
  - Python の三項演算子 `(条件成立時の値) if (条件) else (条件不成立時の値)`
67
  - 例: `"even" if a % 2 == 0 else "odd"`
68
- 辞書
69
  - `{}` は空の辞書 (集合ではない)
70
    ```python
71
    >>> a = {}
72
    >>> type(a)
73
    <class 'dict'>
74
    >>> b = set()
75
    >>> type(b)
76
    <class 'set'>
77
    ```
78
- @property
79
  - インスタンスメソッド (引数 self のみ) に `@property` デコレーターを付けると、`()` 無しで、メソッド呼び出し結果を取得できる
80
  - `@<プロパティ名>.setter` デコレーターによって、値設定も可能
81
    - プロパティ名 (`@property` を付けたメソッド名) 
82
    - このメソッドの第2引数で値受け取る `(self, <value>)`
83
- @classmethod
84
  - インスタンス化せずに呼び出せるメソッド
85
  - 第一引数 (仮引数) としてクラスオブジェクト (インスタンスではない) が暗黙的に渡される
86
- @staticmethod
87
  - インスタンス化せずに呼び出せるメソッド
88
  - 暗黙的に渡される引数は無い
89
- @dataclass
90
  - クラスデコレーターとして使用する
91
  - クラスのフィールドへの型ヒントが必須となる
92
    - 厳密には、型ヒントがついたフィールドのみ自動生成されるメソッド (コンストラクタ含む) に反映される
93
    - 型ヒント無しのフィールドも、通常のフィールドとして使用はできる
94
  - `__init__()`, `__repr__()`, `__eq__()` 等が自動で生成される
95
  - 生成されるメソッド (コンストラクタ含む) は、定義時の記述順に従う
96
    - コンストラクタの仮引数が、フィールド記述順になるということ
97
    - フィールドにデフォルト値を指定する場合、コンストラクタの仮引数にもデフォルト値が定義される
98
      - 引数の順番となる為、デフォルト値のあるフィールドは、無いフィールドより後ろに定義する
99
    - コンストラクタへの実引数は、デフォルト値無しのフィールド数が最低限必要となる
100
  - フィールドの型ヒントは、Python の動的型付けの性質上、実行時に型ヒント以外の値が渡されてもエラーにはならない
101
- 型ヒント
102
  - すべての型ヒントは、動作時の制限にはならない (エラー発生しない)
103
    - mypy などでコードレベルでの静的型チェックでの検査、可読性向上の為の記述となる
104
  - typing モジュールでの型ヒント
105
    - `Union[型1, 型2]` 型1 または 型2
106
    - `Optional[型1]` 型1 または None
107
    - `Any` 任意の型
108
    - `Literal[値1, 値2, 値3]` いづれかの「値」
109
  - typing モジュールその他
110
    - `TypeVar` 型変数の型
111
    - `TypedDict` TypedDict を継承してクラス定義すると、フィールド名文字列をキー、値をその型ヒントの型、とする辞書型 (クラス) を定義したことになる
112
      - TypeDict を継承したクラス定義では、型タイプ無しのフィールド定義があると失敗するみたい
113
      - また、フィールドにデフォルト値を付ける意味は無い様子 (勝手にキーバリューペアが増える、ということは無い)
114
      - (他と同様に、あくまでも型ヒントなので動作時の型不一致でもエラーは発生しない)
115
- 正規表現 (`re` モジュール)
116
  - 関数 `search(pat, str)`
117
    - パターン pat にマッチする str 中の最初の部分を Match で返す
118
    - マッチしない場合は None を返す
119
  - 関数 `match(pat, str)`
120
    - str の先頭に pat がマッチすれば Match を返す
121
    - マッチしない場合は None を返す
122
- unicodedata.normalize()
123
  - 関数 `normalize(form, unistr)`
124
    - form には `NFC` `NFKC` `NFD` `NFKD` いずれかを指定 (多くは NFKC でよいはず)
125
- 文字列メソッドでの変換
126
  - (以下は、全角文字の英字に対しても変換成功する)
127
  - `swapcase()` 大文字と小文字を入れ替える
128
  - `title()` 単語単位で先頭が大文字、他を小文字にする
129
  - `capitalze()` 文字列の先頭だけ大文字、他を小文字にする
130
    ```python
131
    >>> "NaMe".swapcase()
132
    'nAmE'
133
    >>> "nAmE".swapcase()
134
    'NaMe'
135
    >>> "my nAmE IS".title()
136
    'My\u3000Name Is'
137
    >>> "my nAmE IS".title()
138
    'My Name Is'
139
    >>> "my nAmE IS".capitalize()
140
    'My name is'
141
    ```
142
- datetime モジュールの datetime クラス
143
  - `now()` は datetime クラスのクラスメソッド
144
- time モジュール
145
  - モジュールで使用される `struct_time` オブジェクト
146
  - 関数 `sleep(secs)` : secs 秒の間、**現在のスレッドの** 実行を中断する
147
    - async 構文中では期待通りに動かない可能性あり、代わりに `asyncio.sleep()` を使用する
148
- イテラブル関連関数
149
  - 関数 `sorted()`: イテラブルを昇順ソートした新しいリストを返す
150
    - 引数 `reverse=True` で降順ソート
151
  - 関数 `reversed()`: イテラブルを **逆順** (降順ではない) にした **イテレーター** (リストではない) を返す
152
  - メソッド `list.sort()`: リスト要素をソートする (戻り値は None)
153
  - メソッド `list.reverse()`: リスト要素を逆順にする (戻り値は None)
154
  - **operator** モジュール
155
    - 以下はソートの key 引数に使用する 2 関数
156
    - 関数 `itemgetter()`: インデックス、キーによるソート要素、ソート順の指定
157
    - 関数 `attrgetter()`: (クラスの) 属性によるソート要素、jソート順の指定
158
- enum
159
  - `enum.Enum` クラスを継承して定義
160
  - フィールドにを列挙値として定義する
161
  - `enum.auto()` で、フィールド値を自動で振ることが可能 (1から順に)
162
  - Class1 なら定数取得は `Class1.FIRST` `Class1['FIRST']` `Class1(1)` (最後のは値から取得)
163
    - 取得した定数は `name` `value` 属性を持つ
164
- itertools
165
  - `chain()` イテラブルを連結したイテレーターを返す
166
  - `groupby()` イテラブルを key 引数で判定し、連続する値をグループ化したイテレーターを返す
167
    - `list(groupby("aaabba"))`
168
      - → `[('a',【'a' 3回のイテレータ】),('b',【'b' 2回のイテレータ】),('a',【'a' 1回のイテレータ】)]`
169
  - `islice(iter, stop)` `islice(iter, start, stop[, step])`
170
    - 通常のスライスと同様の結果を得られる
171
    - `islice()` ではジェネレーターなどの大きさ不明の対象を扱うことができる
172
    - 大きさ不明を扱えるため、start, stop は 0 以上、step は 1 以上でないとエラーとなるようになっている
173
  - `zip_longest(*iter, fillvalue=None)`
174
    - 組み込みの `zip()` と同様だが、最も長いイテラブルに合わせたイテレーターが返される
175
    - 短いイテラブルの足りない要素の値を埋めるのに、fillvalue の値が使用される
176
  - `product(*iter, repeat=1)`
177
    - デカルト積
178
    - repeat は、イテラブル全体が N 回指定されたのと同じ
179
      - `product(iter1, iter2, repeat=2)` は以下と等価 (各イテレータは毎回同じ列を返すとする)
180
      - `product(iter1, iter2, iter1, iter2)`
181
      ```python
182
      >>> pr1 = itertools.product("AB", "12")
183
      >>> for v1, v2 in pr1:
184
      ...     print(v1+v2)
185
      ...
186
      A1
187
      A2
188
      B1
189
      B2
190
      >>> pr2 = itertools.product("AB", "12", repeat=2)
191
      >>> for v1, v2, v3, v4 in pr2:
192
      ...     print(v1+v2+v3+v4)
193
      ...
194
      A1A1
195
      A1A2
196
      A1B1
197
      A1B2
198
      A2A1
199
      A2A2
200
      A2B1
201
      A2B2
202
      B1A1
203
      B1A2
204
      B1B1
205
      B1B2
206
      B2A1
207
      B2A2
208
      B2B1
209
      B2B2
210
      >>> pr3 = itertools.product("AB", repeat=2)
211
      >>> for v1, v2 in pr3:
212
      ...     print(v1+v2)
213
      ...
214
      AA
215
      AB
216
      BA
217
      BB
218
      ```
219
  - `permutations(iter, r=None)`
220
    - 長さ r の順列タプルのイテレーターを返す
221
    - r 未指定なら、iter の長さとみなす
222
  - `combinations(iter, r)`
223
    - 長さ r の組合せタプルのイテレーターを返す
224
    - ※インデックスが異なれば別要素とするので、イテラブルに重複あれば、単一の組合せタプルに同一値が入ることはある
225
  - `combinations_with_replacement(iter, r)`
226
    - 長さ r の組合せタプルのイテレーターを返す
227
    - 同一要素 (同一インデックスの要素) を複数回使用する組合せを含む
228
- copy
229
  - `copy()` 浅いコピー
230
    - リストなどの第1階層のみの値がコピーされ、参照が含まれる場合は参照のまま (コピー元の参照をそのまま) コピーする
231
  - `deepcopy()` 深いコピー
232
    - 再帰的にオブジェクトをコピーする
233
- os
234
  - `remove()` ファイル削除 (ディレクトリ指定はエラー)
235
  - `rmdir()` 空のディレクトリを削除 (空でなければエラー)
236
  - `removedirs()` ディレクトリを再帰削除
237 2 Tatsuya ISHIGAKI
- io
238
  - class `StringIO(initial_value='', newline='\n')`
239
    - メソッド `read(size=-1)` `write(s)` `tell()` `seek(offset, whence=SEEK_SET)` `getvalue()` `close()`
240
  - class `BytesIO([initial_bytes])`
241
    - メソッド `read(size=-1)` `write(s)` `tell()` `seek(offset, whence=SEEK_SET)` `getbuffer()` `getvalue()` `close()`
242
      - `getbuffer()` では実際のバッファを返し、読み書き可能
243
      - `getvalue()` ではバッファ以内を新たなバイト列で返す
244
  - `patch()` の new_callable 引数に `StringIO` `BytesIO` を渡して、IO モックとして活用
245
  - `contextlib.redirect_stdout(new_target)` `contextlib.redirect_stderr(new_target)` に指定して一時的に IO モックとして活用
246 1 Tatsuya ISHIGAKI
- sys
247
  - `exit([arg])` 終了ステータス arg (デフォルト 0) で Python 実行を終了
248
    - ※ try-except 内で実行した場合、finally があれば実行されたあとに終了する
249 2 Tatsuya ISHIGAKI
  - `argv` コマンドライン引数を文字列リストとして保持 (インデックス 0 はファイル名)
250
  - `path` モジュール検索するパスを文字列リストとして保持
251
    - 初期値は
252
      - 実行ディレクトリ (対話型の場合は空文字列)
253
      - 環境変数 **PYTHONPATH** の値
254
      - python インストール先 (標準、インストール済みモジュールの配置場所)
255
    - 実行中の要素追加で、import で検索するパスを追加可能
256
  - `stdin` `stdout` `stderr`
257
  - `breakpoint()` `breakpointhook()`
258
    - デフォルトで `breakpointhook` には pdb デバッガが設定されているが、任意の呼び出し可能オブジェクトを設定可能
259
      - 環境変数 **PYTHONBREAKPOINT** に関数名を渡しても同様の設定となる
260
  - `version_info` python のバージョン情報を 5 要素タプル (名前付きタプル) で保持
261
    - `major` 整数
262
    - `minor` 整数
263
    - `micro` 整数
264
    - `releaselevel` 次のいずれかの文字列 **alpha**, **beta**, **candidate**, **final**
265
  - `serial` 整数
266
  - `sys.stdout.write()` は引数文字列のみ出力、`print()` は改行を加えて出力
267
  - `sys.stdin.read()` は **EOF** で入力完了、`input()` は Enter キーで入力終了
268
- argparse
269
  - class `ArgumentParser()`
270
    - コンストラクタ引数 `prog` `usage` `description` `epilog` `parents` `formatter_class` `prefix_chars` `fromfile_prefix_chars` `argument_default` `conflict_hander` `add_help` `allow_abbrev` `exit_on_error`
271
    - メソッド `add_argument()`
272
      - `name` ("foo" 等) or `flags` ("-f", "--foo" 両方等)
273
- pathlib
274
  - `PurePath` `PurePosixPath` `PureWindowsPath`
275
  - `Path` `PosixPath` `WindowsPath`
276
  - パスオブジェクトは `/` (**スラッシュ演算子**) でパスオブジェクト、文字列と結合可能 (結果はパスオブジェクトとなる)
277
    - 演算子の右が絶対パスの場合は、演算子の左は無視される
278
      - Windows の場合 (演算子の左にドライブ文字あり、右にルートからのパスの場合) は、ドライブ文字は保持される
279
  - オブジェクト生成時には Path オブジェクト、パス文字列を任意数渡すことで結合されたパスのオブジェクトが生成される
280
  - パスオブジェクト属性
281
    - `parts`(タプル) `drive` `root` `anchor` `parents` `parent` `name` `suffix` `suffixes` `stem`
282
  - PurePath メソッド
283
    - `is_absolute()` `is_relative_to(*other)` `match(pattern)` `with_name(name)` `with_stem(stem)` `with_suffix(suffix)`
284
  - Path メソッド
285
    - クラスメソッド `cwd()` `home()`
286
    - `stat()` `chmod(mode)` `exists()` `glob(pattern)` `is_dir()` `is_file()` `iterdir()`
287
    - `mkdir()` `open()` `read_text()` `rename(target)`(target はパスオブジェクトでも可) `resolve()` `rmdir()`(空ディレクトリ対象) `touch()` `unlink()`(ファイル削除) `write_text(data)`
288
- tempfile
289
  - `TemporaryFile()` `NamedTemporaryFile()` `SpooledTemporaryFile()`
290
    - コンテキストマネージャーとして使用すれば、ファイルオブジェクトとして扱える
291
      - with を抜けると、ファイルが閉じられ、削除される
292
    - コンテキストマネージャーとして使用しなかった場合、オブジェクトの `close()` で閉じる
293
  - `TemporaryDirectory()`
294
    - コンテキストマネージャーとして使用した場合、as によってパス文字列が渡される
295
      - with を抜けると、ディレクトリと、ディレクトリ内のすべてのファイルが削除される
296
    - コンテキストマネージャーとして使用しなかった場合、オブジェクトの `cleanup()` を呼ぶことで同様の削除動作
297
- shutil
298
  - `copyfile()`(宛先はファイルのみ) `copy()`(宛先ディレクトリ可) `copy2()`(宛先ディレクトリ可) `copymode()` `copystat()`
299
  - ディレクトリ再帰操作 `rmtree()` `move()`
300
  - shutil はコピー、移動での上書きでエラーは発生しない
301
  - shutil は src, dst が同じだとエラー発生
302
- csv
303
  - `reader(csvfile, dialect, **fmtparams)` `writer(csvfile, dialect, **fmtparams)`
304
  - `writer.writerow()` `writer.writerows()`
305
  - `DictReader(f, fieldnames, restkey, restval, dialect, *args, **kwds)`
306
  - `DictWriter(f, fieldnames, restkey, extrasaction, dialect, *args, **kwds)`
307
  - `Sniff()`
308
    - `sniff(sample, delimiters=None)`
309
    - `has_header(sample)`
310
- json
311
  - `dumps(obj)` `loads(str)` オブジェクト ↔ 文字列
312
  - `dump(obj, fp)` `load(fp)` オブジェクト ↔ ファイル(内文字列)
313
- urllib.parse
314
  - `urlparse(urlstring)` url 文字列をパースして urllib.parse.ParseResult を返す
315
  - `urllib.parse.ParseResult` の属性 (一部インデックスアクセスも可能)
316
    - `scheme` `[0]`
317
    - `netloc` `[1]`
318
    - `path` `[2]`
319
    - `params` `[3]`
320
    - `query` `[4]`
321
    - `flagment` `[5]`
322
    - `username`
323
    - `password`
324
    - `hostname`
325
    - `port`
326
  - `parse_qs(qs)` クエリ文字列をパースして辞書を返す
327
  - `parse_qsl(qs)` クエリ文字列をパースして、ペアのリストを返す
328
  - `urlencode(query)` マッピングオブジェクトか、ペアのリストを渡すとクエリ文字列を返す
329
  - `quote(string)` url として使用できる文字列へ変換 (パーセントエンコード)
330
    - 空白文字は `%20` へエンコード
331
    - デフォルトでは `/` はエンコードされない
332
  - `quote_plus(string)` (同上)
333
    - 空白文字は `+` へエンコード
334
    - デフォルトでは `/` がエンコードされる
335
  - `urljoin(base, url)` 
336
- urllib.request
337
  - `urlopen(url, data=None)`
338
    - GET: url を文字列で指定、data は None
339
    - POST: url を文字列で指定、data に bytes または ファイルオブジェクトを渡す
340
    - 他の HTTP メソッドは、url に次の `Request` オブジェクトを渡す
341
    - 戻り値は `http.client.HTTPResponse` (HTTP, HTTPS)
342
      - (HTTP, HTTPS 以外だと `urllib.response.addinfourl` らしい)
343
    - ファイルダウンロードの場合は `urlopen(~).read()`
344
  - class `Request(url, data=None, 略, method=None)`
345
- base64
346
  - `b64encode(s, altchars=None)` s に変換対象の **バイト列** を指定
347
    - altchar には `+` `/` を置換する2バイト列を指定
348
    - 戻り値もバイト列 (bytes)
349
  - `urlsafe_b64encode()` では、url として使用できる様に変換する
350
    - 具体的には `+` → `-`, `/` → `_` の変換が適用される
351
  - `b64decode(s, altchars=None, validate=False)`
352
  - `urlsafe_b64decode()`
353
- doctest
354
  - `testmod()` モジュール中のドキュメントテストを実施する
355
  - `testfile(filename)` テキストに記載されたドキュメントテストを実施する
356
  - コマンドラインでの実行 `python -m doctest ファイル名`
357
    - ファイル名が `.py` で終わる場合、そのファイルを単独モジュールとして読み込んで `testmod()` が実行される
358
    - ファイル名が `.py` で終わらない場合、そのファイルを対象に `testfile()` が実行される
359
- unittest
360
  - class `TestCase()` を継承してテストクラスを定義
361
    - `test` で始まるメソッド名がテスト内容となる
362
    - アサーションメソッド (assert*) を使用してテストを行う
363
    - 通常は単一メソッド内のアサートは最初の失敗で停止だが、 `subTest(msg, **params)` で、失敗時も続行するテストが書ける
364
    - 準備メソッド `setUp()` `setUpClass()`
365
    - 事後メソッド `tearDown()` `tearDownClass()`
366
  - コマンドラインインターフェース
367
    - 基本 `python -m unittest 対象`
368
      - 対象はモジュール、クラス、メソッドを指定可能
369
      - `-b` 出力をバッファし、成功時は出力をしない
370
      - `-c` Ctrl-C をテスト終了まで遅延させる (2回目の入力は通常通り割り込み)
371
      - `-f` 初回のエラーでテストを停止
372
      - `-k` テスト対象の部分文字列マッチング指定
373
    - テストディスカバリ `python -m unittest discover ...`
374
      - テストファイルの範囲を指定して実行
375
      - `-v` 詳細出力
376
      - `-s` ディスカバリ開始ディレクトリ
377
      - `-p` テストファイル名パターン (デフォルト `test*.py`)
378
      - `-t` 最上位のディスカバリディレクトリ
379
- unittest.mock
380
  - class `Mock`
381
    - spec, spec_set で指定しない限りは、キーワード引数で追加指定した属性以外を参照してもエラーにはならない
382
      - spec, spec_set で指定した場合は、指定外の属性は AttributeError
383
- pdb, breakpoint()
384
  - 処理中に `pdb.set_trace()` を挿入しておくと、実行中にその場所でデバッガ pdb が起動する
385
  - `pdb.set_trace()` の代わりに組み込み関数 `breakpoint()` でも同じ
386
    - 実際には `breakpoint()` によって `sys.breakpointhook` に設定されたオブジェクトが呼ばれる (デフォルトで sys.breakpointhook には pdb.set_trace が設定されている)
387
  - 対話モードでは `pdb.run(デバッグ対象)` でデバッグ開始 (breakpoint() で開始する)
388
  - コマンドラインから `python -m pdb ~.py` で実行すると、異常終了時にデバッグモードへ移行する
389
  - 対話モードでは `pdb.pm()` で、異常終了時のデバッグが可能
390
- timeit
391
  - コマンドラインインターフェース `python -m timeit`
392
    - `-n` `-r` `-s` `-u` `-p` `-v`
393
    - 回数、ループを行い、回数毎の時間が最短のものを、回数で割った値を表示する
394
      - (100万回x5 で結果が 1s, 2s, 4s, 2s, 3s なら、 1s/1000000 = 1usec)
395
  - python インターフェース
396
    - 関数 `timeit()` `repeat()`
397
    - class `Timer`
398
      - メソッド `timeit()` `repeat()`