収録問題 60問 / 10問ランダム出題
ランダムに出題・即時フィードバック・間違えた問題の復習機能付き
変更可能な要素を順序付きで保持し、追加・削除したい。適切な型は?
答え: list
listは順序を保持する変更可能なコレクションです。
ユーザーIDから名前を高速に引きたい。適切なデータ構造は?
答え: dict
dictはkeyとvalueの対応を保持し、keyによる検索に適します。
重複を除いたタグ集合を扱いたい。適切な型は?
答え: set
setは重複しない要素の集合を表します。
辞書にkeyがない場合、例外を出さず既定値を得たい。適切なのは?
答え: mapping.get(key, default)
dict.getはkeyがなければ指定した既定値を返します。
大量の値を一度に保持せず順次処理したい。適切な方法は?
答え: yieldを使うgenerator
generatorは必要なときに値を生成するためメモリ使用量を抑えられます。
関数の既定引数に空listを直接指定すると起き得る問題は?
答え: 呼び出し間で同じlistが再利用される
既定引数は関数定義時に評価されます。Noneを使い関数内で生成するのが一般的です。
関数が受け取った可変長の位置引数をまとめる記法は?
答え: *args
*argsは追加の位置引数をtupleとして受け取ります。
resourceを処理後に例外の有無にかかわらず解放したい。適切な構文は?
答え: with文でcontext managerを使う
withはcontext managerの終了処理を確実に呼び出します。
想定した例外だけを処理し、他の障害は隠したくない。適切なのは?
答え: except ValueErrorのように具体的な例外を捕捉する
具体的な例外だけを捕捉すると予期しない障害を上位へ伝えられます。
例外へ業務上の文脈を追加しつつ元の原因も保持したい。適切なのは?
答え: raise NewError(...) from exc
raise ... from ...は例外chainを明示し、原因追跡を容易にします。
文字列へ変数を読みやすく埋め込みたい。適切なのは?
答え: f-string
f-stringは式を明示的かつ読みやすく埋め込めます。
異なる型の値を文字列と直接+で連結するとどうなる?
答え: 多くの場合TypeErrorになる
明示的にstrへ変換するかf-stringを使います。
2つの変数が同じ値かを比較したい。通常使う演算子は?
答え: ==
==は値の等価性を比較します。isは同一objectかを調べます。
Noneかどうかを判定する推奨記法は?
答え: value is None
Noneはsingletonなのでidentity比較のisを使います。
sequenceをindexと値の組でloopしたい。適切なのは?
答え: enumerate(sequence)
enumerateはindexと要素を同時に返します。
JSON文字列をPython objectへ変換したい。適切なのは?
答え: json.loads(text)
json.loadsはJSON文字列をdictやlist等へdecodeします。
Python objectをJSON文字列へ変換したい。適切なのは?
答え: json.dumps(value)
json.dumpsは対応objectをJSON文字列へencodeします。
UTF-8 text fileを確実に読みたい。適切なopenは?
答え: open(path, encoding="utf-8")
encodingを明示するとOS既定値の差による文字化けを防げます。
OSに依存しにくいpath操作をしたい。適切なのは?
答え: pathlib.Path
pathlibはpathの結合・確認・読み書きをobject指向で扱えます。
外部commandを引数付きで安全に実行したい。適切な基本方針は?
答え: subprocess.runへ引数listを渡しshell=Falseを保つ
引数listとshell=Falseはshell injectionの危険を下げます。
projectごとに依存packageを分離したい。基本的な方法は?
答え: venv等でvirtual environmentを作る
virtual environmentはprojectごとにinterpreter環境とpackageを分離します。
applicationの依存versionを再現可能にしたい。適切なのは?
答え: lockされた依存情報をversion管理しCIで同じものをinstallする
依存を固定すると環境ごとの予期しないversion差を減らせます。
moduleを直接実行した場合だけCLI処理を動かしたい。使うguardは?
答え: if __name__ == "__main__":
直接実行時は__name__が__main__になり、import時の副作用を避けられます。
設定値をsource codeへ直書きせず環境から受け取りたい。基本的な方法は?
答え: os.environまたは設定libraryで環境変数を読む
環境変数は設定をcodeから分離できますが、secret storeや検証も組み合わせます。
application logをprintだけでなくlevel・時刻・出力先付きで管理したい。使う標準moduleは?
答え: logging
loggingはlevel、formatter、handlerを設定して運用可能なlogを出せます。
大量recordを処理中、1件の失敗で全体を即終了させるべきでない。適切な設計は?
答え: 失敗単位を捕捉して記録し、方針に従い継続・retry・隔離する
失敗境界と再処理方針を明確にすると部分障害へ対応できます。
HTTP API呼び出しでnetwork障害へ備える基本方針は?
答え: timeoutを設定し、再試行可能な失敗だけbackoff付きでretryする
timeoutと限定retryにより停止と過負荷を防ぎます。
関数の入力・戻り値の意図を明示しstatic checkerで確認したい。使うものは?
答え: type hints
type hintsは実行時強制ではありませんが、IDEやtype checkerで不整合を検出できます。
単純なdata containerに自動生成されたinitやreprが欲しい。適切なのは?
答え: @dataclass
dataclassはfield定義からinit、repr、比較等を生成できます。
DB queryへユーザー入力を渡す安全な方法は?
答え: DB driverのparameterized queryを使う
parameter bindingは値をSQL構文から分離しSQL injectionを防ぎます。
小さな関数の期待結果を自動検証したい。適切なのは?
答え: unit testで入力と期待値をassertする
unit testは小さい単位の振る舞いを高速・反復可能に確認します。
外部APIを呼ぶ関数のunit testを安定させたい。適切なのは?
答え: dependencyを注入しmock/fakeで境界を置き換える
外部境界を置換すると速度と決定性を保ち、integration testと役割分担できます。
temporary fileを使うtestで後始末漏れを防ぎたい。適切なのは?
答え: temporary directory fixture/context managerを使う
temporary resourceのlifecycleをtest frameworkやcontext managerへ任せます。
値の検証をassertだけで本番処理に実装する問題は?
答え: 最適化optionでassertが無効化され得る
assertは開発時の不変条件確認向けです。入力errorには明示的な例外を使います。
信頼できないdataを読み込む際pickleを避ける理由は?
答え: deserialization時に任意code実行につながり得る
pickleは信頼済みPython object向けで、外部入力には安全なformatとschema検証を使います。
未検証の文字列をevalへ渡す問題は?
答え: 任意のPython codeを実行され得る
evalは式をcodeとして実行するため、parserや明示的な変換を使います。
CPU負荷の高い純Python処理を複数coreで並列化したい。一般的な選択は?
答え: multiprocessingまたはprocess pool
processは別interpreterでCPU-bound処理を複数coreへ分散できます。
多数のI/O待ちtaskを効率よく扱う選択肢は?
答え: asyncioと非同期対応library
asyncioはI/O待ち中に他taskを進められますが、blocking処理を避ける必要があります。
production障害解析に役立つlogへ含める情報は?
答え: 時刻、level、request/job ID、主要contextを秘密なしで記録する
correlation IDとcontextは追跡性を高め、秘密や個人情報はmask・最小化します。
library関数が失敗時にprocess全体をsys.exitする問題は?
答え: callerがerror処理やcleanupを選べなくなる
libraryは意味のある例外をraiseし、終了判断はCLI等の境界へ任せる方が再利用しやすくなります。
ユーザー一覧を年齢の昇順、同年齢では名前の昇順に並べ替えたい。適切な方法は?
答え: sorted(users, key=lambda u: (u.age, u.name))
keyが返すtupleは左から順に比較されるため、複数項目の並べ替え条件を明確に表現できます。sortedは元のlistを変更しません。
入れ子のdictをcopy.copy()で複製後、内側のlistを変更すると元データにも反映された。理由と対策は?
答え: shallow copyは内側のobjectを共有するため、独立複製が必要ならcopy.deepcopy等を検討する
shallow copyは外側のcontainerだけを新しくし、入れ子要素への参照は共有します。deepcopyのコストや共有すべきobjectも考慮して使い分けます。
dataclassで各instanceが独立した空listを持つfieldを定義したい。適切なのは?
答え: field(default_factory=list)
default_factoryはinstance生成ごとにlistを新しく作ります。変更可能な既定値の共有を避けるために使います。
通貨の合計を扱う処理で、0.1 + 0.2のような2進浮動小数点誤差を避けたい。適切な選択は?
答え: 文字列からdecimal.Decimalを生成し、必要な丸め規則を明示する
Decimalは10進の桁と丸めを制御できます。floatから直接生成すると既存の2進誤差を取り込むため、通常は文字列や整数の最小通貨単位から生成します。
複数timezoneの利用者へ日時を提供するAPIで、保存・比較の基準を安全に扱う方針は?
答え: timezone-awareなUTC日時で保存・比較し、表示時に利用者のtimezoneへ変換する
aware datetimeでUTCを基準にすると時点を一意に扱えます。入出力のtimezoneとISO 8601形式を明示し、表示境界で変換します。
標準csv moduleでUTF-8のCSVをWindowsを含む環境で読み書きし、空行の混入を避けたい。fileの開き方は?
答え: open(path, mode, encoding='utf-8', newline='')
csv moduleへ改行処理を任せるためnewline=''を指定し、文字コードも明示します。外部仕様にBOMが必要ならutf-8-sig等を要件に応じて選びます。
設定fileを更新中にprocessが停止しても、途中まで書かれたfileを読ませたくない。基本的な更新方法は?
答え: 同じfilesystemの一時fileへ完全に書いてflush等を行い、os.replaceで置き換える
一時fileを完成させてから同一filesystem内で置換すると、読者には旧版か新版のどちらかを見せやすくなります。耐障害要件に応じてfsyncやbackupも検討します。
CLIで必須option、型変換、help message、終了codeを一貫して扱いたい。標準libraryの選択は?
答え: argparse
argparseはoption定義から解析、型変換、usage/help、入力error時の終了をまとめて扱えます。CLI境界から業務logicを分離するとtestもしやすくなります。
現代的なPython projectでbuild systemやproject metadata、基本依存関係を標準形式で管理する中心fileは?
答え: pyproject.toml
pyproject.tomlはbuild backend、project metadata、依存関係やtool設定の標準的な格納先です。lock fileの扱いは利用するpackage managerに従います。
password reset用の推測困難なtokenを生成したい。標準libraryで適切なのは?
答え: secrets.token_urlsafe()
secrets moduleは認証tokenなどsecurity用途の暗号学的に強い乱数を生成します。tokenには十分なentropy、有効期限、1回限りの利用も設計します。
applicationでpasswordを保存するときの基本方針として適切なのは?
答え: Argon2等のpassword専用のsalt付き低速hashを信頼できるlibraryで使う
password保存には攻撃者の総当たりを遅くする専用KDFとuserごとのsaltを使います。parameter更新や既存hashのrehash方針も持ちます。
複数のDB更新をすべて成功した場合だけ確定し、途中で例外が出たら元へ戻したい。適切な設計は?
答え: driverやORMのtransaction contextを使い、成功時commit・例外時rollbackする
transaction境界を明示し、context manager等でcommit・rollback・connection返却を確実にします。外部API呼出しを同一transactionへ含める場合は長時間lockにも注意します。
page token方式のHTTP APIから全recordを取得する処理で必要な実装は?
答え: 各responseのnext tokenを使って終了条件まで反復し、rate limitや重複も考慮する
pagination contractに従ってnext tokenがなくなるまで取得します。timeout、error、rate limit、再試行時の重複排除やcheckpointも要件に応じて設計します。
数GBのHTTP responseをfileへ保存するとき、memory使用量を抑える方針は?
答え: responseをstreaming modeで受け取り、一定sizeのchunkごとにfileへ書く
streamingとchunk書込みでmemory使用量を一定範囲に保てます。timeout、status、最大size、一時file、checksum、失敗時cleanupも組み合わせます。
高コスト関数へfunctools.lru_cacheを使う際、適した前提は?
答え: 同じhashable引数なら同じ結果を返し、古い結果を許容でき、maxsizeを検討している
lru_cacheは引数をkeyに結果を再利用します。純粋性、hash可能性、dataの鮮度、memory上限、必要ならcache_clearの契機を設計します。
同じ関数を多くの入力値と期待値でtestし、重複したtest codeを減らしたい。pytestで適切なのは?
答え: @pytest.mark.parametrizeでcaseを列挙する
parametrizeは1つのtest logicへ複数caseを供給し、各caseを個別に報告します。境界値や異常系を表形式で追加しやすくなります。
test用DB connectionをfixtureで作成し、test失敗時にも必ずrollback・closeしたい。pytest fixtureの設計は?
答え: fixtureでresourceを作りyieldし、yield後をtry/finally相当のcleanupにする
yield fixtureは前半でsetup、後半でteardownを表現し、testの成功・失敗にかかわらずcleanupを実行できます。fixture scopeとtest分離も合わせて設計します。
外部service clientを差し替え可能にし、特定classの継承を要求せず必要なmethodだけを型検査したい。適切なのは?
答え: typing.Protocolで必要なinterfaceを定義する
Protocolは必要な属性・methodを持つ型を構造的に受け入れます。実装を疎結合にし、fakeやadapterもstatic checkerで確認できます。
複数threadが共有dictのread-modify-writeを行い、更新が失われる。基本的な対策は?
答え: 共有状態を減らし、必要なcritical sectionはthreading.Lock等で保護する
read-modify-writeは複数操作からなり競合し得ます。lock、queue、thread-local、immutable data等から要件に合う方法を選び、lock範囲とdeadlockにも注意します。
container上のPython workerがSIGTERMを受けたとき、処理中jobを安全に終えて終了したい。設計として適切なのは?
答え: signal handlerでは停止flagを設定し、新規受付を止め、main loopでcleanupして期限内に終了する
signal handlerは小さく保ち、通常の制御flowへ停止要求を伝えます。queue受付停止、進行中処理、checkpoint、connection close、platformの猶予時間を設計します。