プロジェクト

全般

プロフィール

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

Tatsuya ISHIGAKI, 2025/08/29 11:30

1 1 Tatsuya ISHIGAKI
- datetime
2
  - `date` year, month, day
3
  - `time` hour, minute, second, microsecond, tzinfo
4
  - `datetime` year, month, day, hour, minute, second, microsecond, tzinfo
5
  - `timedelta` days, seconds, microseconds
6
    - コンストラクタ引数には weeks, milliseconds 等も指定可能
7
    - `date` `datetime` インスタンスの差を表す
8
  - 注意メソッド
9
    - `date.weekday()` 曜日を int 取得 (月0,...,日6)
10
    - `date.isoweekday()` 曜日を int 取得 (月1,...,日7)
11
    - `isocalendar()` nemed tuple (year, week, weekday) を取得 (**ISO 歴** の年、週番号、曜日)
12
      - ISO歴
13
        - 最初の木曜日を含む週が、その年の第1週である (その年の第1週は、1月4日を含む週である)
14
          - ※ 1/1 - 1/3 は、前年の最終週に含まれることがある
15
          - ※ 12/29 - 12/31 は、次年の第1週に含まれることがある
16
        - 週は1から始まり、52 または 53 までとなる
17
        - 曜日は 月1,...,日7
18
        - 例 : 2025年1月1日は水曜日なので (year=2025, week=1, weekday=3)
19
          - 2025年の第1週は(2024年)12/30(月)から開始している
20
        - 例 : 2027年1月1日は金曜日なので (year=2026, week=53, weekday=5)
21
          - 2027年の第1週は1/4(月)から開始している
22
        ```python
23
        >>> from datetime import date
24
        >>> date20270101 = date(2027, 1, 1)
25
        >>> date20270101
26
        datetime.date(2027, 1, 1)
27
        >>> date20270101.isoformat()
28
        '2027-01-01'
29
        >>> date20270101.isocalendar()
30
        datetime.IsoCalendarDate(year=2026, week=53, weekday=5)  # 2027-01-01 は 2026年の第53週
31
        ```
32
    - `strftime(format)` 書式指定通りに文字列出力
33
      - `date` `time` `datetime` のインスタンスメソッド
34
      - date では時刻部分は 0 とみなす
35
      - time では日付部分は 1900-01-01 とみなされた (実験結果)
36
    - `strptime(str, format)` 書式文字列から指定文字列をパースして `datetime` オブジェクトを作成する
37
      - `datetime` のクラスメソッド (※ `date` `time` には同名メソッドは無い)
38
  - 書式コード (注意が必要なもの)
39
    - `%y` 西暦下2桁、`%Y` 西暦4桁
40
    - `%a` 曜日名短縮形 (Sun, Mon, ...) `%A` 曜日名
41
    - `%w` 曜日十進表記 (**日,月,...,土 → 0,1,...,6**)
42
      - **※weekday(), isoweekday() どちらとも異なる**
43
    - `%U` 年の最初の**日曜から土曜**を 01 とした週番号 (新年の初日曜より前の日は 00 に属する)
44
    - `%W` 年の最初の**月曜から日曜**を 01 とした週番号 (新年の初月曜より前の日は 00 に属する)
45
    - `%H` 時 (00-23)、`%I` 時 (01-12)
46
    - `%f` マイクロ秒 (6桁ゼロ埋め)
47
    - `%p` AM, PM
48
    - `%z` タイムゾーン名 ()
49
    - `%%` 文字 `%`
50
    - ISO (ISO-8601) 互換用の書式
51
      - `%V` ISO歴の週番号
52
      - `%u` ISO歴の曜日十進表記 (月,火,...,日 → 1,2,...,7)
53
    - ロケールに合わせた一括コード
54
      - `%c` 日時 (年月日時分秒曜日)
55
      - `%x` 日付 (年月日)
56
      - `%X` 時刻 (時分秒)
57
- 組み込み関数 sorted, reversed
58
  - `sorted(iterable, key=None, reverse=False)` iterable の要素を並べ替えた新たな**リスト**を返す
59
  - `reversed(object)` object 要素を逆順とした**イテレータ**を返す
60
- list.sort(), list.reverse()
61
  - list のインスタンスメソッドで、list インスタンスを変更する破壊的操作となる
62
    - `sort(key=None, reverse=False)` key, reverse に従い並べ替える
63
    - `reverse()` 要素の並びを逆転させる (ミュータブルシーケンス一般に実装(されるべき)操作)
64
  - 戻り値は None
65
- operator.itemgetter(), operator.attrgetter()
66
  - `sort()` `sorted()` 等の引数 key への活用に便利な関数
67
  - `itemgetter(item)` `itemgetter(*items)` `[]`で取得できる値の取得
68
    - 複数指定して key に使えば、要素(イテレータ等)内の任意要素でソート順を指定できる
69
  - `attrgetter(attr)` `attrgetter(*attrs)` `.`(ドット)で取得できる値の取得
70
    - 複数指定して key に使えば、要素(属性持ちオブジェクト)内の任意属性でソート順を指定できる
71
- collections.Counter
72
  - `Counter([iterable-or-mapping])`
73
  - 辞書を拡張したクラス
74
    - カウント済み要素をキー、その出現数を値 (整数) として保持
75
    - カウント済みの要素を `[]` で指定して数を取得できる
76
    - カウント対象に存在しない要素を `[]` 指定してもエラーにならず 0 を返す
77
    - 後からカウントを増減もできるし、新たな要素に対していきなり数を割り当てても OK
78
  - `elements()` 「キーを値分繰り返す」を全要素に対して繰り返すイテレーターを返す (値が0以下のキーは除かれる)
79
  - `most_common([n])` 値が大きな要素順にタプル `(キー, 値)` を並べたリストを返す (n 指定なら最大 n 個のタプルを含む)
80
  - `subtract(iterable-or-mapping)`
81
  - `update(iterable-or-mapping)`
82
- collections.defaultdict
83
  - 辞書の拡張で、保持していないキーへのアクセス時に返す内容を予め決められる (辞書では無条件にエラー)
84
  - `defaultdict(default_factory=None, /[, ...])`
85
    - default_factory には呼び出し可能オブジェクトを設定
86
- collections.namedtuple
87
  - `namedtuple(typename, field_names)` typename というクラスが返される (tuple のサブクラス)
88
  ```python
89
  >>> from collections import namedtuple
90
  >>> Pet = namedtuple('Pet', 'animal, name, age')  # Pet型を作成
91
  >>> seven = Pet('ferret', 'せぶん', 3)  # Pet型のインスタンスを作成
92
  >>> seven  # 「名前=値」の形式で確認できる
93
  Pet(animal='ferret', name='せぶん', age=3)
94
  >>> michiko = Pet('cat', 'ミチコ', 1)  # 別のインスタンスを作成
95
  >>> michiko
96
  Pet(animal='cat', name='ミチコ', age=1)
97
  >>> seven.age  # 属性名で値を取得
98
  3
99
  >>> seven[1]  # インデックスでもアクセスできる
100
  'せぶん'
101
  >>> animal, name, age = michiko  # アンパック代入も可能
102
  >>> animal
103
  'cat'
104
  ```
105
- enum
106
  - `enum.Enum` を継承したクラスのデータ属性として定数定義
107
    - 値に `enum.auto()` を指定すると、1 から順に整数を割り当てる
108
  - `enum.unique` enum.Enum 継承クラスへのクラスデコレーターとして使用し、複数定数への同一値の割り当てを禁止する (ValueError送出)
109
- itertoos
110
  - `zip_longest(*iterables, fillvalue=None)`
111
    - 組み込み関数 `zip()` と同様に、指定イテラブルの同一インデックスを並べた **タプル** を取得するイテレーターを返す
112
    - `zip()` と共に、辞書が指定された場合はキーが取得対象となる
113
    - `zip()` との違いは、イテレーター出力数が引数内の最長イテラブルに合わせた要素数であること (zip() は最短イテラブル要素数)
114
    - fillvalue の値で、足りない要素が埋められる
115
  - `chain(*iterables)` 要素を接続したイテレーターを返す
116
  - `groupby(iterable, key=None)`
117
    - イテラブル要素を key で取得した値ごとに等価な内容にグループ化する (ただし、連続する要素のみをグループ化)
118
    - 全体としては **2要素タプルのイテレーター**
119
    - 各要素 (2要素タプル) は **(グループキー, グループ内要素を返すイテレーター)** の形
120
  - `islice(iterable, stop)` `islice(iterable, start, stop[, step])`
121
    - スライスと同様の指定範囲を返すイテレーターを返す
122
  - `product()` `permutations()` `combinations()` `combinations_with_replacement()`
123
- copy
124
  - `copy()` `deepcopy()`
125
- os
126
  - 環境変数関連
127
    - `os.environ` マップ型オブジェクト
128
      - python プロセス起動時に環境変数を読み込み、値が設定される
129
      - 辞書インタフェースでキーに環境変数名を指定して取得、設定可能 (プロセス内でのみ有効な変更)
130
      - `os.putenv()` で環境変数への設定が可能だが、`os.environ` へ反映されない (os.environ を変更した場合には `putenv()` が呼ばれる) 
131
      - `os.unsetenv()` での環境変数の削除も `putenv()` と同様に `os.environ` の要素削除を行わない (os.environ の要素削除時 (del) には `unsetenv()` が呼ばれる)
132
  - プロセス関連 (環境変数以外)
133
    - `getuid()` `geteuid()` `getgid()` `getegid()` `getpid()` `getpgid()` `getppid()` `getgroups()`
134
    - get に対応する関数 `set*()`
135
  - ファイル関連
136
    - 関数
137
      - `chdir()` `chmod()` `chown()`
138
      - `getcwd()` `listdir()`
139
      - `mkdir()` `makedirs()`
140
      - `remove()` `rmdir()` `removedirs()`
141
      - `rename()` `renames()`
142
      - `symlink()`
143
    - 定数
144
      - `curdir` `pardir`
145
      - `sep` `extsep` `linesep`
146
  - システム情報
147
    - `confstr_names` `confstr(name)`
148
    - `sysconf_names` `sysconf(name)`
149
    - `cpu_counts()` CPU 数
150
    - `getloadavg()` 過去1, 5, 15 分間のロードアベレージ (float 3 要素のタプル)
151
  - `urandom(n)` n バイトのランダム bytes を生成
152
- io
153
  - インメモリテキストストリーム `StringIO`
154
    - `read()` `write()` `seek()` `tell()` `getvalue()` `close()`
155
  - インメモリバイナリストリーム `BytesIO`
156
    - StringIO メソッドに加え、`getbuffer()` 書き換え可能
157
  - seek() の第2引数に指定する値
158
    - `io.SEEK_SET` ストリーム先頭
159
    - `io.SEEK_CUR` 現在位置
160
    - `io.SEEK_END` ストリーム末尾
161
- sys
162
  - `sys.argv` コマンドライン引数のリスト (list[str])
163
  - `sys.path` import での検索パスのリスト (list[str]) 以下で初期化される
164
    - 実行スクリプトのあるパス
165
    - 環境変数 **PYTHONPATH** のパス
166
    - Python インストール先
167
  - 関数 `exit([obj])` Python を終了する
168
    - 引数無し : 終了ステータス 0 で終了
169
    - 引数が数値 : 指定値を終了ステータスとして終了
170
    - 引数が数値以外 : 引数を文字列化して stderr へ出力し、終了ステータス 1 で終了
171
    - **SystemExit 例外を送出するので、捕捉可能** (終了の中断等も可能)
172
  - `sys.strout` `sys.stderr` `sys.stdin` はファイルオブジェクトであり、`read()` `write()` が使用可能 (ただし以下の通り片方のみ使用できる)
173
    - `stdout` `stderr` は出力専用
174
    - `stdin` は入力専用
175
  - `sys.breakpointhook()`
176
    - 組み込み関数 `breakpoint()` が呼び出す呼び出し可能オブジェクトを指定 (デフォルトは `pdb.set_trace()`)
177
    - 環境変数 **PYTHONBREAKPOINT** への設定でも等価
178
  - `sys.version_info` Python のバージョン情報
179
    - major, minor, micro, releaselevel, serial の 5要素タプル
180
    - 各名前の属性アクセスも可能
181
- argparse
182
  - `ArgumentParser` 引数設定すると、コマンドヘルプの生成、実引数のパースとプログラム中での引数利用が可能となる
183
  - `add_argument()` 引数設定を加える
184
  - `parse_args()` 実引数をパースして argparse.Namespace オブジェクトの属性へ引数を割り当て、そのオブジェクトを返す
185
    - 返されたオブジェクトは、引数名の属性の値が対応する引数の値となっている
186
- pathlib
187
  - クラス継承
188
    ```mermaid
189
    classDiagram
190
    
191
    PurePath <|-- PurePosixPath
192
    PurePath <|-- PureWindowsPath
193
    PurePath <|-- Path
194
    PurePosixPath <|-- PosixPath
195
    Path <|-- PosixPath
196
    Path <|-- WindowsPath
197
    PureWindowsPath <|-- WindowsPath
198
    ```
199
  - `PurePath` 純粋パス
200
    - インスタンス変数
201
      - `parts` パスの各要素の **タプル**
202
      - `drive` `root` `anchor`
203
      - `parents` Path インスタンスのシーケンス
204
      - `parent` Path インスタンス
205
      - `name` `suffix` `suffixes` `stem`
206
    - インスタンスメソッド
207
      - `is_absolute()`
208
      - `is_relative_to(*other)`
209
      - `match(pattern)` glob 形式 pattern に自身がマッチするか
210
      - `with_name(name)` `with_stem(stem)` `with_suffix(suffix)` name, stem, suffix 部を置換した Path を返す
211
  - `Path` 具象パス
212
    - クラスメソッド
213
      - `cwd()` `home()`
214
    - インスタンスメソッド
215
      - `stat()`
216
      - `glob(pattern)` 自ディレクトリ内の pattern (glob) にマッチするファイル・ディレクトリをパスオブジェクトとして返す**ジェネレーター**を返す
217
      - `iterdir()` 自ディレクトリ内の全ファイル・ディレクトリをパスオブジェクトとして返す**ジェネレーター**を返す
218
      - `exists()` `is_dir()` `is_file()` チェック
219
      - `chmod()` `rename()` ファイル変更操作
220
      - `touch()` `mkdir()`
221
      - `unlink()`(ファイル削除) `rmdir()`(空ディレクトリ削除)
222
      - `open()`
223
      - `read_text()` `write_text()` 開いて、読み/書き、閉じる
224
    - 基本的に Path での複数情報取得はジェネレーターみたい
225
- tempfile
226
  - 一時ファイル/ディレクトリ作成
227
  - コンテキストマネージャーとして使用可能
228
    - as での取得は一時ファイルは **ファイルオブジェクト** 、一時ディレクトリは **ディレクトリパス文字列**
229
    - with を抜ける際にファイル/ディレクトリ削除も行われる
230
      - NamedTemporaryFile は delete=False で残すことも可能
231
      - ディレクトリはその下のファイルも全部削除
232
  - `TemporaryFile` ファイル名無しファイルをディスク上に作成
233
  - `NamedTemporaryFile` ファイル名ありファイルをディスク上に作成
234
    - ファイルシステムが認識できるのでプロセス外から参照可能
235
  - `SpooledTemporaryFile` ファイル名無しファイルを一定容量までメモリ上に作成し、容量を超えるとディスクへ書き出す
236
  - `TemporaryDirectory` 一時ディレクトリを名前ありで作成
237
- shutil
238
  - `copyfile(src, dst)` dst はファイルパス (ディレクトリパスは不可)
239
  - `copy(src, dst)` `copy2(src, dst)` dst はファイルパスまたはディレクトリパス
240
    - dst がディレクトリパスなら、その下に src のベースファイル名でコピーされる
241
    - copy はパーミッションをコピーする
242
    - copy2 はメタデータもコピーする
243
  - `copymode(src, dst)` `copystat(src, dst)`
244
- csv
245
  - `reader(file)` csv の各行を1リストとして扱う reader オブジェクトを取得
246
    - reader オブジェクトは for 文で読み込むことで、ループ1回につきファイル内の1行分を1リストとして取得できる
247
  - `writer(file)` csv としてデータを書き込むことができる writer オブジェクトを取得
248
    - writer オブジェクトは `writerow(row)` で 1 行を書き込み、 `writerows(rows)` で複数行の書き込みを csv ファイルへ行う
249
      - `row` イテラブル
250
      - `rows` イテラブルのイテラブル (イテラブルでも動作するかも? (1行だけ書き込みたいとか))
251
  - `DictReader(file, fieldnames, ..)` を使用すると、読み込んだ csv データを辞書インターフェースで参照できる
252
  - `DictWriter(file, fieldnames, ..)` を使用すると、辞書データを任意の順序 (fieldnames で指定) でファイルへ書き出せる
253
- json
254
  - JSON 文字列
255
    - `dumps(obj)` obj を json 文字列として返す
256
    - `loads(s)` 文字列 s を Python オブジェクトとして返す
257
  - JSON ファイル
258
    - `dump(obj, file)` obj を json 文字列にして file へ書き出す
259
    - `load(file)` file に記載の json 文字列を Python オブジェクトとして返す
260
- urllib.parse
261
  - `urlparse(s)` 文字列 s を URL としてパースした結果を返す (ParseResult)
262
  - `ParseResult`
263
    - パース結果は属性名またはインデックスで参照
264
      - 辞書キーを属性名で指定も OK
265
    - `scheme` `0`
266
    - `netloc` `1`
267
    - `path` `2`
268
    - `params` `3`
269
    - `query` `4`
270
    - `flagment` `5`
271
    - `username`
272
    - `password`
273
    - `port`
274
    - `hostname`
275
  - クエリのパース
276
    - クエリが `key1=aaa` `key2=bbb` `key3=ccc` の場合
277
    - `parse_qs()` は辞書を返し、同一キーは値リストにまとめる
278
      - `{'key1': ['aaa'], 'key2': ['bbb', 'ccc']}`
279
    - `parse_qsl()` はタプルのリストを返し、同一キーも分ける
280
      - `[('key1', 'aaa'), ('key2', 'bbb'), ('key3', 'ccc')]`
281
  - クエリの組み立て
282
    - `urlencode(query)` マッピングか2要素タプルのリストを受け取り、組み立ててエンコードしたクエリ文字列を返す
283
  - `quote()` `quote_plus()` URL として使用できる文字列へエンコード
284
    - 特殊文字や複数バイト文字に対してパーセントエンコードを行う
285
    - スペースの変換 : quote() は `%20` へ、quote_plus() は `+` へ
286
  - `urljoin(base, url)` base 部分へ url 部分を結合する
287
    - 共通部分を表す base に対して url で分岐させる
288
    - url は相対パスでもよいので `..` で base の一部も上書きできる
289
- urllib.request
290
  - `urlopen(url, data)` url へアクセスしてレスポンスオブジェクトを返す
291
    - HTTP, HTTPS ならレスポンスは `http.client.HTTPResponse`
292
    - その他なら `urllib.respnse.addinforul`
293
      - 属性 `url` `headers` `status`
294
    - HTTP の場合、 url に文字列を指定してのリクエストは以下に限定
295
      - data 指定なしの GET
296
      - data を指定しての POST
297
    - その他の HTTP メソッドは、`Request` オブジェクトを url に指定する
298
  - `Request(url, data, method)`
299
- doctest
300
  - コード内での実行は `testmod()` `testfile()`
301
    - testfile では引数に外部のテキストファイルを指定可能
302
  - unittest でのテストに組み込む
303
    - `load_tests()` は unittest が探して呼び出す仕組み
304
    - `DocTestSuite()` は doctest の内容を unittest 向けに変換
305
    - `addTests()` で unittest のテストとして追加
306
    ```python
307
    import unittest
308
    import doctest
309
    import my_module_with_doctests  # 自分で書いたモジュール
310
    
311
    
312
    def load_tests(loader, tests, ignore):
313
        tests.addTests(doctest.DocTestSuite(my_module_with_doctests))
314
        return tests
315
    ```
316
- unittest
317
  - コード内での実行は `main()`
318
  - コマンドライン実行では、対象のオブジェクトパスを指定
319
    - `python -m unittest module1.testcase1.testmethod1`
320
    - 対象はモジュールでもクラスでもメソッドでも、複数でも OK
321
- logging
322
  - 汎用的な使用法としてはロガーを `getLogger()` で取得してから、メソッド `error()` `info()` 等でログ出力する
323
  - モジュールの関数を使用することで、ルートロガーでログ出力できる
324
    - `critical()` `error()` `warning()` `info()` `debug()`
325
    - 引数はメッセージ文字列で、`%s` 等を含めた場合は後続の引数の値を展開できる
326
  - `basicConfig()` ロギングの設定変更で、以下の引数あり
327
    - `filename` `filemode`
328
    - `format` ログフォーマット
329
    - `datefmt` 日時フォーマット
330
    - `style` format で使用するスタイル `%`(デフォルト) `{` `$`
331
    - `level` ログレベル閾値
332
    - `stream`
333
    - `handlers`
334
    - `force`
335
    - `encoding`
336
    - `errors`
337
    - 出力先設定は同時に指定不可 (filename, stream, handlers)
338
- secrets
339
  - `choise(seq)` seq からランダムに選択して返す
340
  - トークン
341
    - `token_bytes([nbytes=None])` バイト列生成
342
    - `token_hex([nbytes=None])` 16進数文字列生成 (1byte = 16進数2文字)
343
    - `token_urlsafe([nbytes=None])` URL向け(Base64エンコード)文字列生成 (1byte = 平均1.3文字)
344
    - `compare_digest(a, b)` タイミング攻撃耐性のある比較