Python3エンジニア認定基礎試験 第11章 標準ライブラリめぐり─PartII 予想問題と解説
Python3エンジニア認定基礎試験「第11章 標準ライブラリめぐり─PartII」の予想問題を10問収録しています。各問を解説つきで掲載し、全問は演習画面で解けます。出題は公式シラバスの範囲内です。
この章の要点
10進浮動小数点演算、文字列テンプレート、マルチスレッド、ログ記録、リスト操作用ツール、出力の体裁調整、バイナリデータのレコードレイアウト、弱参照などを扱う分野です。全10問(基礎4問・標準5問・応用1問)を収録しています。
- 10進浮動小数点演算
- 文字列テンプレート化
- マルチスレッディング
- ログ記録
- リストを操作するためのツール
- 出力の体裁を整える
- バイナリデータのレコードレイアウト
- 弱参照
情報源と編集区分
公式範囲を確認し、問題数・難易度・確認点は当サイトが集計・編集。
試験概要(公式)確認しておきたいポイント
当サイトの作問時に観察した、取り違えやすい論点です(公式の統計ではありません)。
- Decimalへfloatを渡してから10進表記の正確さを期待すること。0.1のような値はDecimal("0.1")のように文字列から作り、2進浮動小数点の近似値を先に持ち込まない。
よくある質問
Q第11章 標準ライブラリめぐり─PartIIは何問収録されていますか?
現在10問を収録しています。内訳は基礎4問・標準5問・応用1問です。
Q第11章 標準ライブラリめぐり─PartIIの頻出論点は何ですか?
10進浮動小数点演算、文字列テンプレート、マルチスレッド、ログ記録、リスト操作用ツール、出力の体裁調整、バイナリデータのレコードレイアウト、弱参照などが出題対象です(当サイト収録問題に基づく編集部集計)。
Q間違えた問題はどう復習すればいいですか?
誤答した選択肢のどこがずれていたかを解説で確認し、関連用語がある場合は用語集で定義に戻ってから再演習することをおすすめします。
0.1のような10進表記の値を正確に扱い、精度や丸めを制御したい金融計算で、公式チュートリアルの説明に最も合う方法はどれか。
答えと解説を見る
正解は「decimalモジュールを読み込み、Decimal("0.1")のように文字列から値を作る」である。公式チュートリアルは、decimalモジュールが10進浮動小数点算術のためのDecimalデータ型を提供し、2進浮動小数点では正確に表現できない10進数を正確に表現できると説明している。この性質に加え、精度と丸めを制御できるため、会計処理や金融アプリケーションに適する。文字列からDecimalを作れば、先にfloatへ変換した際の2進表現を持ち込まずに10進表記の値を指定できる。floatの0.1は2進浮動小数点で正確に表現できないため、floatだけを使う方法は要件に合わない。decimalも2進表現だけを扱うという説明や、Decimalでは精度と丸めを制御できないという説明は、いずれも公式チュートリアルが挙げるDecimalの特徴と逆である。
https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 第11章 標準ライブラリめぐり─PartII)
エンドユーザーが編集可能な出力テンプレートで、プレースホルダに対応する値が見つからない場合でもエラーで処理を止めずプレースホルダをそのまま残したい。公式チュートリアルのstring.Templateクラスの説明に合う方法はどれか。
答えと解説を見る
正解は「safe_substitute()を使う。値が見つからない場合はプレースホルダがそのまま出力に残る」である。公式チュートリアルはsubstitute()がプレースホルダの値が置き換え用マッピングに見つからない場合KeyErrorを送出し、safe_substitute()メソッドを使うと値が見つからなくてもプレースホルダがそのまま出力に残ると説明している。エラーで止めずに処理を継続したい今回の要件には、KeyErrorを送出しないsafe_substitute()が合う。substitute()とsafe_substitute()はどちらもプレースホルダを実際の値へ置き換えるメソッドだが、値が欠けたときの挙動だけが異なる点を区別して覚える必要がある。
https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 第11章 標準ライブラリめぐり─PartII)
複数のスレッドから同じリソースへアクセスする処理を、設計しやすく可読性・信頼性の高い形で調整したい。公式チュートリアルのthreadingモジュールの説明に合う方法はどれか。
答えと解説を見る
正解は「他の複数のスレッドからのリクエストを一つのスレッドへ送り込み、一つのリソースへのアクセスをできるだけ一つのスレッドに集中させるためにqueueモジュールを使う」である。公式チュートリアルは、threadingモジュールが順序的な依存関係にない複数のタスクを分割する高水準のテクニックだと説明したうえで、タスク間の調整については他の複数のスレッドからのリクエストを一つのスレッドに送り込み一つのリソースへのアクセスをできるだけ一つのスレッドに集中させるほうがよく、そのためにはqueueモジュールを使うのが最も良い方法だと説明している。複数スレッドが同じリソースへ直接アクセスする設計や、スレッドの終了を待たずに処理を進める設計は、この調整方針とは異なる。
https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 第11章 標準ライブラリめぐり─PartII)
アプリケーションのログメッセージを、コードを変更せずに出力先や書式を切り替えられるようにしたい。公式チュートリアルのloggingモジュールの説明に合うものはどれか。
答えと解説を見る
正解は「loggingモジュールは柔軟性のあるログ記録システムを提供し、Pythonコードでの直接設定とユーザが編集可能な設定ファイルによる設定の両方に対応する」である。公式チュートリアルはloggingモジュールが数多くの機能をそなえた柔軟性のあるログ記録システムを提供し、ログメッセージをファイルやsys.stderrへ送信できると説明し、さらにログ出力の設定をPythonコードで直接設定する方法とユーザが編集可能な設定ファイルで設定する方法の両方があると説明している。
https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 第11章 標準ライブラリめぐり─PartII)
ソート済みのリストへ要素を追加した後も並び順を保ちたい場合、公式チュートリアルの説明に合うモジュール・関数の組み合わせはどれか。
答えと解説を見る
正解は「bisectモジュールのbisect.insort()を使う。ソート済みリストへソート順序を保ったまま挿入できる」である。公式チュートリアルはbisectモジュールがソート済みのリストを操作するための関数を備え、bisect.insort()を使うとソート順序を保ったまま挿入できると説明している。arrayモジュールは同種データをコンパクトに格納するためのもので並び順の維持を目的とした機能ではなく、heapqは最小値へ素早くアクセスするためのヒープ構造を提供するものであり、いずれも今回の要件には合わない。
https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 第11章 標準ライブラリめぐり─PartII)
深くネストしたコンテナの内容を、省略した形で手早くrepr表示したい。公式チュートリアル11.1の説明に合うモジュールと機能の組み合わせはどれか。
答えと解説を見る
正解は「reprlibモジュール。大きなコンテナや深くネストしたコンテナを省略して表示するバージョンのrepr()を提供する」である。公式チュートリアル11.1は、reprlibモジュールが大きなコンテナや深くネストしたコンテナを省略して表示するバージョンのrepr()を提供すると説明し、reprlib.repr(set('supercalifragilisticexpialidocious'))が"{'a', 'c', 'd', 'e', 'f', 'g', ...}"のように一部を省略して返す例を示している。textwrapは段落を指定幅に折り返すモジュールで、pprintは複数行にわたる場合に改行やインデントを追加してデータ構造を明確に印字するモジュールであり「1行で表示する」という説明は誤り。structはバイナリレコードのpack/unpackを扱うモジュールで、repr表示とは役割が異なる。
https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 11.1 出力の体裁を整える)
公式チュートリアル11.3が示す、structモジュールでZIPファイルのヘッダ情報を巡回する例の説明として正しいものはどれか。
答えと解説を見る
正解は「struct.pack()やunpack()は、様々な長さのバイナリレコード形式を操作するための関数である」である。公式チュートリアル11.3は、structモジュールが様々な長さのバイナリレコード形式を操作するpack()やunpack()といった関数を提供すると説明し、zipfileモジュールを使わずにZIPファイルのヘッダ情報を巡回する例を示している。つまりzipfileモジュールの代わりにstructを使う例であり、両方をあわせてimportする必要があるという説明は誤り。例のパック符号"H"は2バイト、"I"は4バイトの符号無し整数を表し、両方とも4バイトという説明は誤り。"<"はパック符号がstandardサイズでバイトオーダーがリトルエンディアンであることを示すもので、ビッグエンディアンという説明も誤り。
https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 11.3 バイナリデータのレコードレイアウトを扱う)
作成コストの大きいオブジェクトをキャッシュしたいが、そのキャッシュ自体がオブジェクトへの恒久的な参照になって不要になったオブジェクトのメモリが解放されなくなるのは避けたい。公式チュートリアル11.6の説明に合う方法はどれか。
答えと解説を見る
正解は「weakrefモジュールを使い、オブジェクトへの参照を作らずに追跡する。弱参照オブジェクトが不要になると弱参照テーブルから自動的に除去されコールバック関数がトリガされる」である。公式チュートリアル11.6は、Pythonがほとんどのオブジェクトを参照カウント方式で管理し、オブジェクトへの最後の参照がなくなってしばらくするとメモリが解放されると説明したうえで、オブジェクトを追跡するだけで恒久的な参照を作ってしまう問題を避けるため、weakrefモジュールがオブジェクトへの参照を作らずに追跡するツールを提供すると説明している。弱参照オブジェクトが不要になると弱参照テーブルから自動的に除去されコールバック関数がトリガされ、典型的な応用例として作成コストの大きいオブジェクトのキャッシュを挙げている。通常のdictに値として格納すると恒久的な参照になってしまい、要件の「メモリが解放されなくなるのを避けたい」に反する。
https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 11.6 弱参照)
string.Templateを使う目的として、プレースホルダの欠落対応(safe_substitute())以外に公式チュートリアル11.2が挙げているものはどれか。
答えと解説を見る
正解は「複数ある出力フォーマット(XMLファイル用・プレーンテキストのレポート用・HTMLのwebレポート用など)から、同じプログラムロジックを分離すること」である。公式チュートリアル11.2は、テンプレートのもう一つの用途として、複数ある出力フォーマットからのプログラムロジックの分離を挙げ、これによりXMLファイル用・プレーンテキストのレポート用・HTMLのwebレポート用のテンプレートに、同じプログラムロジックから値を埋め込めると説明している。実行速度の比較、任意のPython式の評価、f-stringとの構文の同一性については、公式チュートリアルの説明にない。
https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 11.2 文字列テンプレート)
loggingモジュールで、メッセージの重要度(プライオリティ)によって送信先を振り分けたい。公式チュートリアル11.5の説明に合うものはどれか。
答えと解説を見る
正解は「選択可能な送信先にはemail・データグラム・ソケット・HTTPサーバへの送信などがあり、新たにフィルタを作成するとDEBUG・INFO・WARNING・ERROR・CRITICALのプライオリティによって異なる送信先を選択できる」である。公式チュートリアル11.5は、デフォルトではinfo()とdebug()による出力は抑制されて標準エラーへ送信されるが、選択可能な送信先にはemail・データグラム・ソケット・HTTPサーバへの送信などがあり、新たにフィルタを作成するとDEBUG・INFO・WARNING・ERROR・CRITICALのプライオリティによって異なる送信先を選択できると説明している。送信先がファイルとsys.stderrの2種類に固定されているという説明や、info()・debug()がデフォルトで送信されるという説明、プライオリティ区別機能が無いという説明は、いずれも本文の記述と食い違う。
https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 11.5 ログ記録)