収録問題 80問 / 10問ランダム出題
ランダムに出題・即時フィードバック・間違えた問題の復習機能付き
変更可能な要素を順序付きで保持し、追加・削除したい。適切な型はどれですか?
答え: list
listは順序を保持する変更可能なコレクションです。
ユーザーIDから名前を高速に引きたい。適切なデータ構造はどれですか?
答え: dict
dictはキーと値の対応を保持し、キーによる検索に適します。
重複を除いたタグ集合を扱いたい。適切な型はどれですか?
答え: set
setは重複しない要素の集合を表します。
辞書にキーがない場合、例外を出さず既定値を得たい。適切なのはどれですか?
答え: mapping.get(key, default)
dict.getはキーがなければ指定した既定値を返します。
大量の値を一度に保持せず順次処理したい。適切な方法はどれですか?
答え: yieldを使うgenerator
generatorは必要なときに値を生成するためメモリ使用量を抑えられます。
関数の既定引数に空listを直接指定すると起き得る問題はどれですか?
答え: 呼び出し間で同じlistが再利用される
既定引数は関数定義時に評価されます。Noneを使い関数内で生成するのが一般的です。
関数が受け取った可変長の位置引数をまとめる記法はどれですか?
答え: *args
*argsは追加の位置引数をtupleとして受け取ります。
リソースを処理後に例外の有無にかかわらず解放したい。適切な構文はどれですか?
答え: with文でコンテキストマネージャーを使う
withはコンテキストマネージャーの終了処理を確実に呼び出します。
想定した例外だけを処理し、他の障害は隠したくない。適切なのはどれですか?
答え: except ValueErrorのように具体的な例外を捕捉する
具体的な例外だけを捕捉すると予期しない障害を上位へ伝えられます。
例外へ業務上の文脈を追加しつつ元の原因も保持したい。適切なのはどれですか?
答え: raise NewError(...) from exc
raise ... from ...は例外の連鎖を明示し、原因追跡を容易にします。
文字列へ変数を読みやすく埋め込みたい。適切なのはどれですか?
答え: f-string
f-stringは式を明示的かつ読みやすく埋め込めます。
異なる型の値を文字列と直接+で連結するとどうなりますか?
答え: 多くの場合TypeErrorになる
明示的にstrへ変換するかf-stringを使います。
2つの変数が同じ値かを比較したい。通常使う演算子はどれですか?
答え: ==
==は値の等価性を比較します。isは同一オブジェクトかを調べます。
Noneかどうかを判定する推奨記法はどれですか?
答え: value is None
Noneはsingletonなのでアイデンティティ比較のisを使います。
シーケンスをインデックスと値の組でループしたい。適切なのはどれですか?
答え: enumerate(sequence)
enumerateはインデックスと要素を同時に返します。
JSON文字列をPythonオブジェクトへ変換したい。適切なのはどれですか?
答え: json.loads(text)
json.loadsはJSON文字列をdictやlist等へdecodeします。
PythonオブジェクトをJSON文字列へ変換したい。適切なのはどれですか?
答え: json.dumps(value)
json.dumpsは対応オブジェクトをJSON文字列へencodeします。
UTF-8のテキストファイルを確実に読みたい。適切なopenはどれですか?
答え: open(path, encoding="utf-8")
encodingを明示するとOS既定値の差による文字化けを防げます。
OSに依存しにくいパス操作をしたい。適切なのはどれですか?
答え: pathlib.Path
pathlibはパスの結合・確認・読み書きをオブジェクト指向で扱えます。
外部コマンドを引数付きで安全に実行したい。適切な基本方針はどれですか?
答え: subprocess.runへ引数listを渡しshell=Falseを保つ
引数listとshell=Falseはshell injectionの危険を下げます。
プロジェクトごとに依存パッケージを分離したい。基本的な方法はどれですか?
答え: venv等でvirtual environmentを作る
virtual environmentはプロジェクトごとにinterpreter環境とパッケージを分離します。
アプリケーションの依存バージョンを再現可能にしたい。適切なのはどれですか?
答え: ロックされた依存情報をバージョン管理しCIで同じものをinstallする
依存を固定すると環境ごとの予期しないバージョン差を減らせます。
モジュールを直接実行した場合だけCLI処理を動かしたい。使う書き方はどれですか?
答え: if __name__ == "__main__":
直接実行時は__name__が__main__になり、import時の副作用を避けられます。
設定値をソースコードへ直書きせず環境から受け取りたい。基本的な方法はどれですか?
答え: os.environまたは設定ライブラリで環境変数を読む
環境変数は設定をコードから分離できますが、secret storeや検証も組み合わせます。
アプリケーションログをprintだけでなくレベル・時刻・出力先付きで管理したい。使う標準モジュールはどれですか?
答え: logging
loggingはレベル、formatter、handlerを設定して運用可能なログを出せます。
大量レコードを処理中、1件の失敗で全体を即終了させるべきでない。適切な設計はどれですか?
答え: 失敗単位を捕捉して記録し、方針に従い継続・retry・隔離する
失敗境界と再処理方針を明確にすると部分障害へ対応できます。
HTTP API呼び出しでネットワーク障害へ備える基本方針はどれですか?
答え: timeoutを設定し、再試行可能な失敗だけbackoff付きでretryする
timeoutと限定retryにより停止と過負荷を防ぎます。
関数の入力・戻り値の意図を明示し静的チェッカーで確認したい。使うものはどれですか?
答え: type hints
type hintsは実行時強制ではありませんが、IDEやtype checkerで不整合を検出できます。
単純なデータコンテナに自動生成されたinitやreprが欲しい。適切なのはどれですか?
答え: @dataclass
dataclassはフィールド定義からinit、repr、比較等を生成できます。
DBクエリへユーザー入力を渡す安全な方法はどれですか?
答え: DB driverのパラメータ化クエリを使う
parameter bindingは値をSQL構文から分離しSQL injectionを防ぎます。
小さな関数の期待結果を自動検証したい。適切なのはどれですか?
答え: ユニットテストで入力と期待値をassertする
ユニットテストは小さい単位の振る舞いを高速・反復可能に確認します。
外部APIを呼ぶ関数のユニットテストを安定させたい。適切なのはどれですか?
答え: 依存関係を注入しmock/fakeで境界を置き換える
外部境界を置換すると速度と決定性を保ち、integration testと役割分担できます。
一時ファイルを使うテストで後始末漏れを防ぎたい。適切なのはどれですか?
答え: temporary directory fixture/contextマネージャーを使う
一時リソースのライフサイクルをテストフレームワークやコンテキストマネージャーへ任せます。
値の検証をassertだけで本番処理に実装する問題はどれですか?
答え: 最適化オプションでassertが無効化され得る
assertは開発時の不変条件確認向けです。入力エラーには明示的な例外を使います。
信頼できないデータを読み込む際pickleを避ける理由はどれですか?
答え: deserialization時に任意コード実行につながり得る
pickleは信頼済みPythonオブジェクト向けで、外部入力には安全なformatとスキーマ検証を使います。
未検証の文字列をevalへ渡す問題はどれですか?
答え: 任意のPython codeを実行され得る
evalは式をコードとして実行するため、parserや明示的な変換を使います。
CPU負荷の高い純Python処理を複数コアで並列化したい。一般的な選択はどれですか?
答え: multiprocessingまたはprocess pool
プロセスは別interpreterでCPU-bound処理を複数コアへ分散できます。
多数のI/O待ちタスクを効率よく扱う選択肢はどれですか?
答え: asyncioと非同期対応ライブラリ
asyncioはI/O待ち中に他タスクを進められますが、blocking処理を避ける必要があります。
本番障害解析に役立つログへ含める情報はどれですか?
答え: 時刻、レベル、request/ジョブID、主要コンテキストを秘密なしで記録する
correlation IDとコンテキストは追跡性を高め、秘密や個人情報はmask・最小化します。
ライブラリ関数が失敗時にプロセス全体をsys.exitする問題はどれですか?
答え: callerがエラー処理やクリーンアップを選べなくなる
ライブラリは意味のある例外をraiseし、終了判断はCLI等の境界へ任せる方が再利用しやすくなります。
ユーザー一覧を年齢の昇順、同年齢では名前の昇順に並べ替えたい。適切な方法はどれですか?
答え: sorted(users, key=lambda u: (u.age, u.name))
キーが返すtupleは左から順に比較されるため、複数項目の並べ替え条件を明確に表現できます。sortedは元のlistを変更しません。
入れ子のdictをcopy.copy()で複製後、内側のlistを変更すると元データにも反映された。理由と対策はどれですか?
答え: shallow copyは内側のオブジェクトを共有するため、独立複製が必要ならcopy.deepcopy等を検討する
shallow copyは外側のコンテナだけを新しくし、入れ子要素への参照は共有します。deepcopyのコストや共有すべきオブジェクトも考慮して使い分けます。
dataclassで各インスタンスが独立した空listを持つフィールドを定義したい。適切なのはどれですか?
答え: field(default_factory=list)
default_factoryはインスタンス生成ごとにlistを新しく作ります。変更可能な既定値の共有を避けるために使います。
通貨の合計を扱う処理で、0.1 + 0.2のような2進浮動小数点誤差を避けたい。適切な選択はどれですか?
答え: 文字列からdecimal.Decimalを生成し、必要な丸め規則を明示する
Decimalは10進の桁と丸めを制御できます。floatから直接生成すると既存の2進誤差を取り込むため、通常は文字列や整数の最小通貨単位から生成します。
複数タイムゾーンの利用者へ日時を提供するAPIで、保存・比較の基準を安全に扱う方針はどれですか?
答え: timezone-awareなUTC日時で保存・比較し、表示時に利用者のタイムゾーンへ変換する
aware datetimeでUTCを基準にすると時点を一意に扱えます。入出力のタイムゾーンとISO 8601形式を明示し、表示境界で変換します。
標準csvモジュールでUTF-8のCSVをWindowsを含む環境で読み書きし、空行の混入を避けたい。ファイルの開き方はどれですか?
答え: open(path, mode, encoding='utf-8', newline='')
csvモジュールへ改行処理を任せるためnewline=''を指定し、文字コードも明示します。外部仕様にBOMが必要ならutf-8-sig等を要件に応じて選びます。
設定ファイルを更新中にプロセスが停止しても、途中まで書かれたファイルを読ませたくない。基本的な更新方法はどれですか?
答え: 同じfilesystemの一時ファイルへ完全に書いてflush等を行い、os.replaceで置き換える
一時ファイルを完成させてから同一filesystem内で置換すると、読者には旧版か新版のどちらかを見せやすくなります。耐障害要件に応じてfsyncやバックアップも検討します。
CLIで必須オプション、型変換、ヘルプメッセージ、終了コードを一貫して扱いたい。標準ライブラリの選択はどれですか?
答え: argparse
argparseはオプション定義から解析、型変換、usage/help、入力エラー時の終了をまとめて扱えます。CLI境界から業務logicを分離するとテストもしやすくなります。
現代的なPythonプロジェクトでビルドシステムやプロジェクトメタデータ、基本依存関係を標準形式で管理する中心ファイルはどれですか?
答え: pyproject.toml
pyproject.tomlはビルドバックエンド、プロジェクトメタデータ、依存関係やツール設定の標準的な格納先です。ロックファイルの扱いは利用するパッケージマネージャーに従います。
パスワード再設定用の推測困難なトークンを生成したい。標準ライブラリで適切なのはどれですか?
答え: secrets.token_urlsafe()
シークレットモジュールは認証トークンなどセキュリティ用途の暗号学的に強い乱数を生成します。トークンには十分なentropy、有効期限、1回限りの利用も設計します。
アプリケーションでパスワードを保存するときの基本方針として適切なのはどれですか?
答え: Argon2等のパスワード専用のsalt付き低速ハッシュを信頼できるライブラリで使う
パスワード保存には攻撃者の総当たりを遅くする専用KDFとユーザーごとのsaltを使います。パラメータ更新や既存ハッシュのrehash方針も持ちます。
複数のDB更新をすべて成功した場合だけ確定し、途中で例外が出たら元へ戻したい。適切な設計はどれですか?
答え: driverやORMのトランザクションコンテキストを使い、成功時コミット・例外時ロールバックする
トランザクション境界を明示し、コンテキストマネージャー等でコミット・ロールバック・接続返却を確実にします。外部API呼出しを同一トランザクションへ含める場合は長時間ロックにも注意します。
ページトークン方式のHTTP APIから全レコードを取得する処理で必要な実装はどれですか?
答え: 各レスポンスのnext tokenを使って終了条件まで反復し、rate limitや重複も考慮する
ページネーションの仕様に従い、次ページのトークンがなくなるまで取得します。タイムアウト、エラー、レート制限、再試行時の重複排除やチェックポイントも要件に応じて設計します。
数GBのHTTPレスポンスをファイルへ保存するとき、メモリ使用量を抑える方針はどれですか?
答え: レスポンスをstreaming modeで受け取り、一定sizeのchunkごとにファイルへ書く
streamingとchunk書込みでメモリ使用量を一定範囲に保てます。timeout、ステータス、最大size、一時ファイル、checksum、失敗時クリーンアップも組み合わせます。
高コスト関数へfunctools.lru_cacheを使う際、適した前提はどれですか?
答え: 同じhashable引数なら同じ結果を返し、古い結果を許容でき、maxsizeを検討している
lru_cacheは引数をキーに結果を再利用します。純粋性、ハッシュ可能性、データの鮮度、メモリ上限、必要ならcache_clearの契機を設計します。
同じ関数を多くの入力値と期待値でテストし、重複したテストコードを減らしたい。pytestで適切なのはどれですか?
答え: @pytest.mark.parametrizeでケースを列挙する
parametrizeは1つのtest logicへ複数ケースを供給し、各ケースを個別に報告します。境界値や異常系を表形式で追加しやすくなります。
テスト用DB接続をフィクスチャで作成し、テスト失敗時にも必ずロールバック・クローズしたい。pytestのフィクスチャの設計はどれですか?
答え: フィクスチャでリソースを作りyieldし、yield後をtry/finally相当のクリーンアップにする
yield fixtureは前半でsetup、後半でteardownを表現し、テストの成功・失敗にかかわらずクリーンアップを実行できます。fixture scopeとテスト分離も合わせて設計します。
外部サービスクライアントを差し替え可能にし、特定クラスの継承を要求せず必要なメソッドだけを型検査したい。適切なのはどれですか?
答え: typing.Protocolで必要なinterfaceを定義する
Protocolは必要な属性・メソッドを持つ型を構造的に受け入れます。実装を疎結合にし、fakeやadapterも静的チェッカーで確認できます。
複数スレッドが共有dictのread-modify-writeを行い、更新が失われる。基本的な対策はどれですか?
答え: 共有状態を減らし、必要なcritical sectionはthreading.Lock等で保護する
read-modify-writeは複数操作からなり競合し得ます。ロック、キュー、thread-local、不変のデータ等から要件に合う方法を選び、ロック範囲とデッドロックにも注意します。
コンテナ上のPythonワーカーがSIGTERMを受けたとき、処理中ジョブを安全に終えて終了したい。設計として適切なのはどれですか?
答え: signal handlerでは停止flagを設定し、新規受付を止め、main loopでクリーンアップして期限内に終了する
signal handlerは小さく保ち、通常の制御フローへ停止要求を伝えます。キュー受付停止、進行中処理、checkpoint、接続クローズ、platformの猶予時間を設計します。
APIから取得したレコードをジェネレーターで返しています。件数確認のために最後まで走査した後、同じジェネレーターを保存処理へ渡すと0件になりました。理由はどれですか?
答え: ジェネレーターは走査で消費され、同じ個体では先頭へ戻らない
ジェネレーターは読み取り位置を持つイテレーターです。一度最後まで進めると、同じ個体からは再取得できません。1回の走査で保存と集計を行うか、再取得や容量を考慮したリスト化を設計します。
環境変数FEATURE_ENABLEDに文字列「false」を設定したのに、bool(value)で判定すると機能が有効になりました。設定値の扱いとして適切なのはどれですか?
答え: 許可する真偽の文字列を明示して変換し、未知の値はエラーにする
Pythonでは空でない文字列は真です。「false」も空でないためboolではTrueになります。例えばtrue/falseだけを受け付ける変換を定義し、未設定時の既定値と不正値の処理も決めます。
Python 3.10以降で、商品ID一覧と価格一覧をzipで組み合わせています。件数不一致による末尾の欠落を、最後まで処理する際に検出したい場合はどうしますか?
答え: zipにstrict=Trueを指定し、不一致時のValueErrorを処理する
通常のzipは短い側で終了します。strict=Trueなら走査時に長さの不一致を検出してValueErrorになります。ただし不一致が判明する前に組が返るため、全件一括確定が必要なら検証と書き込みを分離します。
顧客IDがA、B、Aの順に並ぶ売上をitertools.groupbyで集計したところ、Aが二つのグループになりました。顧客ごとに一つへまとめるにはどうしますか?
答え: 顧客IDで並べ替えてから、同じ顧客IDをキーにgroupbyする
groupbyは隣接する同じキーの行をまとめるもので、SQLのGROUP BYのように離れた行を自動集約しません。同じキーで事前に並べ替えるか、辞書で加算する方法を使います。大規模データでは並べ替えの容量も考慮します。
orders.pyが「from gateway import charge」で関数を取り込んでいます。orders内の決済呼び出しをテストで差し替える場合、パッチの対象はどれですか?
答え: orders.chargeを差し替え、呼び出し側が参照する名前を置き換える
パッチは定義元ではなく、テスト対象がその名前を参照する場所に適用します。from importでordersに束縛されたchargeは、後からgateway.chargeだけを差し替えても変わりません。
処理対象のファイル数が実行時に決まります。途中のopenが失敗しても、それまでに開いた全ファイルを閉じたい場合に適切なのはどれですか?
答え: ExitStackへ各ファイルを登録し、終了時に解放する
with ExitStack() as stackの中でstack.enter_context(open(...))を使うと、成功した取得のたびに終了処理が登録されます。後続の取得で例外が出ても、登録済みのファイルは逆順に閉じられます。
スレッド間でqueue.Queueを使っています。全ワーカーがgetで取り出した後も結合が戻りません。取り出した仕事の完了を通知するにはどうしますか?
答え: 各getに対応するtask_doneを、処理の終了時に一回だけ呼ぶ
結合はキューが空かどうかではなく、未完了タスク数が0になるまで待ちます。getだけでは減らず、task_doneで完了を通知します。例外時の再試行や失敗記録を行ったうえで、finallyなどで通知漏れを防ぎます。
asyncioで複数の通信を処理していますが、同期版の外部SDKが待機中、他のタスクも止まります。SDKをすぐに非同期版へ変更できない場合の対応はどれですか?
答え: スレッド利用の安全性を確認し、await asyncio.to_threadで呼び出す
async defの内部でも同期I/Oはイベントループを占有します。to_threadは同期関数を別スレッドで実行し、その完了を非同期に待てます。SDKのスレッド安全性や同時実行数を確認し、SDK自身にもタイムアウトを設定します。
元のリストを残したまま、並べ替えた別リストを作りたいのに、result = items.sort()のresultがNoneになりました。適切な修正はどれですか?
答え: result = sorted(items)に変え、元とは別の並べ替え済みリストを得る
list.sortはリスト自身を変更し、戻り値はNoneです。sortedは新しいリストを作ります。ただし要素の深い複製ではないため、要素が可変オブジェクトなら元のリストと参照を共有します。
外部から受け取ったCSVをUTF-8として読み、errors='ignore'で不正なバイトを捨てたところ、顧客名が欠けても処理が成功しました。欠損を見逃さない方針はどれですか?
答え: 厳密にデコードして失敗を検出し、入力仕様を確認して隔離・再取得する
errors='ignore'は変換できないバイトを黙って捨てます。入力の文字コード仕様に従い、通常はstrictで問題を検出します。機密情報をログへ丸ごと残さず、失敗した入力を適切に保護して再取得や修正へ回します。
Pythonで処理の経過秒数を測っています。OSの時計補正で時刻が戻っても負の経過時間にならないようにするには、どの時計を使いますか?
答え: monotonicの前後差を使う
monotonicは後戻りしない時計で、基準点ではなく2回の読取りの差を使います。日時の記録にはUTCなどの壁時計を使い、経過時間の計測と役割を分けます。再起動をまたぐ永続的な時刻として保存する用途ではありません。
Pythonでfloat('nan')を含むデータを外部API向けJSONにします。非標準のNaNを書き出す前に失敗させる設定はどれですか?
答え: allow_nan=Falseを指定する
json.dumpsは既定ではNaNなども出力できますが、厳密なJSONでは許されません。allow_nan=FalseならNaNや無限大の出力でValueErrorになります。エラー時に欠損として扱うか拒否するかはAPI契約で決めます。
lru_cache付き関数が返すリストに、呼出し元がappendしました。同じ引数で再び呼ぶと追加した値が残ります。原因はどれですか?
答え: キャッシュされた同じリストを共有している
lru_cacheは結果オブジェクトへの参照を保持し、再利用します。可変な結果を呼出し元が変更すると後続にも影響します。不変な値を返すか、必要な境界でコピーするなど、共有の契約を設計します。
Pythonの@dataclass(frozen=True)にlist型のタグを持たせました。通常のobj.tags.append('x')はどうなりますか?
答え: list自体の変更は可能で、要素が追加される
frozenは通常の属性代入や削除を制限しますが、参照先のオブジェクトまで不変にしません。タグへの再代入と、既存リストの変更は別です。深い不変性が必要ならtupleなど、内部の型や共有範囲も設計します。
Pythonのsubprocess.runで起動したコマンドが終了コード2を返しました。非ゼロ終了を例外として検出する指定はどれですか?
答え: runにcheck=Trueを指定する
check=Trueでは非ゼロ終了に対してCalledProcessErrorが発生します。標準出力の取得や文字列変換だけでは成否を確認しません。起動失敗やタイムアウトの例外も区別し、コマンド引数や機密出力の扱いも確認します。
Decimal('2.345')を小数第2位まで、ちょうど中間なら絶対値が大きい方へ丸めたい。quantizeへ指定する丸め方式はどれですか?
答え: ROUND_HALF_UPで2.35にする
Decimal('0.01')をquantizeの単位にし、rounding=ROUND_HALF_UPを指定します。2.345は中間なので2.35です。HALF_EVENは最後の桁が偶数になる方へ丸めます。業務規則を明示し、floatからの誤差を持ち込まないようにします。
shared=[]、source=[shared, shared]をcopy.deepcopyで一度に複製しました。通常のlistだけの場合、複製結果の二つの内側リストはどうなりますか?
答え: 元から独立した同じ複製リストを共有する
deepcopyは1回の複製処理でmemoを使い、同じオブジェクトを重複して複製しません。結果の二つの要素は同じ複製リストを指し、元のsharedとは別です。深い複製でも、元の共有関係まで必ず解消されるわけではありません。
Pythonのcsv.readerで既定設定のまま顧客コード00123を読みます。先頭ゼロを保持する扱いはどれですか?
答え: 文字列のまま受け、勝手に数値化しない
通常のcsv.readerはフィールドを文字列として返します。コードは計算用の数値ではないため、そのまま保持します。QUOTE_NONNUMERICなど型変換を伴う設定や、その後の数値変換を使う場合はコードの意味を失わないか確認します。
一時作業ディレクトリをPythonで作り、例外が起きても通常のスコープ終了時に中身ごと片付けたい。適切なのはどれですか?
答え: TemporaryDirectoryで管理する
TemporaryDirectoryをコンテキストマネージャーとして使うと、終了時に削除処理が行われます。mkdtempは呼出し側の削除が必要です。開いたファイルを先に閉じ、権限エラーなどの後片付け失敗も扱います。強制終了時まで保証する仕組みではありません。
Webの検証用に受け取ったトークンと期待値をPythonで比較します。比較時間による漏えいを減らす標準関数はどれですか?
答え: secrets.compare_digestを使う
compare_digestは値の内容による短絡を避ける比較に使います。対応する同じ型の値で比較し、長さや型などの情報が一切漏れないとは考えません。トークンの十分な乱数性や期限、再利用制御も別途必要です。