プロジェクト

全般

プロフィール

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

Tatsuya ISHIGAKI, 2025/08/22 10:08

1 1 Tatsuya ISHIGAKI
# 模擬試験メモ
2
## 実施模試
3
- [ExamApp](https://python-basic.com/) 実践/初級
4
  - 時間制限なし
5
  - 40問
6
7
## メモ
8
- pip
9
  - バージョン指定インストール `pip install package==2.0.1`
10
    - バージョンの範囲指定インストール
11
      - `pip install "package<3.0"`
12
      - `pip install "package>=2.0,<3.0"`
13
  - 別バージョンインストール `pip --upgrade install package==1.0.0`
14
    - 短いオプション `pip -U install package==1.0.0`
15
    - 指定バージョンは新旧どちらでもOK (ダウングレードもできる)
16
    - **??** `pip --upgrade install` `pip install --upgrade` 両方の記載があるが、どちらでも良いのか
17
  - アンインストール `pip uninstall package`
18
    - 指定パッケージのみ削除、依存パッケージはアンインストールされない
19
- flake8
20
  - flake8 はコーディングの静的チェックを、以下の3ツールを使用して行う
21
    - `pycodestyle` PEP8 への準拠チェック
22
    - `Pyflakes` 文法のチェック
23
    - `McCabe` コードの複雑度をチェック
24
  - エラーコード1文字目は使用ツールで変わる
25
    - `E` `W` pycodestyle
26
    - `F` Pyflakes
27
    - `C` McCabe
28
- 例外処理 try-except
29
  - `try` の後には `except` または `finally` が必須
30
  - `else` を入れる場合は全 `except` の後に記載
31
  - `finally` は必ず最後
32
  - 処理フロー
33
    - `try` で例外発生
34
      - 最初に適合した `except` 節の処理が実行され、存在すれば `finally` 節が実行される
35
      - 適合する `except` 節が無ければ、存在する場合は `finally` 節が実行され、例外は再送出される
36
- 引数
37
  - 位置引数としての呼び出しでは、仮引数の順に適用
38
  - 実引数にイテラブルを渡すと、位置引数に展開される
39
  - 実引数に `**` を前置した辞書を渡すと、キーワード引数として展開される
40
  - (`**` を前置した仮引数である) 可変数キーワード引数は、辞書として使用する
41
- イテラブル関連の変換
42
  - `items()` (辞書のメソッド) は、キーとバリューをタプルでまとめたイテレーターを返す
43
  - `enumerate()` 関数は、引数イテラブルに対してインデックスと値をタプルでまとめたイテレーターを返す
44
  - `zip()` 関数は、複数のイテラブルを引数にとり、それらの同一インデックスをタプルにまとめたイテレータを返す
45
    - 引数のうち最短のイテラブルに合わせたタプル数となる
46
  - `split()` (strのメソッド) は、指定文字で分割した文字列リストを返す
47
- 内包表記
48
  - フィルタを使う場合は `(変数を使って取得値を決める)式 for 変数 in イテラブル if 条件式`
49
    - 例(リスト): `[i * 2 for i in range(10) if i % 2 == 0]`
50
      - → `[0, 4, 8, 12, 16]`
51
  - 各種内包表記
52
    - リスト `[~]`
53
    - 集合 `{~}` (リストと同様で、括弧のみ異なる)
54
    - 辞書 `{key: value for ~}` (集合と同様で、先頭にコロンを使用してキーと値を記述)
55
    - ジェネレーター式 `(~)` (リストと同様で、括弧のみ異なる)
56
      - ジェネレーターなので、値取得の度に値が生成される
57
    - タプルの内包表記は存在しない
58
- 三項演算子
59
  - Python の三項演算子 `(条件成立時の値) if (条件) else (条件不成立時の値)`
60
  - 例: `"even" if a % 2 == 0 else "odd"`
61
- 辞書
62
  - `{}` は空の辞書 (集合ではない)
63
    ```python
64
    >>> a = {}
65
    >>> type(a)
66
    <class 'dict'>
67
    >>> b = set()
68
    >>> type(b)
69
    <class 'set'>
70
    ```
71
- @property
72
  - インスタンスメソッド (引数 self のみ) に `@property` デコレーターを付けると、`()` 無しで、メソッド呼び出し結果を取得できる
73
  - `@<プロパティ名>.setter` デコレーターによって、値設定も可能
74
    - プロパティ名 (`@property` を付けたメソッド名) 
75
    - このメソッドの第2引数で値受け取る `(self, <value>)`
76
- @classmethod
77
  - インスタンス化せずに呼び出せるメソッド
78
  - 第一引数 (仮引数) としてクラスオブジェクト (インスタンスではない) が暗黙的に渡される
79
- @staticmethod
80
  - インスタンス化せずに呼び出せるメソッド
81
  - 暗黙的に渡される引数は無い
82
- @dataclass
83
  - クラスデコレーターとして使用する
84
  - クラスのフィールドへの型ヒントが必須となる
85
    - 厳密には、型ヒントがついたフィールドのみ自動生成されるメソッド (コンストラクタ含む) に反映される
86
    - 型ヒント無しのフィールドも、通常のフィールドとして使用はできる
87
  - `__init__()`, `__repr__()`, `__eq__()` 等が自動で生成される
88
  - 生成されるメソッド (コンストラクタ含む) は、定義時の記述順に従う
89
    - コンストラクタの仮引数が、フィールド記述順になるということ
90
    - フィールドにデフォルト値を指定する場合、コンストラクタの仮引数にもデフォルト値が定義される
91
      - 引数の順番となる為、デフォルト値のあるフィールドは、無いフィールドより後ろに定義する
92
    - コンストラクタへの実引数は、デフォルト値無しのフィールド数が最低限必要となる
93
  - フィールドの型ヒントは、Python の動的型付けの性質上、実行時に型ヒント以外の値が渡されてもエラーにはならない
94
- 型ヒント
95
  - すべての型ヒントは、動作時の制限にはならない (エラー発生しない)
96
    - mypy などでコードレベルでの静的型チェックでの検査、可読性向上の為の記述となる
97
  - typing モジュールでの型ヒント
98
    - `Union[型1, 型2]` 型1 または 型2
99
    - `Optional[型1]` 型1 または None
100
    - `Any` 任意の型
101
    - `Literal[値1, 値2, 値3]` いづれかの「値」
102
  - typing モジュールその他
103
    - `TypeVar` 型変数の型
104
    - `TypedDict` TypedDict を継承してクラス定義すると、フィールド名文字列をキー、値をその型ヒントの型、とする辞書型 (クラス) を定義したことになる
105
      - TypeDict を継承したクラス定義では、型タイプ無しのフィールド定義があると失敗するみたい
106
      - また、フィールドにデフォルト値を付ける意味は無い様子 (勝手にキーバリューペアが増える、ということは無い)
107
      - (他と同様に、あくまでも型ヒントなので動作時の型不一致でもエラーは発生しない)
108
- 正規表現 (`re` モジュール)
109
  - 関数 `search(pat, str)`
110
    - パターン pat にマッチする str 中の最初の部分を Match で返す
111
    - マッチしない場合は None を返す
112
  - 関数 `match(pat, str)`
113
    - str の先頭に pat がマッチすれば Match を返す
114
    - マッチしない場合は None を返す
115
- unicodedata.normalize()
116
  - 関数 `normalize(form, unistr)`
117
    - form には `NFC` `NFKC` `NFD` `NFKD` いずれかを指定 (多くは NFKC でよいはず)
118
- 文字列メソッドでの変換
119
  - (以下は、全角文字の英字に対しても変換成功する)
120
  - `swapcase()` 大文字と小文字を入れ替える
121
  - `title()` 単語単位で先頭が大文字、他を小文字にする
122
  - `capitalze()` 文字列の先頭だけ大文字、他を小文字にする
123
    ```python
124
    >>> "NaMe".swapcase()
125
    'nAmE'
126
    >>> "nAmE".swapcase()
127
    'NaMe'
128
    >>> "my nAmE IS".title()
129
    'My\u3000Name Is'
130
    >>> "my nAmE IS".title()
131
    'My Name Is'
132
    >>> "my nAmE IS".capitalize()
133
    'My name is'
134
    ```
135
- datetime モジュールの datetime クラス
136
  - `now()` は datetime クラスのクラスメソッド
137
- time モジュール
138
  - モジュールで使用される `struct_time` オブジェクト
139
  - 関数 `sleep(secs)` : secs 秒の間、**現在のスレッドの** 実行を中断する
140
    - async 構文中では期待通りに動かない可能性あり、代わりに `asyncio.sleep()` を使用する
141
- イテラブル関連関数
142
  - 関数 `sorted()`: イテラブルを昇順ソートした新しいリストを返す
143
    - 引数 `reverse=True` で降順ソート
144
  - 関数 `reversed()`: イテラブルを **逆順** (降順ではない) にした **イテレーター** (リストではない) を返す
145
  - メソッド `list.sort()`: リスト要素をソートする (戻り値は None)
146
  - メソッド `list.reverse()`: リスト要素を逆順にする (戻り値は None)
147
  - **operator** モジュール
148
    - 以下はソートの key 引数に使用する 2 関数
149
    - 関数 `itemgetter()`: インデックス、キーによるソート要素、ソート順の指定
150
    - 関数 `attrgetter()`: (クラスの) 属性によるソート要素、jソート順の指定
151
- enum
152
  - `enum.Enum` クラスを継承して定義
153
  - フィールドにを列挙値として定義する
154
  - `enum.auto()` で、フィールド値を自動で振ることが可能 (1から順に)
155
  - Class1 なら定数取得は `Class1.FIRST` `Class1['FIRST']` `Class1(1)` (最後のは値から取得)
156
    - 取得した定数は `name` `value` 属性を持つ
157
- itertools
158
  - `chain()` イテラブルを連結したイテレーターを返す
159
  - `groupby()` イテラブルを key 引数で判定し、連続する値をグループ化したイテレーターを返す
160
    - `list(groupby("aaabba"))`
161
      - → `[('a',【'a' 3回のイテレータ】),('b',【'b' 2回のイテレータ】),('a',【'a' 1回のイテレータ】)]`
162
  - `islice(iter, stop)` `islice(iter, start, stop[, step])`
163
    - 通常のスライスと同様の結果を得られる
164
    - `islice()` ではジェネレーターなどの大きさ不明の対象を扱うことができる
165
    - 大きさ不明を扱えるため、start, stop は 0 以上、step は 1 以上でないとエラーとなるようになっている
166
  - `zip_longest(*iter, fillvalue=None)`
167
    - 組み込みの `zip()` と同様だが、最も長いイテラブルに合わせたイテレーターが返される
168
    - 短いイテラブルの足りない要素の値を埋めるのに、fillvalue の値が使用される
169
  - `product(*iter, repeat=1)`
170
    - デカルト積
171
    - repeat は、イテラブル全体が N 回指定されたのと同じ
172
      - `product(iter1, iter2, repeat=2)` は以下と等価 (各イテレータは毎回同じ列を返すとする)
173
      - `product(iter1, iter2, iter1, iter2)`
174
      ```python
175
      >>> pr1 = itertools.product("AB", "12")
176
      >>> for v1, v2 in pr1:
177
      ...     print(v1+v2)
178
      ...
179
      A1
180
      A2
181
      B1
182
      B2
183
      >>> pr2 = itertools.product("AB", "12", repeat=2)
184
      >>> for v1, v2, v3, v4 in pr2:
185
      ...     print(v1+v2+v3+v4)
186
      ...
187
      A1A1
188
      A1A2
189
      A1B1
190
      A1B2
191
      A2A1
192
      A2A2
193
      A2B1
194
      A2B2
195
      B1A1
196
      B1A2
197
      B1B1
198
      B1B2
199
      B2A1
200
      B2A2
201
      B2B1
202
      B2B2
203
      >>> pr3 = itertools.product("AB", repeat=2)
204
      >>> for v1, v2 in pr3:
205
      ...     print(v1+v2)
206
      ...
207
      AA
208
      AB
209
      BA
210
      BB
211
      ```
212
  - `permutations(iter, r=None)`
213
    - 長さ r の順列タプルのイテレーターを返す
214
    - r 未指定なら、iter の長さとみなす
215
  - `combinations(iter, r)`
216
    - 長さ r の組合せタプルのイテレーターを返す
217
    - ※インデックスが異なれば別要素とするので、イテラブルに重複あれば、単一の組合せタプルに同一値が入ることはある
218
  - `combinations_with_replacement(iter, r)`
219
    - 長さ r の組合せタプルのイテレーターを返す
220
    - 同一要素 (同一インデックスの要素) を複数回使用する組合せを含む
221
- copy
222
  - `copy()` 浅いコピー
223
    - リストなどの第1階層のみの値がコピーされ、参照が含まれる場合は参照のまま (コピー元の参照をそのまま) コピーする
224
  - `deepcopy()` 深いコピー
225
    - 再帰的にオブジェクトをコピーする
226
- os
227
  - `remove()` ファイル削除 (ディレクトリ指定はエラー)
228
  - `rmdir()` 空のディレクトリを削除 (空でなければエラー)
229
  - `removedirs()` ディレクトリを再帰削除
230
- sys
231
  - `exit([arg])` 終了ステータス arg (デフォルト 0) で Python 実行を終了
232
    - ※ try-except 内で実行した場合、finally があれば実行されたあとに終了する