Python3エンジニア認定基礎試験 第10章 標準ライブラリめぐり 予想問題と解説
Python3エンジニア認定基礎試験「第10章 標準ライブラリめぐり」の予想問題を20問収録しています。各問を解説つきで掲載し、全問は演習画面で解けます。出題は公式シラバスの範囲内です。
この章の要点
OSとファイル操作、ワイルドカードとコマンドライン引数、文字列処理と数学、インターネットアクセスと日付時刻、データ圧縮と品質管理、標準ライブラリの全体像(電池付属)などを扱う分野です。全20問(基礎11問・標準9問)を収録しています。
- OSとファイル操作
- ワイルドカードとコマンドライン引数
- 文字列処理と数学
- インターネットアクセスと日付時刻
- データ圧縮と品質管理
- 電池付属(バッテリー同梱)
情報源と編集区分
公式範囲を確認し、問題数・難易度・確認点は当サイトが集計・編集。
試験概要(公式)確認しておきたいポイント
当サイトの作問時に観察した、取り違えやすい論点です(公式の統計ではありません)。
- shutil.copyfile()とshutil.move()の混同。元ファイルを残すコピーにはcopyfile()を使い、移動するmove()や作業ディレクトリを扱うos.getcwd()・os.chdir()とは目的を分ける。
この章に関連する比較記事
混同しやすい2つの概念を並べて整理した記事です。
よくある質問
Q第10章 標準ライブラリめぐりは何問収録されていますか?
現在20問を収録しています。内訳は基礎11問・標準9問です。
Q第10章 標準ライブラリめぐりの頻出論点は何ですか?
OSとファイル操作、ワイルドカードとコマンドライン引数、文字列処理と数学、インターネットアクセスと日付時刻、データ圧縮と品質管理、標準ライブラリの全体像(電池付属)などが出題対象です(当サイト収録問題に基づく編集部集計)。
Q間違えた問題はどう復習すればいいですか?
誤答した選択肢のどこがずれていたかを解説で確認し、関連用語がある場合は用語集で定義に戻ってから再演習することをおすすめします。
data.db を archive.db へ別名でコピーし、コピー後も元ファイルを残したい。Python公式チュートリアルが日常的なファイル管理の高水準操作として示すものはどれか。
答えと解説を見る
正解は「shutil.copyfile("data.db", "archive.db")」である。公式チュートリアルは、日常的なファイルやディレクトリの管理作業ではshutilモジュールが使いやすい高水準インターフェースを提供すると説明し、shutil.copyfile()でファイルをコピーする例を示している。shutil.move()はファイルを別の場所へ移動する操作なので、元ファイルを残すという要件に合わない。os.getcwd()は現在の作業ディレクトリを取得する関数であり、ファイルをコピーしない。os.chdir()は現在の作業ディレクトリを変更する関数であり、これもコピー処理ではない。関数名だけでなく、コピー後に元ファイルを残すという操作目的を照合して判断する。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり)
ワイルドカードによるファイル検索やコマンドライン引数の扱いに関する次の説明のうち、Python公式チュートリアルの記述として正しいものはどれか。
答えと解説を見る
正解は「globモジュールは、ディレクトリのワイルドカード検索からファイルのリストを生成する関数を提供する。」である。公式チュートリアル10.2は、glob.glob('*.py')のようにワイルドカードを使ってディレクトリ内のファイル名の一覧を取得できると説明している。sysモジュールのargv属性は、コマンドラインに渡された引数をそのままリストとして格納するものであり、辞書としてオプションを解析するわけではない。argparseモジュールは、ArgumentParserでパーサーを作りadd_argument()で引数を定義しparse_args()で解析する仕組みであり、正規表現によるパターンマッチングを行うモジュールではない。sys.stderrは、標準出力がリダイレクトされた場合でも警告やエラーメッセージを読めるようにするための出力先であり、使用できなくなるという説明は正反対である。モジュールの役割を、関数名や属性名の字面だけでなく、何のために使うかという目的で照合する。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり)
次のPythonコードを実行した結果として、公式チュートリアルの記述に基づき正しいものはどれか。 import re result = re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest') print(result)
答えと解説を見る
正解は「['foot', 'fell', 'fastest']」である。公式チュートリアル10.5は、reモジュールがより高度な文字列処理のための正規表現を提供すると説明し、re.findall()を使うとfで始まる単語にマッチする正規表現パターンで、与えられた文章から['foot', 'fell', 'fastest']を取り出せる例を示している。reモジュールにはre.sub()のように文字列を置換する関数もあるが、今回のコードはre.findall()でパターンに一致した文字列をすべて集めて返すものである。'which'は先頭がwであり、'or'は先頭がoであるため、いずれもfで始まる単語にマッチするこのパターンには合致せず、一覧に含まれない。また、re.findall()はマッチした文字列のリストを返す関数であり、マッチした数を表す整数を返す関数ではないため、結果を4のような数値に置き換えるのも誤りである。関数の戻り値の型と、パターンに合致する単語だけを機械的に数え上げて照合する。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり)
インターネットアクセスや日付時刻の操作に関する次の説明のうち、Python公式チュートリアルの記述として誤っているものはどれか。
答えと解説を見る
誤っているのは「datetimeモジュールのdate.today()は、指定したタイムゾーンの標準時刻に変換した現在の日時をdatetime型で返す関数である。」である。公式チュートリアル10.8は、dt.date.today()で今日の日付を取得する例を示しているだけであり、タイムゾーンを指定して変換した現在時刻をdatetime型で返すという説明はしていない。urllib.requestは、公式チュートリアル10.7が説明するとおりURLからデータを取得するためのモジュールで、urlopen()でレスポンスを取得し1行ずつ読める。smtplibも同10.7の説明どおり、smtplib.SMTP('localhost')でサーバーへ接続し、server.sendmail()で送信、server.quit()で終了するメールを送るためのモジュールである。また、birthdayのようなdate型どうしを減算すると経過日数を表すtimedeltaオブジェクトが得られるという説明も、10.8のage = now - birthdayの例と一致する。日付を取得する関数の説明に、タイムゾーン変換のような書かれていない機能を付け加えていないか照合する。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり)
データ圧縮や品質管理のためのモジュールに関する次の説明のうち、Python公式チュートリアルの記述として正しいものはどれか。
答えと解説を見る
正解は「unittestモジュールは、unittest.TestCaseを継承したクラスにテストメソッドを書き、assertEqual()やassertRaises()で検証し、unittest.main()でコマンドラインから全テストを実行できるテストフレームワークである。」である。公式チュートリアル10.11は、unittestが別ファイルにテストコードを書く形式のテストフレームワークで、TestCaseを継承したクラスにテストメソッドを書き、assertEqual()やassertRaises()で検証し、unittest.main()でコマンドラインから全テストを実行すると説明している。zlib.compress()は、データを圧縮してzlib.decompress()で元に戻すための関数であり、暗号化して復号キーなしでは戻せなくする機能ではない。timeitは小さいコード片の実行時間を計測する簡便なツールであり、大きなコードブロックのボトルネックを判定する粒度の大きい計測はprofile・pstatsモジュールの役割であって説明が反対になっている。TestCaseを継承したクラスにテストメソッドを書く形式のテストフレームワークはunittestであり、doctestはdocstring内の実行結果を検査するツールなので、この説明はdoctestとunittestの役割を取り違えている。似た役割のモジュール名を、担当する処理の粒度や目的で区別する。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり)
データ形式とそれを扱う標準ライブラリのモジュールの組み合わせに関する次の説明のうち、Python公式チュートリアルの記述として正しいものはどれか。
答えと解説を見る
正解は「csvモジュールは、データベースや表計算で使われるCSVファイルの読み書きをサポートする。」である。公式チュートリアル10.12は、csvモジュールがデータベースや表計算で使われるCSVファイルの読み書きをサポートすると説明している。jsonモジュールは、一般的なデータ交換形式JSONのパースをサポートするモジュールであり、SQLiteデータベースライブラリのラッパーはsqlite3モジュールなので、この説明は両者の役割を取り違えている。xmlrpc.clientとxmlrpc.serverは遠隔手続き呼び出し(RPC)を簡単にするためのライブラリであり、RFC 5322に基づく電子メールメッセージを管理するのはemailパッケージの役割なので、これも説明が入れ替わっている。gettext・locale・codecsパッケージは国際化(i18n)に関する機能をサポートするものであり、XML文書の構文解析はxml.etree.ElementTreeなどの担当、JSON形式のパースはjsonモジュールの担当なので、この説明も役割を取り違えている。モジュール名が示す略称や由来だけでなく、公式チュートリアルが明記する担当データ形式で照合する。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり)
osモジュールを使うとき、公式チュートリアルがfrom os import *ではなくimport os形式を勧めている理由として正しいものはどれか。
答えと解説を見る
正解は「from os import *と書くと、動作が大きく異なる組み込み関数open()がos.open()で遮蔽されてしまうため」である。公式チュートリアル10.1は、from os import *ではなくimport os形式を使うよう勧め、そうすることで動作が大きく異なる組み込み関数open()がos.open()で遮蔽されるのを避けられると説明している。from os import *はosモジュールの名前を現在の名前空間へまとめて取り込むため、同じ名前のopenが組み込みのopen()を覆い隠してしまう。import os形式なら、osの関数はos.open()のようにモジュール名を付けて呼ぶので、組み込みのopen()はそのまま使える。関数が読み込まれない、実行速度が必ず速くなる、文法エラーになるという説明は、公式チュートリアルの記述にない。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり)
次のPythonコードの実行結果と、公式チュートリアル10.5の説明の組み合わせとして正しいものはどれか。 import re print(re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat'))
答えと解説を見る
正解は「出力は'cat in the hat'で、最小限の機能だけが必要なら読みやすくデバッグしやすい文字列メソッドの方がお勧めだと説明している」である。公式チュートリアル10.5は、re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')が'cat in the hat'を返す例を示している。パターンは、単語の境界から始まる英小文字の並びをグループとして捉え、空白に続いて同じ語(\1)が繰り返される部分に一致する。置換文字列r'\1'はその語1つ分なので、重なった'the the'が'the'になる。そのうえで公式チュートリアルは、最小限の機能だけが必要なら、読みやすくデバッグしやすい文字列メソッドの方がお勧めだと述べ、'tea for too'.replace('too', 'two')が'tea for two'を返す例を示している。元の文字列がそのまま返る、'the'がすべて消える、リストが返るという説明は、いずれも例の結果と一致しない。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり)
公式チュートリアル10.6の数学関連モジュールの説明として正しいものはどれか。
答えと解説を見る
正解は「statisticsモジュールは、数値データの平均・中央値・分散などの基礎的な統計的特性を計算すると説明されている」である。公式チュートリアル10.6は、statisticsモジュールが数値データの基礎的な統計的特性(平均、中央値、分散等)を計算すると説明し、statistics.mean()・statistics.median()・statistics.variance()の例を示している。random.sample(range(100), 10)の例には「重複なしでサンプリング」というコメントが付いており、重複を許す取り出し方ではない。mathモジュールは浮動小数点演算のためのC言語ライブラリ関数にアクセスする手段として紹介されており、乱数を使った要素選択はrandomモジュールの役割である。行列の積や逆行列の計算は、公式チュートリアル10.6のstatisticsモジュールの説明にない。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり)
公式チュートリアル10.9の例で、s = b'witch which has which witches wrist watch' に対して t = zlib.compress(s) を実行したあと zlib.decompress(t) を実行した。結果として正しいものはどれか。
答えと解説を見る
正解は「元のバイト列 b'witch which has which witches wrist watch' と同じ値が返る」である。公式チュートリアル10.9は、一般的なデータアーカイブと圧縮形式がzlib・gzip・bz2・lzma・zipfile・tarfileなどのモジュールで直接的にサポートされると説明し、zlibの例を示している。例では、len(s)が41のバイト列sをzlib.compress(s)で圧縮したtの長さは37で、zlib.decompress(t)の出力は元のsと同じb'witch which has which witches wrist watch'である。長さの37はlen(t)で調べた値で、decompressの戻り値ではない。CRC32のチェックサムは、同じ例の中でzlib.crc32(s)という別の関数で求めている。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり)
次のスクリプトを top.py として保存し、コマンドラインで python top.py --lines=5 alpha.txt beta.txt と実行したとき、公式チュートリアルの記述に基づき正しいものはどれか。 import argparse parser = argparse.ArgumentParser( prog='top', description='Show top lines from each file') parser.add_argument('filenames', nargs='+') parser.add_argument('-l', '--lines', type=int, default=10) args = parser.parse_args() print(args)
答えと解説を見る
正解は「args.lines は 5 になり、args.filenames は ['alpha.txt', 'beta.txt'] になる」である。公式チュートリアル10.3は、argparse モジュールがコマンドライン引数を処理するためのより洗練された機構を提供するとし、ArgumentParser でパーサーを作り、add_argument() で引数を定義し、parse_args() で解析すると説明している。公式の例では、python top.py --lines=5 alpha.txt beta.txt を実行すると、args.lines が 5、args.filenames が ['alpha.txt', 'beta.txt'] に設定される。--lines=5 はオプションとして解釈され、type=int の指定によって整数の 5 になる。default=10 は --lines が指定されなかったときの値である。nargs='+' により、ファイル名は 1 個以上がリストとして集められる。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 10.3 コマンドライン引数 )
sys モジュールの stderr 属性について、公式チュートリアルが説明している便利な点として正しいものはどれか。
答えと解説を見る
正解は「stdout がリダイレクトされた場合でも、警告やエラーメッセージを読めるようにできる」である。公式チュートリアル10.4は、sys モジュールには stdin・stdout・stderr を表す属性があり、stderr は、警告やエラーメッセージを出力して、stdout がリダイレクトされた場合でも読めるようにするために便利だと説明している。公式の例では、sys.stderr.write() で警告メッセージを書き出している。スクリプトを終了させるもっとも直接的な方法は sys.exit() であり、stderr への書き込みでは終了しない。stdin・stdout・stderr の 3 つとも sys モジュールの属性として存在する。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 10.4 エラー出力のリダイレクトとプログラムの終了 )
次のコードについて、公式チュートリアル10.8の説明に基づき正しいものはどれか。 import datetime as dt now = dt.date.today() birthday = dt.date(1964, 7, 31) age = now - birthday print(age.days)
答えと解説を見る
正解は「日付同士の減算で得られた、birthday から now までの経過日数が表示される」である。公式チュートリアル10.8は、datetime モジュールが日付や時刻を操作するクラスを提供し、日付・時刻の算術もサポートすると説明している。公式の例では、dt.date.today() で今日の日付を取得し、birthday = dt.date(1964, 7, 31) との差を age = now - birthday で求めると、age.days で経過日数が得られる(公式の例では 14368)。結果は年齢の歳数ではなく日数で、誕生日までの残り日数や大小の比較結果でもない。日付同士の減算では、2 つの日付の間の日数を持つ値が得られる。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 10.8 日付と時間 )
処理時間の計測ツールについて、公式チュートリアル10.10の記述として正しいものはどれか。
答えと解説を見る
正解は「timeit は小さなコード片の実行時間を計測し、profile と pstats はより大きなコードブロックで処理時間のボトルネックとなる部分を判定する」である。公式チュートリアル10.10は、timeit モジュールが小さいコード片の実行時間を計測するための簡便なツールを提供すると説明し、Timer(コード文字列, セットアップ文字列).timeit() で計測する例を示している。そのうえで、timeit では小さい粒度を提供しているのに対し、profile や pstats モジュールではより大きなコードブロックにおいて律速となる(処理時間のボトルネックとなる)部分を判定するためのツールを提供していると述べている。docstring のテストを評価するのは doctest モジュールである。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 10.10 パフォーマンスの計測 )
テストを書いて品質を保つための doctest と unittest の説明として、公式チュートリアル10.11の記述に基づき正しいものはどれか。
答えと解説を見る
正解は「doctest は docstring に埋め込んだ呼び出し例と結果を評価し、unittest はより網羅的なテストセットを別のファイルで管理できる」である。公式チュートリアル10.11は、doctest モジュールがプログラムの docstring に埋め込まれたテストを評価するためのツールを提供し、典型的な呼び出し例とその結果を docstring に貼り付けるだけでテストが作れると説明している。doctest.testmod() で docstring に埋め込まれたテストを自動的に評価する。一方、unittest モジュールは doctest ほど気楽に使えるものではないが、より網羅的なテストセットを別のファイルで管理できる。unittest では unittest.TestCase を継承したクラスにテストメソッドを書き、assertEqual() や assertRaises() で検証し、unittest.main() で全テストを実行する。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 10.11 品質管理 )
random モジュールと statistics モジュールの説明として、公式チュートリアル10.6の記述に基づき正しいものはどれか。
答えと解説を見る
正解は「random.sample(range(100), 10) は、range(100) から重複なしで 10 個の要素を選び出す」である。公式チュートリアル10.6は、random モジュールが乱数に基づく要素選択のツールを提供すると説明し、random.choice()・random.sample()・random.random()・random.randrange() の例を示している。公式の例では random.sample(range(100), 10) に「重複なしでサンプリング」というコメントが付いている。random.random() は [0.0, 1.0) の区間内のランダムな float を返す。statistics モジュールは平均・中央値・分散などの基礎的な統計的特性を計算するモジュールで、平均は statistics.mean()、中央値は statistics.median()、分散は statistics.variance() で求める。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 10.6 数学 )
プログラムの中で、現在の作業ディレクトリを調べる関数と、現在の作業ディレクトリを変更する関数の組み合わせとして、Python公式チュートリアルの記述に合うものはどれか。
答えと解説を見る
正解は「os.getcwd() で調べ、os.chdir() で変更する」である。公式チュートリアル10.1は、os モジュールがオペレーティングシステムと対話する多くの関数を提供するとして、os.getcwd() で現在の作業ディレクトリを取得し、os.chdir() で現在の作業ディレクトリを変更する例を示している。getcwd は get current working directory、chdir は change directory と覚えると、役割を取り違えにくい。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり 10.1 OSへのインターフェース)
ファイル report.txt を別のディレクトリ backup へ移動し、元の場所には残さないようにしたい。日常的なファイルやディレクトリの管理作業で使いやすい高水準インターフェースとして、Python公式チュートリアルが紹介している方法はどれか。
答えと解説を見る
正解は「shutil.move() を使う」である。公式チュートリアル10.1は、日常的なファイルやディレクトリの管理作業では、shutil モジュールが使いやすい高水準インターフェースを提供するとして、shutil.copyfile() によるコピーと shutil.move() による移動の例を示している。設問は元の場所には残さない移動なので、shutil.move() が当たる。コピーは元のファイルが残る点が異なる。コピーと移動を取り違えると、元のファイルが残るか残らないかが変わるため、用途に合う関数を選ぶ必要がある。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり 10.1 OSへのインターフェース)
次のコードを実行したときの結果と、math モジュールについての公式チュートリアルの説明の組み合わせとして、正しいものはどれか。 import math print(math.log(1024, 2))
答えと解説を見る
正解は「10.0 が表示される。math モジュールは、浮動小数点演算のための C 言語ライブラリ関数へのアクセスを提供する」である。公式チュートリアル10.6は、math モジュールが浮動小数点演算のための C 言語ライブラリ関数へのアクセスを提供すると説明し、math.cos(math.pi / 4) や math.log(1024, 2) の例を示している。math.log(1024, 2) は、2 を底とする 1024 の対数で、2 の10乗が 1024 なので 10.0 になる。結果は浮動小数点数で返る。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり 10.6 数学)
文字列から単語の置き換えをしたい。必要な機能がごく簡単なものだけのとき、re モジュールと文字列メソッドのどちらを使うかについて、Python公式チュートリアルの記述に合うものはどれか。
答えと解説を見る
正解は「最小限の機能だけが必要なら、読みやすくデバッグしやすい文字列メソッドの方がお勧めである」である。公式チュートリアル10.5は、re モジュールがより高度な文字列処理のための正規表現を提供すると説明したうえで、最小限の機能だけが必要なら、読みやすくデバッグしやすい文字列メソッドの方がお勧めだと述べている。高度な照合や置換が必要なときは re、単純な処理なら文字列メソッド、と使い分ける。単純な置き換えや検索のような処理では、文字列メソッドで足りる場合が多く、必要になってから re を検討するという順序で考えるとよい。
https://docs.python.org/ja/3/tutorial/stdlib.html (Python公式チュートリアル 第10章 標準ライブラリめぐり 10.5 文字列のパターンマッチング)