AI資格ドリル
資格を選ぶ

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は何問収録されていますか?

A

現在10問を収録しています。内訳は基礎4問・標準5問・応用1問です。

Q第11章 標準ライブラリめぐり─PartIIの頻出論点は何ですか?

A

10進浮動小数点演算、文字列テンプレート、マルチスレッド、ログ記録、リスト操作用ツール、出力の体裁調整、バイナリデータのレコードレイアウト、弱参照などが出題対象です(当サイト収録問題に基づく編集部集計)。

Q間違えた問題はどう復習すればいいですか?

A

誤答した選択肢のどこがずれていたかを解説で確認し、関連用語がある場合は用語集で定義に戻ってから再演習することをおすすめします。

第1問 ・ 10進浮動小数点演算

0.1のような10進表記の値を正確に扱い、精度や丸めを制御したい金融計算で、公式チュートリアルの説明に最も合う方法はどれか。

  • アfloat("0.1")だけを使えば、10進表記の0.1は必ず誤差なく格納される
  • イdecimalモジュールを読み込み、Decimal("0.1")のように文字列から値を作る
  • ウdecimalモジュールも2進浮動小数点だけを扱うため、floatと表現上の違いはない
  • エDecimalでは精度や丸めを制御できないため、金融計算にはfloatだけを使う
答えと解説を見る
イdecimalモジュールを読み込み、Decimal("0.1")のように文字列から値を作る正解
解説

正解は「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)

問題番号: py3b-045
問題番号 py3b-045 の誤りを報告する
第2問 ・ 文字列テンプレート化

エンドユーザーが編集可能な出力テンプレートで、プレースホルダに対応する値が見つからない場合でもエラーで処理を止めずプレースホルダをそのまま残したい。公式チュートリアルのstring.Templateクラスの説明に合う方法はどれか。

  • アsubstitute()を使う。値が見つからない場合は自動的に空文字列に置き換えられる
  • イsubstitute()を使う。値が見つからない場合は自動的にNoneへ置き換えられる
  • ウsafe_substitute()を使う。値が見つからない場合はプレースホルダがそのまま出力に残る
  • エTemplateクラスにはプレースホルダの欠落を許容するメソッドはなく、事前に全ての値を用意する必要がある
答えと解説を見る
ウsafe_substitute()を使う。値が見つからない場合はプレースホルダがそのまま出力に残る正解
解説

正解は「safe_substitute()を使う。値が見つからない場合はプレースホルダがそのまま出力に残る」である。公式チュートリアルはsubstitute()がプレースホルダの値が置き換え用マッピングに見つからない場合KeyErrorを送出し、safe_substitute()メソッドを使うと値が見つからなくてもプレースホルダがそのまま出力に残ると説明している。エラーで止めずに処理を継続したい今回の要件には、KeyErrorを送出しないsafe_substitute()が合う。substitute()とsafe_substitute()はどちらもプレースホルダを実際の値へ置き換えるメソッドだが、値が欠けたときの挙動だけが異なる点を区別して覚える必要がある。

https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 第11章 標準ライブラリめぐり─PartII)

問題番号: py3b-067
問題番号 py3b-067 の誤りを報告する
第3問 ・ マルチスレッディング

複数のスレッドから同じリソースへアクセスする処理を、設計しやすく可読性・信頼性の高い形で調整したい。公式チュートリアルのthreadingモジュールの説明に合う方法はどれか。

  • アすべてのスレッドが直接同じリソースへ同時にアクセスするコードを書き、調整は行わない
  • イthreadingモジュールを使わず、順序的な依存関係にない複数のタスクもすべて直列に実行する
  • ウjoin()を呼ばずにstart()だけを呼び、スレッドの終了を待たずにリソースへアクセスする
  • エ他の複数のスレッドからのリクエストを一つのスレッドへ送り込み、一つのリソースへのアクセスをできるだけ一つのスレッドに集中させるためにqueueモジュールを使う
答えと解説を見る
エ他の複数のスレッドからのリクエストを一つのスレッドへ送り込み、一つのリソースへのアクセスをできるだけ一つのスレッドに集中させるためにqueueモジュールを使う正解
解説

正解は「他の複数のスレッドからのリクエストを一つのスレッドへ送り込み、一つのリソースへのアクセスをできるだけ一つのスレッドに集中させるためにqueueモジュールを使う」である。公式チュートリアルは、threadingモジュールが順序的な依存関係にない複数のタスクを分割する高水準のテクニックだと説明したうえで、タスク間の調整については他の複数のスレッドからのリクエストを一つのスレッドに送り込み一つのリソースへのアクセスをできるだけ一つのスレッドに集中させるほうがよく、そのためにはqueueモジュールを使うのが最も良い方法だと説明している。複数スレッドが同じリソースへ直接アクセスする設計や、スレッドの終了を待たずに処理を進める設計は、この調整方針とは異なる。

https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 第11章 標準ライブラリめぐり─PartII)

問題番号: py3b-068
問題番号 py3b-068 の誤りを報告する
第4問 ・ ログ記録

アプリケーションのログメッセージを、コードを変更せずに出力先や書式を切り替えられるようにしたい。公式チュートリアルのloggingモジュールの説明に合うものはどれか。

  • アloggingモジュールはログメッセージをファイルにしか送信できず、標準エラー出力への送信はできない
  • イログ出力の設定はPythonコードで直接記述する方法しか用意されておらず、設定ファイルによる変更はできない
  • ウloggingモジュールは柔軟性のあるログ記録システムを提供し、Pythonコードでの直接設定とユーザが編集可能な設定ファイルによる設定の両方に対応する
  • エログの重要度を区別する仕組みはなく、すべてのログメッセージは同じ扱いで出力される
答えと解説を見る
ウloggingモジュールは柔軟性のあるログ記録システムを提供し、Pythonコードでの直接設定とユーザが編集可能な設定ファイルによる設定の両方に対応する正解
解説

正解は「loggingモジュールは柔軟性のあるログ記録システムを提供し、Pythonコードでの直接設定とユーザが編集可能な設定ファイルによる設定の両方に対応する」である。公式チュートリアルはloggingモジュールが数多くの機能をそなえた柔軟性のあるログ記録システムを提供し、ログメッセージをファイルやsys.stderrへ送信できると説明し、さらにログ出力の設定をPythonコードで直接設定する方法とユーザが編集可能な設定ファイルで設定する方法の両方があると説明している。

https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 第11章 標準ライブラリめぐり─PartII)

問題番号: py3b-069
問題番号 py3b-069 の誤りを報告する
第5問 ・ リストを操作するためのツール

ソート済みのリストへ要素を追加した後も並び順を保ちたい場合、公式チュートリアルの説明に合うモジュール・関数の組み合わせはどれか。

  • アbisectモジュールのbisect.insort()を使う。ソート済みリストへソート順序を保ったまま挿入できる
  • イarrayモジュールのarray.append()を使う。同種データのみ格納できるため自動的にソート順が保たれる
  • ウheapqモジュールを使い、リストの要素を毎回ソートし直してから追加する
  • エlistのappend()メソッドだけを使う。追加後は常に自動的にソートされる
答えと解説を見る
アbisectモジュールのbisect.insort()を使う。ソート済みリストへソート順序を保ったまま挿入できる正解
解説

正解は「bisectモジュールのbisect.insort()を使う。ソート済みリストへソート順序を保ったまま挿入できる」である。公式チュートリアルはbisectモジュールがソート済みのリストを操作するための関数を備え、bisect.insort()を使うとソート順序を保ったまま挿入できると説明している。arrayモジュールは同種データをコンパクトに格納するためのもので並び順の維持を目的とした機能ではなく、heapqは最小値へ素早くアクセスするためのヒープ構造を提供するものであり、いずれも今回の要件には合わない。

https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 第11章 標準ライブラリめぐり─PartII)

問題番号: py3b-070
問題番号 py3b-070 の誤りを報告する
第6問 ・ 出力の体裁を整える

深くネストしたコンテナの内容を、省略した形で手早くrepr表示したい。公式チュートリアル11.1の説明に合うモジュールと機能の組み合わせはどれか。

  • アtextwrapモジュール。段落を指定したスクリーン幅に収まるよう折り返して表示する
  • イreprlibモジュール。大きなコンテナや深くネストしたコンテナを省略して表示するバージョンのrepr()を提供する
  • ウpprintモジュール。改行やインデントを一切使わず1行で表示する
  • エstructモジュール。バイナリレコード形式のデータをrepr()で表示できるようにする
答えと解説を見る
イreprlibモジュール。大きなコンテナや深くネストしたコンテナを省略して表示するバージョンのrepr()を提供する正解
解説

正解は「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 出力の体裁を整える)

問題番号: py3b-118
問題番号 py3b-118 の誤りを報告する
第7問 ・ バイナリデータのレコードレイアウト

公式チュートリアル11.3が示す、structモジュールでZIPファイルのヘッダ情報を巡回する例の説明として正しいものはどれか。

  • アstruct.pack()やunpack()は、様々な長さのバイナリレコード形式を操作するための関数である
  • イstructモジュールを使うには、必ずzipfileモジュールをあわせてimportする必要がある
  • ウパック符号"H"と"I"は、どちらも4バイトの符号無し整数を表す
  • エ"<"というパック符号は、バイトオーダーがビッグエンディアンであることを示す
答えと解説を見る
アstruct.pack()やunpack()は、様々な長さのバイナリレコード形式を操作するための関数である正解
解説

正解は「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 バイナリデータのレコードレイアウトを扱う)

問題番号: py3b-119
問題番号 py3b-119 の誤りを報告する
第8問 ・ 弱参照

作成コストの大きいオブジェクトをキャッシュしたいが、そのキャッシュ自体がオブジェクトへの恒久的な参照になって不要になったオブジェクトのメモリが解放されなくなるのは避けたい。公式チュートリアル11.6の説明に合う方法はどれか。

  • ア通常のdictにオブジェクトをそのまま値として格納し、キャッシュとして使う
  • イweakrefモジュールを使い、オブジェクトへの参照を作らずに追跡する。弱参照オブジェクトが不要になると弱参照テーブルから自動的に除去されコールバック関数がトリガされる
  • ウオブジェクトをコピーしてキャッシュへ格納し、コピー元への参照は保持しない
  • エ循環参照を意図的に作ることで、ガベージコレクションが早期に働くようにする
答えと解説を見る
イweakrefモジュールを使い、オブジェクトへの参照を作らずに追跡する。弱参照オブジェクトが不要になると弱参照テーブルから自動的に除去されコールバック関数がトリガされる正解
解説

正解は「weakrefモジュールを使い、オブジェクトへの参照を作らずに追跡する。弱参照オブジェクトが不要になると弱参照テーブルから自動的に除去されコールバック関数がトリガされる」である。公式チュートリアル11.6は、Pythonがほとんどのオブジェクトを参照カウント方式で管理し、オブジェクトへの最後の参照がなくなってしばらくするとメモリが解放されると説明したうえで、オブジェクトを追跡するだけで恒久的な参照を作ってしまう問題を避けるため、weakrefモジュールがオブジェクトへの参照を作らずに追跡するツールを提供すると説明している。弱参照オブジェクトが不要になると弱参照テーブルから自動的に除去されコールバック関数がトリガされ、典型的な応用例として作成コストの大きいオブジェクトのキャッシュを挙げている。通常のdictに値として格納すると恒久的な参照になってしまい、要件の「メモリが解放されなくなるのを避けたい」に反する。

https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 11.6 弱参照)

問題番号: py3b-120
問題番号 py3b-120 の誤りを報告する
第9問 ・ 文字列テンプレート化

string.Templateを使う目的として、プレースホルダの欠落対応(safe_substitute())以外に公式チュートリアル11.2が挙げているものはどれか。

  • アテンプレートの実行速度を、f-stringやstr.format()より必ず高速にすること
  • イ複数ある出力フォーマット(XMLファイル用・プレーンテキストのレポート用・HTMLのwebレポート用など)から、同じプログラムロジックを分離すること
  • ウテンプレート内で任意のPython式を評価できるようにすること
  • エテンプレートの構文をf-stringと完全に同一にすること
答えと解説を見る
イ複数ある出力フォーマット(XMLファイル用・プレーンテキストのレポート用・HTMLのwebレポート用など)から、同じプログラムロジックを分離すること正解
解説

正解は「複数ある出力フォーマット(XMLファイル用・プレーンテキストのレポート用・HTMLのwebレポート用など)から、同じプログラムロジックを分離すること」である。公式チュートリアル11.2は、テンプレートのもう一つの用途として、複数ある出力フォーマットからのプログラムロジックの分離を挙げ、これによりXMLファイル用・プレーンテキストのレポート用・HTMLのwebレポート用のテンプレートに、同じプログラムロジックから値を埋め込めると説明している。実行速度の比較、任意のPython式の評価、f-stringとの構文の同一性については、公式チュートリアルの説明にない。

https://docs.python.org/ja/3/tutorial/stdlib2.html (Python公式チュートリアル 11.2 文字列テンプレート)

問題番号: py3b-121
問題番号 py3b-121 の誤りを報告する
第10問 ・ ログ記録

loggingモジュールで、メッセージの重要度(プライオリティ)によって送信先を振り分けたい。公式チュートリアル11.5の説明に合うものはどれか。

  • ア送信先はファイルとsys.stderrの2種類に固定されており、それ以外は選べない
  • イ選択可能な送信先にはemail・データグラム・ソケット・HTTPサーバへの送信などがあり、新たにフィルタを作成するとDEBUG・INFO・WARNING・ERROR・CRITICALのプライオリティによって異なる送信先を選択できる
  • ウinfo()とdebug()による出力は、設定を変更しなくてもデフォルトで送信される
  • エログのプライオリティを区別する機能はloggingモジュールにはなく、別途自作する必要がある
答えと解説を見る
イ選択可能な送信先にはemail・データグラム・ソケット・HTTPサーバへの送信などがあり、新たにフィルタを作成するとDEBUG・INFO・WARNING・ERROR・CRITICALのプライオリティによって異なる送信先を選択できる正解
解説

正解は「選択可能な送信先には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 ログ記録)

問題番号: py3b-122
問題番号 py3b-122 の誤りを報告する

執筆: AI資格ドリル編集部(運営者情報を見る)