本文へ移動

Python 3 エンジニア認定基礎試験 想定問題集

クラスと標準ライブラリの要点整理と想定問題

公式の出題範囲の「9章 クラス/10章 標準ライブラリめぐり/11章 標準ライブラリめぐり─PartII」にあたる分野です。まず要点整理で全体をつかみ、下の演習で 54 問を 1 問ずつ解けます。答えると A〜D すべての解説が出ます。

この分野の小項目

  • 9.1・9.2・9.2.1 名前とオブジェクト・スコープと名前空間(5 問) 複数の名前が同じオブジェクトを指せる(別名付け)。名前空間は名前からオブジェクトへの対応で、組み込み・モジュールのグローバル・関数のローカルがあり、作られる時期と寿命が違う。名前は内側のスコープから探す。global 文は名前をグローバルに、nonlocal 文は外側の関数のスコープに結び付ける。宣言しないまま関数内で代入すると新しいローカル変数ができる。
  • 9.3.1〜9.3.3 クラス定義・クラスオブジェクト・インスタンス(3 問) class 文でクラスを定義すると新しい名前空間ができる。クラスオブジェクトは属性参照とインスタンス化に使え、関数のように呼ぶとインスタンスを作る。__init__() を定義するとインスタンス化の直後に呼ばれ、引数を渡せる。データ属性は代入したときに作られ、宣言は不要。
  • 9.3.4・9.3.5・9.4 メソッドとクラス変数・インスタンス変数(4 問) x.f() は MyClass.f(x) と同じで、インスタンスが第 1 引数に渡る(慣習で self と呼ぶ)。メソッドオブジェクトは保存して後で呼べる。クラス変数は全インスタンスで共有され、インスタンス変数は各インスタンス固有。クラス変数にリストなど可変オブジェクトを置くと全インスタンスで共有されてしまう。同名の属性ではインスタンス側が優先される。
  • 9.5・9.5.1・9.6 継承・多重継承・プライベート変数(4 問) class 派生クラス(基底クラス): で継承し、属性が見つからなければ基底クラスを探す。派生クラスはメソッドをオーバーライドでき、基底クラスのメソッドは 基底クラス名.メソッド(self, ...) で呼べる。isinstance() と issubclass() で型や継承関係を調べる。多重継承では属性を深さ優先・左から右に探すのが基本で、super() と協調的な呼び出しのためにメソッド解決順序が動的に変わる。_ で始まる名前は非公開扱いの慣習、__spam のような名前は名前修飾(_クラス名__spam)される。
  • 9.7〜9.10 イテレータ・ジェネレータ・ジェネレータ式(4 問) for 文は iter() でイテレータを得て、__next__() で要素を 1 つずつ取り出し、終わると StopIteration で止まる。クラスに __iter__() と __next__() を定義すると反復可能にできる。yield を使うジェネレータ関数は __iter__()・__next__() を自動で作り、ローカル変数と実行状態を保つ。ジェネレータ式は内包表記に似た丸括弧の式で、リスト内包表記より省メモリ。データをまとめる型には dataclasses も使える(9.7)。
  • 10.1・10.2 OS インターフェースとファイルのワイルドカード(os・shutil・glob)(3 問) os モジュールは OS と対話する関数を提供し、os.open() が組み込みの open() を隠さないよう from os import * ではなく import os を使う。dir() と help() は対話的に調べるのに便利。日常のファイル・ディレクトリ管理には高水準の shutil、ワイルドカードでのファイル一覧には glob を使う。
  • 10.3・10.4 コマンドライン引数・エラー出力・終了(sys・argparse)(4 問) コマンドライン引数は sys.argv にリストで入り、argparse でより高度に処理できる。sys には stdin・stdout・stderr 属性があり、stderr は stdout をリダイレクトしても表示される警告やエラーの出力に使う。スクリプトを終了させる最も直接的な方法は sys.exit()。
  • 10.5 文字列のパターンマッチ(re)(3 問) re モジュールは高度な文字列処理のための正規表現を提供する(例: re.findall()・re.sub())。単純な処理なら文字列メソッド(str.replace() など)が読みやすくデバッグしやすいので推奨される。
  • 10.6 数学(math・random・statistics)(3 問) math は浮動小数点演算のための C ライブラリ関数へのアクセスを提供する。random は無作為な選択(choice()・sample()・random()・randrange())、statistics は平均・中央値・分散などの基本的な統計量を求める。数値計算のより高度な機能は SciPy などのサードパーティ製品にある。
  • 10.7〜10.10 インターネット・日付と時刻・データ圧縮・性能計測(4 問) インターネットからのデータ取得には urllib.request、メール送信には smtplib。datetime は日付と時刻の操作、書式化、タイムゾーン対応のオブジェクトを提供する。zlib・gzip・bz2・lzma・zipfile・tarfile でデータの圧縮と展開ができる。timeit は小さなコード片、profile と pstats は大きなコードの性能計測に使う。
  • 10.11・10.12 品質管理とバッテリー同梱(doctest・unittest ほか)(3 問) doctest は docstring に書いた例を実行して結果を検証し、unittest は別ファイルにより網羅的なテストを書ける。Python は「バッテリー同梱」の考え方で、xmlrpc.client/xmlrpc.server、email、json、csv、sqlite3、gettext・locale・codecs による国際化など多くの機能を標準で備える。
  • 11.1・11.2 出力のフォーマットと文字列テンプレート(reprlib・pprint・textwrap・locale・string.Template)(5 問) reprlib は大きな入れ子のコンテナを省略して表示する repr()、pprint は構造を見やすく整形して表示、textwrap は段落を指定した幅に折り返し、locale は地域ごとの書式を使う。string.Template は $ を使った置換で、substitute() は値が無いと KeyError、safe_substitute() はそのまま残す。
  • 11.3〜11.6 バイナリデータ・マルチスレッド・ログ・弱参照(struct・threading・logging・weakref)(4 問) struct の pack()・unpack() で可変長のバイナリレコードを扱う。threading はバックグラウンドでの並行処理を行い、スレッド間の調整には queue モジュールでの受け渡しが勧められる。logging は柔軟なログ出力を提供し、既定では info() と debug() の出力を抑え、標準エラー出力に送る。weakref は参照を増やさずにオブジェクトを追跡する。
  • 11.7・11.8 リスト操作のツールと 10 進浮動小数点演算(array・collections・bisect・heapq・decimal)(5 問) array は同じ型の数値をコンパクトに保持する配列、collections.deque は両端の追加と取り出しが速い、bisect はソート済みリストの操作、heapq はリストを使ったヒープで最小の要素を取り出す。decimal の Decimal 型は 10 進の浮動小数点演算を行い、金融の計算など正確な 10 進表現や丸めの制御が必要な用途に向く。

要点整理

名前とオブジェクト・スコープと名前空間

名前の探し方は「内側から外側へ」の 4 段

名前空間は、名前からオブジェクトへの対応付けです。組み込みの名前、モジュールのグローバルな名前、関数を呼んだときのローカルな名前があり、作られる時期と寿命が違います。組み込みの名前空間はインタープリタの起動時に作られて消えません。関数のローカルな名前空間は呼び出しのたびに作られ、戻ると忘れられます。

修飾なしの名前は、ローカル→外側の関数→グローバル→組み込みの順に探します。宣言なしに関数の中で代入すると、外側の変数は変わらず、新しいローカル変数ができます。外側の関数の変数を書き換えるにはnonlocal 文、モジュールの変数を書き換えるにはglobal 文を使います。

代入はデータをコピーせず、名前をオブジェクトに結び付けるだけです。b = a のあと b.append() をすると、同じリストを指す a からも変更が見えます。イミュータブルな数値や文字列では気になりませんが、ミュータブルなリストや辞書では注意が要ります。

探す順スコープ書き換えるときの宣言
1ローカル(いまの関数)不要(代入するとローカルに作られる)
2外側の関数nonlocal 文
3グローバル(モジュール)global 文
4組み込み(abs() など)書き換えない

出典: Python チュートリアル 9. クラス(9.1 名前とオブジェクトについて)/Python チュートリアル 9. クラス(9.2 Python のスコープと名前空間)/Python チュートリアル 9. クラス(9.2.1 スコープと名前空間の例)

クラス定義・クラスオブジェクト・インスタンス

class 文でクラスオブジェクト、呼び出しでインスタンス

クラスを定義する class 文の本体に入ると新しい名前空間ができ、本体の終わりまで実行するとクラスオブジェクトが作られてクラス名に結び付けられます。クラスオブジェクトで行える操作は、属性参照(MyClass.i など)とインスタンス化の 2 つです。

インスタンス化は関数のように書き、x = MyClass() で新しいインスタンスができます。__init__() を定義しておくと、インスタンス化の直後に自動で呼ばれます。Point(2, 5) のように渡した引数は __init__() に渡ります。

インスタンスのデータ属性は宣言が要りません。ローカル変数と同じく、最初に代入したときに作られます。del で取り除くこともできます。

出典: Python チュートリアル 9. クラス(9.3.1 クラス定義の構文)/Python チュートリアル 9. クラス(9.3.2 クラスオブジェクト)/Python チュートリアル 9. クラス(9.3.3 インスタンスオブジェクト)

メソッドとクラス変数・インスタンス変数

メソッドの第 1 引数とクラス変数の落とし穴

メソッドの呼び出し x.f() は MyClass.f(x) と同じです。インスタンスが関数の第 1 引数として自動で渡ります。この引数を self と呼ぶのは慣習で、Python にとって特別な意味はありません。x.f はメソッドオブジェクトなので、変数に入れて後で呼ぶこともできます。

クラス変数は全インスタンスで共有され、インスタンス変数はインスタンスごとに持ちます。クラス変数にリストを置いて append() すると、全インスタンスが 1 つのリストを共有してしまいます。インスタンスごとのリストは __init__() の中で self.tricks = [] のように作ります。

インスタンスとクラスに同じ名前の属性があると、インスタンス側が優先されます。a.color = 'blue' はクラス変数を書き換えず、a だけに属性を作ります。

書き方置き場所共有の範囲
class 本体で tricks = []クラス変数そのクラスの全インスタンスで共有
__init__() で self.tricks = []インスタンス変数インスタンスごとに別
a.color = 'blue'(後から代入)a のインスタンス変数a だけ(同名ならクラス変数より優先)

出典: Python チュートリアル 9. クラス(9.3.4 メソッドオブジェクト)/Python チュートリアル 9. クラス(9.3.5 クラス変数とインスタンス変数)/Python チュートリアル 9. クラス(9.4 いろいろな注意点)

継承・多重継承・プライベート変数

継承・多重継承・名前修飾

class 派生クラス(基底クラス): と書くと継承になります。属性がクラスに無ければ基底クラスを探します。派生クラスは基底クラスのメソッドをオーバーライドでき、Python のメソッドは事実上すべて virtual です。基底クラスの中から self.hello() を呼んでも、派生クラスで上書きした hello() が使われます。基底クラスのメソッドを直接呼ぶときは 基底クラス名.メソッド名(self, 引数) と書きます。

isinstance() はインスタンスの型を、issubclass() はクラスの継承関係を調べます。bool は int のサブクラスなので issubclass(bool, int) は True、float は int のサブクラスではないので issubclass(float, int) は False です。

多重継承の属性探しは、基本は深さ優先・左から右です。ただし同じ祖先に複数の経路でたどり着くダイヤモンド継承では、祖先を一度だけたどる順序(メソッド解決順序)を動的に決めます。協調的な super() の呼び出しのためでもあります。D(B, C) で B と C が同じ A を継承するとき、順序は D→B→C→A です。

_spam のように _ で始まる名前は非公開として扱う慣習です。__spam のように先頭に _ が 2 つ以上、末尾が 1 つ以下の名前は、クラスの中で _クラス名__spam に置き換えられます(名前修飾)。目的は事故の防止で、置き換え後の名前なら外からも読めます。

出典: Python チュートリアル 9. クラス(9.5 継承)/Python チュートリアル 9. クラス(9.5.1 多重継承)/Python チュートリアル 9. クラス(9.6 プライベート変数)

イテレータ・ジェネレータ・ジェネレータ式

イテレータとジェネレータは「1 つずつ・1 回きり」

for 文は裏で iter() を呼んでイテレータを得て、__next__() で要素を 1 つずつ取り出します。要素が尽きると StopIteration が送出され、ループが終わります。next() で直接呼ぶこともできます。自作のクラスは、__next__() を持つオブジェクトを返す __iter__() を定義すると反復できるようになります。

ジェネレータは yield を使う関数で、__iter__() と __next__() が自動で作られます。呼び出しの間でローカル変数と実行状態が保存され、終わると自動で StopIteration を送出します。

ジェネレータ式は、リスト内包表記の角括弧を丸括弧にした書き方です。関数の唯一の引数なら sum(i * i for i in range(4)) のように括弧を重ねずに書けます。同じ内容のリストより省メモリですが、一度使い切ると空になります。

名前付きのデータ項目をまとめる型には、現行のチュートリアルでは dataclasses を勧めています。第 4 版(3.9)では空のクラスに属性を代入する例です。

出典: Python チュートリアル 9. クラス(9.8 イテレータ)/Python チュートリアル 9. クラス(9.9 ジェネレータ)/Python チュートリアル 9. クラス(9.10 ジェネレータ式)

OS インターフェースとファイルのワイルドカード(os・shutil・glob)

os・shutil・glob の使い分け

os は OS と対話する関数の集まりです。from os import * ではなく import os と書きます。* で読み込むと、動きの大きく違う os.open() が組み込みの open() を隠してしまうからです。大きなモジュールを調べるときは dir() と help() が便利です。

日常のファイルやディレクトリの管理には、高水準の shutil(copyfile()・move() など)を使います。ワイルドカードでファイル名の一覧を作るには glob の glob('*.py') を使います。

出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.1 オペレーティングシステムとのインターフェース)/Python チュートリアル 10. 標準ライブラリをひとめぐり(10.2 ファイルのワイルドカード)

コマンドライン引数・エラー出力・終了(sys・argparse)

sys で引数・エラー出力・終了を扱う

コマンドライン引数は sys.argv にリストで入ります。先頭はスクリプト名で、python demo.py one two three なら ['demo.py', 'one', 'two', 'three'] です。オプションや既定値を扱うなら argparse を使います。

sys.stderr は警告やエラーの出力に使います。stdout をファイルにリダイレクトしても、stderr の出力は画面で読めます。スクリプトを終わらせる最も直接的な方法は sys.exit() です。

出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.3 コマンドライン引数)/Python チュートリアル 10. 標準ライブラリをひとめぐり(10.4 エラー出力のリダイレクトとプログラムの終了)

文字列のパターンマッチ(re)

re は複雑なときだけ、単純なら文字列メソッド

re は正規表現による高度な文字列処理を提供します。findall() は一致したものをすべてリストで返し、sub() は一致した部分を置き換えます。パターンは \b などを含むので raw 文字列(r'...')で書くのが基本です。

機能が最小限で足りるなら、読みやすくデバッグしやすい文字列メソッド('tea for too'.replace('too', 'two') など)が勧められています。

出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.5 文字列のパターンマッチ)

数学(math・random・statistics)

math・random・statistics

math は浮動小数点演算のための C ライブラリ関数を使えるようにします。math.log(1024, 2) は 10.0 です。random は無作為な選択の道具で、choice() は 1 つ、sample() は重複なしで複数を選び、random() は 0 以上 1 未満の小数、randrange() は範囲の整数を返します。

statistics は平均(mean())・中央値(median())・分散(variance())などを求めます。より高度な数値計算は SciPy などのサードパーティ製品にあります。

出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.6 数学)

インターネット・日付と時刻・データ圧縮・性能計測

インターネット・日付・圧縮・計測

URL からのデータ取得は urllib.request、メール送信は smtplib が最も単純なモジュールです。datetime は日付と時刻を扱い、date どうしの引き算で日数が分かります。タイムゾーンを扱えるオブジェクトもあります。

zlib・gzip・bz2・lzma・zipfile・tarfile で圧縮と展開ができます。性能の計測は、小さなコード片なら timeit、大きなコードで律速となる部分を探すなら profile と pstats を使います。

やりたいことモジュール
URL からデータを取るurllib.request
メールを送るsmtplib
日付の計算・書式化datetime
データを圧縮・展開するzlib・gzip・bz2・lzma・zipfile・tarfile
小さなコード片の速さを比べるtimeit
大きなプログラムの遅い所を探すprofile・pstats

出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.7 インターネットへのアクセス)/Python チュートリアル 10. 標準ライブラリをひとめぐり(10.8 日付と時刻)/Python チュートリアル 10. 標準ライブラリをひとめぐり(10.9 データ圧縮)/Python チュートリアル 10. 標準ライブラリをひとめぐり(10.10 パフォーマンスの計測)

品質管理とバッテリー同梱(doctest・unittest ほか)

doctest と unittest、そしてバッテリー同梱

doctest は docstring に貼った呼び出し例を実行し、結果が書かれたとおりかを確かめます。使用例がそのままテストになります。unittest は doctest ほど気軽ではありませんが、別ファイルでより網羅的なテストを管理できます。TestCase を継承し、assertEqual() や assertRaises() で確かめます。

Python は「バッテリー同梱」の考え方で多くの機能を標準で備えます。標準ライブラリには、遠隔手続き呼び出しの xmlrpc.client と xmlrpc.server、メールを組み立てる email パッケージがあります。データの受け渡しには json・csv・XML の処理、保存には SQLite を使う sqlite3、国際化には gettext・locale・codecs があります。

出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.11 品質管理)/Python チュートリアル 10. 標準ライブラリをひとめぐり(10.12 バッテリー同梱)

出力のフォーマットと文字列テンプレート(reprlib・pprint・textwrap・locale・string.Template)

出力を整えるモジュールと文字列テンプレート

reprlib は大きなコンテナを省略して表示し、pprint は構造に改行やインデントを入れて見やすくし、textwrap は段落を指定の幅に折り返し、locale は地域ごとの書式(桁区切りなど)を使います。 桁区切りの例の関数は、第 4 版(3.9)では format()(3.12 で削除)、現行では format_string() です。

string.Template は $ と識別子でプレースホルダを書きます。後ろに英数字を続けるときは ${name} と波括弧で囲み、$ 自体は $$ と書きます。substitute() は値が無いと KeyError を送出し、safe_substitute() はプレースホルダをそのまま残します。区切り文字は Template のサブクラスで変えられます。

やりたいこと使うもの
長いリストや集合を ... で省略するreprlib の repr()
入れ子のデータを改行・インデントで整えるpprint
英文を決まった幅で折り返すtextwrap の fill()
数値に地域の桁区切りを入れるlocale の format_string()(第 4 版は format())
値が欠けていても置換を続けるTemplate の safe_substitute()

出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.1 出力のフォーマット)/Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.2 文字列テンプレート)

バイナリデータ・マルチスレッド・ログ・弱参照(struct・threading・logging・weakref)

struct・threading・logging・weakref

struct の pack() と unpack() は可変長のバイナリレコードを扱います。'H' は 2 バイト、'I' は 4 バイトの符号無し整数、'<' は標準サイズでリトルエンディアンを表します。

threading はバックグラウンドで別のタスクを動かします。スレッド間の調整は難しいので、リソースへのアクセスを 1 つのスレッドに集め、queue で依頼を送る作りが勧められています。

logging は柔軟なログ記録の仕組みです。既定では info() と debug() の出力は抑えられ、出力は標準エラーに送られます。weakref は参照を作らずにオブジェクトを追跡し、キャッシュのせいでオブジェクトが解放されない問題を避けられます。メモリの解放は参照カウントとガベージコレクションで行われます。

出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.3 バイナリデータレコードのレイアウトの操作)/Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.4 マルチスレッディング)/Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.5 ログ記録)/Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.6 弱参照)

リスト操作のツールと 10 進浮動小数点演算(array・collections・bisect・heapq・decimal)

リスト以外の入れ物と 10 進の計算

array は同じ型の数値をリストよりコンパクトに持ちます。collections.deque は追加と左端からの取り出し(popleft())が速く、キューや幅優先探索に向きます。bisect の insort() はソート済みのリストの順序を保って挿入し、heapq は最小の値を常に位置 0 に置くヒープを通常のリストで実現します。

decimal の Decimal は 10 進の浮動小数点演算を行います。金融の計算、精度や丸めの制御、手計算と同じ結果が欲しい場面に向きます。Decimal('0.70') * Decimal('1.05') は 0.7350 で、2 桁に丸めると 0.74 です。float で同じ計算をすると 0.73 になります。0.1 を 3 回足して 0.3 と比べる等値テストも、Decimal なら True になります。

道具得意なこと代表的な操作
array同じ型の数値を省メモリで持つarray('H', [...])
collections.deque両端の出し入れが速いappend()・popleft()
bisectソート済みのリストの順序を保つinsort()
heapq最小の値を繰り返し取り出すheapify()・heappush()・heappop()
decimal10 進で正確に計算・丸めるDecimal('0.70')・round()

出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.7 リストを操作するツール)/Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.8 10 進浮動小数点演算)

演習(54 問)

結果はこのブラウザに保存され、ハブの「自分の成績」と弱点モードに使われます。

第 1 問 / 54 問

問題を読み込んでいます…

全問と解説の一覧

正解と解説は折りたたんであります。先に自分で考えてから開いてください。

全 54 問

名前とオブジェクト・スコープと名前空間

  1. 関数の中で修飾なしの名前 x を参照した。Python が最初に x を探すスコープはどれ?

    A. その関数自身のローカルなスコープ B. 組み込みの名前を持つスコープ C. モジュールのグローバルなスコープ D. 外側にある関数のスコープ

    答えと解説

    正解: A 【A(正解)】 ? いま実行している関数の中で作られた名前の集まりです。 最も内側のローカルなスコープが最初に探される。見つからなければ外側の関数、グローバル、組み込みの順に進む。 【B(不正解)】 ? abs() や組み込み例外などの名前が入った領域です。 組み込みのスコープは一番外側で、最後に探される。 【C(不正解)】 ? そのファイル(モジュール)の最上位で定義した名前の領域です。 グローバルは最後から 2 番目に探される。ローカルより先には探さない。 【D(不正解)】 ? 関数を入れ子にしたとき、包んでいる側の関数の名前の領域です。 外側の関数のスコープはローカルの次に探される。最初ではない。

    出典: Python チュートリアル 9. クラス(9.2 Python のスコープと名前空間)

    この問題へのリンク
  2. 次のコードを実行すると何が表示される? def outer(): x = 1 def inner(): nonlocal x x = 2 inner() print(x) outer()

    A. 1 B. 2 C. None D. NameError になる

    答えと解説

    正解: B 【A(不正解)】 ? inner() の代入が outer() の x に影響しなかった場合の値です。 nonlocal が無ければ 1 になるが、このコードでは宣言しているので書き換わる。 【B(正解)】 ? inner() の中の代入が outer() の x に届いた場合の値です。 nonlocal 文で x を外側の関数の変数に結び付けているので、inner() の代入が outer() の x を 2 に変える。 【C(不正解)】 ? 値が何も入っていないことを表す特別な値です。 x には 1、続いて 2 が代入されており、None になる場面は無い。 【D(不正解)】 ? 名前が見つからないときに出る例外です。 x は outer() のローカル変数として定義済みなので、名前が見つからない例外にはならない。

    出典: Python チュートリアル 9. クラス(9.2.1 スコープと名前空間の例)

    この問題へのリンク
  3. 次のコードを実行すると何が表示される? x = 5 def change(): x = 10 change() print(x)

    A. 10 B. None C. 5 D. UnboundLocalError になる

    答えと解説

    正解: C 【A(不正解)】 ? 関数の中で代入した値です。 global 文で宣言していないので、関数内の代入はグローバルの x を変えない。 【B(不正解)】 ? 値が無いことを表す特別な値です。 print(x) はグローバルの x を表示し、その値は 5 である。 【C(正解)】 ? モジュールの最上位で代入した値です。 関数内の x = 10 は、最も内側のスコープに新しいローカル変数を作るだけ。グローバルの x は 5 のまま。 【D(不正解)】 ? 代入前のローカル変数を参照したときの例外です。 関数内では x に代入しているだけで、代入前に読んではいない。例外は起きない。

    出典: Python チュートリアル 9. クラス(9.2 Python のスコープと名前空間)

    この問題へのリンク
  4. 次のコードを実行すると何が表示される? a = [1, 2] b = a b.append(3) print(a)

    A. [1, 2] B. [3] C. TypeError になる D. [1, 2, 3]

    答えと解説

    正解: D 【A(不正解)】 ? b がリストの複製を持っていた場合の結果です。 代入はデータをコピーしない。ミュータブルなリストを共有しているので a も変わる。 【B(不正解)】 ? 追加した要素だけが残った場合の結果です。 append() は末尾に 1 つ足すだけで、既存の要素は消えない。 【C(不正解)】 ? 型が合わない操作をしたときの例外です。 リストへの append() は正しい操作で、例外は起きない。 【D(正解)】 ? a と b が同じリストを指していた場合の結果です。 b = a はコピーを作らず、同じオブジェクトに 2 つ目の名前を付ける(別名)。b 経由の変更は a からも見える。

    出典: Python チュートリアル 9. クラス(9.1 名前とオブジェクトについて)/Python チュートリアル 9. クラス(9.2 Python のスコープと名前空間)

    この問題へのリンク
  5. モジュールの変数 count を関数内で count += 1 と増やしたら、UnboundLocalError になった。直し方として合うものは?

    A. 関数の先頭に nonlocal count と書く B. 関数の外で count = 0 をもう一度書く C. 関数の先頭に global count と書く D. 関数の先頭に del count と書く

    答えと解説

    正解: C 【A(不正解)】 ? 外側の関数の変数に結び付ける宣言です。 nonlocal 文は外側の関数の変数用。外側の関数が無いので SyntaxError になる。 【B(不正解)】 ? グローバルの値を代入し直す操作です。 関数内の count は代入があるためローカル変数として扱われる。外で代入し直しても変わらない。 【C(正解)】 ? 名前をモジュールのグローバルな名前に結び付ける宣言です。 global 文で宣言すると、関数内の参照と代入がグローバルの count に対して行われる。 【D(不正解)】 ? 名前の束縛を取り除く文です。 関数内の del はローカルの束縛を消そうとする。グローバルの count は更新できない。

    出典: Python チュートリアル 9. クラス(9.2 Python のスコープと名前空間)

    この問題へのリンク

クラス定義・クラスオブジェクト・インスタンス

  1. クラスを定義する class 文の本体を最後まで実行し終えると、何が作られてクラス名に結び付けられる?

    A. クラスオブジェクト B. インスタンス C. モジュール D. メソッドオブジェクト

    答えと解説

    正解: A 【A(正解)】 ? クラス定義の名前空間を包むオブジェクトです。 クラス定義から普通に抜けるとクラスオブジェクトが作られ、ヘッダに書いたクラス名に結び付けられる。 【B(不正解)】 ? クラスを呼び出して作る個々のオブジェクトです。 インスタンスはクラスオブジェクトを関数のように呼んだときに作られる。class 文だけでは作られない。 【C(不正解)】 ? 1 つの .py ファイルに対応するオブジェクトです。 モジュールはファイルを import したときにできるもので、class 文の結果ではない。 【D(不正解)】 ? インスタンスと関数を組にしたオブジェクトです。 メソッドオブジェクトは x.f のようにインスタンスから関数を参照したときにできる。

    出典: Python チュートリアル 9. クラス(9.3.1 クラス定義の構文)

    この問題へのリンク
  2. 次のコードを実行すると何が表示される? class Point: def __init__(self, x, y): self.x = x self.y = y p = Point(2, 5) print(p.x + p.y)

    A. (2, 5) B. 25 C. TypeError になる D. 7

    答えと解説

    正解: D 【A(不正解)】 ? 2 つの値をまとめたタプルの表示です。 p.x + p.y は整数どうしの足し算で、タプルにはならない。 【B(不正解)】 ? 2 と 5 を文字としてつないだ形です。 x と y には整数が入っているので、文字列の連結にはならない。 【C(不正解)】 ? 引数の数が合わないときなどに出る例外です。 __init__() は self のほかに 2 つの引数を受け取り、Point(2, 5) と数が合う。 【D(正解)】 ? 2 と 5 を足した値です。 Point(2, 5) の引数は __init__() に渡され、self.x に 2、self.y に 5 が入る。合計は 7。

    出典: Python チュートリアル 9. クラス(9.3.2 クラスオブジェクト)

    この問題へのリンク
  3. 次のコードを実行すると何が表示される? class Box: pass obj = Box() obj.total = 3 while obj.total < 20: obj.total = obj.total * 3 print(obj.total) del obj.total print(hasattr(obj, 'total'))

    A. 27 と True B. 27 と False C. 9 と False D. AttributeError になる

    答えと解説

    正解: B 【A(不正解)】 ? 削除後も属性が残っていた場合の組み合わせです。 del obj.total で属性は取り除かれるので、hasattr() は False になる。 【B(正解)】 ? ループ後の値と、削除後に属性が残っているかの結果です。 データ属性は宣言なしに代入で作られる。3→9→27 で止まり、del で消えるので hasattr() は False。 【C(不正解)】 ? 1 回だけ 3 倍した値です。 9 は 20 未満なのでループがもう 1 回まわり、27 になる。 【D(不正解)】 ? 存在しない属性を使ったときの例外です。 クラスで宣言していなくても、インスタンスに代入すればその時点で属性ができる。

    出典: Python チュートリアル 9. クラス(9.3.3 インスタンスオブジェクト)

    この問題へのリンク

メソッドとクラス変数・インスタンス変数

  1. x が MyClass のインスタンスのとき、メソッド呼び出し x.f() と同じ意味になる書き方は?

    A. MyClass.f(x) B. MyClass.f() C. f(x, MyClass) D. x.f(MyClass)

    答えと解説

    正解: A 【A(正解)】 ? クラスの関数に、インスタンスを 1 つ目の引数として渡す形です。 メソッド呼び出しでは、インスタンスが関数の第 1 引数として渡される。x.f() は MyClass.f(x) と等価。 【B(不正解)】 ? クラスの関数を引数なしで呼ぶ形です。 f は self を受け取る定義なので、引数なしでは TypeError になる。 【C(不正解)】 ? 関数名だけで、引数を 2 つ渡す形です。 f はクラスの名前空間にある名前で、そのままでは呼べない。引数の数と順番も合わない。 【D(不正解)】 ? インスタンスからクラスを引数にして呼ぶ形です。 x.f() ではインスタンスが自動で渡る。さらにクラスを渡すと引数が 1 つ多くなる。

    出典: Python チュートリアル 9. クラス(9.3.4 メソッドオブジェクト)

    この問題へのリンク
  2. 次のコードを実行すると何が表示される? class Dog: tricks = [] def add_trick(self, trick): self.tricks.append(trick) d = Dog() e = Dog() d.add_trick('roll') e.add_trick('play') print(d.tricks)

    A. ['play', 'roll'] B. ['roll', 'play'] C. ['roll'] D. ['play']

    答えと解説

    正解: B 【A(不正解)】 ? 追加した順と逆に並んだ結果です。 append() は末尾に足すので、先に追加した 'roll' が前に来る。 【B(正解)】 ? 2 匹の犬が 1 つのリストを共有していた場合の結果です。 tricks はクラス変数なので、全インスタンスで 1 つのリストを共有する。e の追加も d から見える。 【C(不正解)】 ? d だけのリストを持っていた場合の結果です。 インスタンスごとのリストにするには、__init__() で self.tricks = [] とインスタンス変数にする必要がある。 【D(不正解)】 ? 最後に追加した要素だけの結果です。 append() は前の要素を消さないので、'roll' も残る。

    出典: Python チュートリアル 9. クラス(9.3.5 クラス変数とインスタンス変数)

    この問題へのリンク
  3. 次のコードを実行すると何が表示される? class C: color = 'red' a = C() b = C() a.color = 'blue' print(a.color, b.color, C.color)

    A. blue blue blue B. blue blue red C. blue red red D. red red red

    答えと解説

    正解: C 【A(不正解)】 ? クラスの値まで書き換わった場合の結果です。 インスタンスへの代入はクラス変数を書き換えない。 【B(不正解)】 ? すべてのインスタンスだけが変わった場合の結果です。 b は自分の color を持たないので、クラスの red を参照する。 【C(正解)】 ? a だけが自分の属性を持った場合の結果です。 a.color = 'blue' は a にインスタンス変数を作る。同名ならインスタンス側が優先され、b と C はクラス変数の red のまま。 【D(不正解)】 ? 代入が無視された場合の結果です。 a には color が作られ、属性の検索ではインスタンス側が先に見つかる。

    出典: Python チュートリアル 9. クラス(9.4 いろいろな注意点)

    この問題へのリンク
  4. 次のコードを実行すると何が表示される? class Counter: def __init__(this): this.n = 0 def up(this): this.n += 1 return this.n c = Counter() c.up() print(c.up()) f = c.up print(f(), f())

    A. 2 と 1 2 B. 1 と 1 2 C. 第 1 引数が self でないため例外になる D. 2 と 3 4

    答えと解説

    正解: D 【A(不正解)】 ? 変数に入れたメソッドが新しく数え直した場合の結果です。 f は同じインスタンス c に結び付いているので、n は 2 から続けて増える。 【B(不正解)】 ? 呼び出しのたびに 0 から数えた場合の結果です。 n はインスタンスの属性に保存されるので、呼び出しの間で値が残る。 【C(不正解)】 ? 引数名の決まりに関する説明です。 第 1 引数を self と呼ぶのは慣習で、Python にとって特別な意味は無い。this でも動く。 【D(正解)】 ? メソッドを変数に入れても同じインスタンスで数え続けた場合の結果です。 self は慣習の名前で、this でも動く。f = c.up は c を覚えたメソッドオブジェクトなので、続けて 3、4 になる。

    出典: Python チュートリアル 9. クラス(9.3.4 メソッドオブジェクト)/Python チュートリアル 9. クラス(9.4 いろいろな注意点)

    この問題へのリンク

継承・多重継承・プライベート変数

  1. 次のコードを実行すると何が表示される? class Base: def hello(self): return 'Base' def show(self): print(self.hello()) class Sub(Base): def hello(self): return 'Sub' Sub().show()

    A. Base B. BaseSub C. Sub D. AttributeError になる

    答えと解説

    正解: C 【A(不正解)】 ? 基底クラスの hello() が使われた場合の結果です。 Python のメソッドは事実上すべて virtual で、基底クラスの中からでも派生クラスの上書きが呼ばれる。 【B(不正解)】 ? 両方の戻り値をつないだ形です。 hello() は 1 つだけ呼ばれ、文字列をつなぐ処理はどこにも無い。 【C(正解)】 ? 派生クラスで上書きした hello() が使われた場合の結果です。 show() は Base で定義されているが、self は Sub のインスタンス。self.hello() はオーバーライドした Sub の hello() を呼ぶ。 【D(不正解)】 ? 属性が見つからないときの例外です。 Sub に show() は無いが、継承により基底クラス Base の show() が見つかる。

    出典: Python チュートリアル 9. クラス(9.5 継承)

    この問題へのリンク
  2. 次の式のうち、結果が True になるものは?

    A. issubclass(bool, int) B. issubclass(float, int) C. issubclass(int, bool) D. issubclass(int, float)

    答えと解説

    正解: A 【A(正解)】 ? bool が int を継承したクラスかを調べる式です。 bool は int のサブクラスなので True。issubclass() はクラスの継承関係を調べる。 【B(不正解)】 ? float が int を継承したクラスかを調べる式です。 float は int のサブクラスではないので False。 【C(不正解)】 ? int が bool を継承したクラスかを調べる式です。 継承の向きが逆。int は bool のサブクラスではないので False。 【D(不正解)】 ? int が float を継承したクラスかを調べる式です。 int と float に継承関係は無いので False。

    出典: Python チュートリアル 9. クラス(9.5 継承)

    この問題へのリンク
  3. 次のコードを実行すると何が表示される? class A: x = 'A' class B(A): pass class C(A): x = 'C' class D(B, C): pass print(D.x)

    A. A B. AttributeError になる C. TypeError になる D. C

    答えと解説

    正解: D 【A(不正解)】 ? B の先祖の A を先に探した場合の結果です。 単純な深さ優先なら A になるが、ダイヤモンド継承では同じ祖先を後回しにする順序が使われる。 【B(不正解)】 ? どのクラスにも x が無い場合の例外です。 A と C に x があるので、属性は見つかる。 【C(不正解)】 ? 継承の順序が矛盾したときなどの例外です。 D(B, C) は矛盾の無い順序を作れるので、クラス定義は成功する。 【D(正解)】 ? C で定義した x が先に見つかった場合の結果です。 共通の祖先 A は一度だけ、最後にたどる。メソッド解決順序は D→B→C→A なので、C の x が見つかる。

    出典: Python チュートリアル 9. クラス(9.5.1 多重継承)/Python 2.3 のメソッド解決順序

    この問題へのリンク
  4. class Acct の __init__() で self.__v = 1 とした。a = Acct() のあと、クラスの外から値 1 を読める式は?

    A. a.__v B. a._Acct__v C. a._v D. Acct.__v

    答えと解説

    正解: B 【A(不正解)】 ? 定義のときと同じ名前で読む式です。 クラスの外では置き換えが起きないので、__v という属性は無く AttributeError になる。 【B(正解)】 ? クラス名を付け加えた属性名です。 __v は名前修飾で _Acct__v に置き換えられる。この名前なら外からも読める。 【C(不正解)】 ? アンダースコアを 1 つ減らした名前です。 _v という属性はどこでも作られていない。 【D(不正解)】 ? クラスから読む式です。 __v はインスタンスの属性で、クラスには無い。名前も置き換え後の形ではない。

    出典: Python チュートリアル 9. クラス(9.6 プライベート変数)

    この問題へのリンク

イテレータ・ジェネレータ・ジェネレータ式

  1. 次のコードを実行したときの動きは? it = iter('ab') print(next(it)) print(next(it)) print(next(it))

    A. a、b の後に StopIteration B. a、b の後で None を表示する C. a、b の後でまた a を表示する D. a、b の後で空文字を表示する

    答えと解説

    正解: A 【A(正解)】 ? 要素が尽きたときのイテレータの動きです。 iter() で得たイテレータは要素を 1 つずつ返し、尽きると StopIteration を送出する。 【B(不正解)】 ? 尽きた後に空の値を返す動きです。 next() は既定値を渡さない限り None を返さず、例外を送出する。 【C(不正解)】 ? 先頭に戻って繰り返す動きです。 イテレータは先頭に戻らない。もう一度回すには iter() で作り直す。 【D(不正解)】 ? 尽きた後に長さ 0 の文字列を返す動きです。 要素が無いときに空の文字列を返す仕組みは無い。

    出典: Python チュートリアル 9. クラス(9.8 イテレータ)

    この問題へのリンク
  2. 次のコードを実行すると何が表示される? def rev(data): for i in range(len(data) - 1, -1, -1): yield data[i] print(''.join(rev('abc')))

    A. abc B. cba C. c D. TypeError になる

    答えと解説

    正解: B 【A(不正解)】 ? 先頭から順に取り出した結果です。 range(2, -1, -1) は 2,1,0 と減っていくので、逆順になる。 【B(正解)】 ? 末尾から順に取り出した結果です。 ジェネレータは i=2,1,0 の順に要素を yield し、join() が 'c','b','a' をつなぐ。 【C(不正解)】 ? 最初の 1 つだけを取り出した結果です。 yield は return と違い、関数を終わらせずに次の呼び出しで処理を再開する。 【D(不正解)】 ? join() に合わない値を渡したときの例外です。 ジェネレータは文字列を 1 つずつ返す反復可能なオブジェクトで、join() に渡せる。

    出典: Python チュートリアル 9. クラス(9.9 ジェネレータ)

    この問題へのリンク
  3. sum(i * i for i in range(4)) の結果は?

    A. 6 B. 30 C. 14 D. SyntaxError になる

    答えと解説

    正解: C 【A(不正解)】 ? 2 乗せずにそのまま足した場合の値です。 i * i なので 2 乗を足す。0+1+2+3=6 は 2 乗していない計算。 【B(不正解)】 ? 4 も含めて 2 乗を足した場合の値です。 range(4) は 0〜3 で 4 を含まない。30 は 16 まで足した値。 【C(正解)】 ? 4 を含めずに 2 乗を足した場合の値です。 ジェネレータ式が 0,1,4,9 を順に作り、sum() が合計する。0+1+4+9=14。 【D(不正解)】 ? 書き方が文法に合わないときの例外です。 唯一の引数として関数に渡すときは、ジェネレータ式に追加の括弧は要らない。

    出典: Python チュートリアル 9. クラス(9.10 ジェネレータ式)

    この問題へのリンク
  4. 次のコードを実行すると何が表示される? g = (n for n in range(3)) print(sum(g), sum(g))

    A. 3 3 B. 0 0 C. 3 を表示した後 StopIteration が送出される D. 3 0

    答えと解説

    正解: D 【A(不正解)】 ? 2 回とも同じ要素を足した場合の結果です。 リスト内包表記で作ったリストなら 3 3 になるが、ジェネレータは使い切ると空になる。 【B(不正解)】 ? どちらも要素が無かった場合の結果です。 1 回目の sum() では 0,1,2 が取り出されるので 3 になる。 【C(不正解)】 ? 尽きたことを外に伝える例外です。 sum() は内部で反復を終えるだけで、StopIteration を外に出さない。空なら 0 を返す。 【D(正解)】 ? 1 回目で要素を使い切った場合の結果です。 ジェネレータ式は一度しか回せない。1 回目の sum() で 0+1+2=3 を使い切り、2 回目は空なので 0。

    出典: Python チュートリアル 9. クラス(9.10 ジェネレータ式)/Python チュートリアル 9. クラス(9.9 ジェネレータ)

    この問題へのリンク

OS インターフェースとファイルのワイルドカード(os・shutil・glob)

  1. 社内ツールのレビューで、from os import * ではなく import os と書くよう指摘された。主な理由は?

    A. from os import * の形では os の関数を読み込めないため B. import os の書き方のほうが常に実行速度が速いため C. 組み込みの open() が os.open() で隠されるのを防ぐため D. Windows 版の os モジュールは * の読み込みに対応しないため

    答えと解説

    正解: C 【A(不正解)】 ? 読み込みの書き方そのものの制限です。 from os import * も文法上は動く。問題は名前の衝突にある。 【B(不正解)】 ? 処理の速さの話です。 チュートリアルが挙げる理由は速さではなく、組み込み関数が隠されることである。 【C(正解)】 ? 同じ名前の関数が上書きされる問題です。 * で読み込むと os.open() が組み込みの open() を隠す。両者の動きは大きく違うので import os を使う。 【D(不正解)】 ? OS ごとの違いの話です。 OS によって import の書き方が制限されることはない。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.1 オペレーティングシステムとのインターフェース)

    この問題へのリンク
  2. ファイルのコピーやディレクトリの移動を、高水準の関数で手軽に行いたい。使うモジュールは?

    A. shutil B. glob C. zlib D. re

    答えと解説

    正解: A 【A(正解)】 ? 日常のファイル・ディレクトリ管理のためのモジュールです。 shutil は copyfile() や move() など、ファイルとディレクトリを管理する高水準の関数を持つ。 【B(不正解)】 ? ワイルドカードでファイル名を探すモジュールです。 glob はファイル名の一覧を作るだけで、コピーや移動はしない。 【C(不正解)】 ? データを圧縮・展開するモジュールです。 zlib はバイト列の圧縮用で、ファイルのコピーや移動はしない。 【D(不正解)】 ? 正規表現で文字列を扱うモジュールです。 re は文字列のパターンマッチ用で、ファイル操作の関数は無い。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.1 オペレーティングシステムとのインターフェース)/Python 標準ライブラリ shutil --- 高水準のファイル操作

    この問題へのリンク
  3. 作業フォルダにある拡張子 .py のファイル名を、リストでまとめて得たい。書き方として合うものは?

    A. shutil.copyfile('*.py') B. os.getcwd('*.py') C. re.findall('*.py') D. glob.glob('*.py')

    答えと解説

    正解: D 【A(不正解)】 ? ファイルを複製する関数です。 copyfile() はコピー元とコピー先の 2 つを受け取り、ワイルドカードの展開はしない。 【B(不正解)】 ? いまの作業フォルダを調べる関数です。 getcwd() は現在の作業フォルダのパスを返す関数で、引数は取らない。 【C(不正解)】 ? 正規表現で一致する部分を探す関数です。 findall() は文字列の中を探す関数で、ファイルの一覧は作らない。'*' から始まる正規表現も不正。 【D(正解)】 ? ワイルドカードでファイル名を探す関数です。 glob の glob() は、ワイルドカードに合うファイル名のリストを返す。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.2 ファイルのワイルドカード)/Python 標準ライブラリ glob --- Unix 形式のパス名のパターン展開

    この問題へのリンク

コマンドライン引数・エラー出力・終了(sys・argparse)

  1. demo.py に import sys と print(len(sys.argv)) を書き、python demo.py one two three で実行した。表示は?

    A. 3 B. 4 C. 1 D. 13

    答えと解説

    正解: B 【A(不正解)】 ? スクリプト名を除いた引数だけを数えた値です。 sys.argv の先頭にはスクリプト名が入るので、3 にはならない。 【B(正解)】 ? スクリプト名と 3 つの引数を数えた値です。 sys.argv は ['demo.py', 'one', 'two', 'three'] で、先頭にスクリプト名が入る。長さは 4。 【C(不正解)】 ? スクリプト名だけを数えた値です。 コマンドラインで渡した one two three もリストに入る。 【D(不正解)】 ? 引数の文字数をすべて足した値です。 len() はリストの要素数を数える。文字数の合計ではない。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.3 コマンドライン引数)

    この問題へのリンク
  2. バッチの結果を python job.py > out.txt でファイルに保存している。警告文だけは画面に出したい。書き方は?

    A. sys.stderr.write('警告…\n') で出す B. print('警告…') で出す C. sys.argv に警告文を追加する D. sys.exit() の後に print() で出す

    答えと解説

    正解: A 【A(正解)】 ? 標準エラー出力に書き込む方法です。 sys.stderr は stdout をリダイレクトしても読めるよう、警告やエラーの出力に使う。 【B(不正解)】 ? 標準出力に書く方法です。 print() の出力は stdout に行くので、out.txt に入って画面には出ない。 【C(不正解)】 ? コマンドライン引数のリストに足す方法です。 sys.argv は受け取った引数のリストで、画面への出力とは関係ない。 【D(不正解)】 ? 終了処理の後に出力する方法です。 sys.exit() でスクリプトが終わるので、その後の print() は実行されない。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.4 エラー出力のリダイレクトとプログラムの終了)

    この問題へのリンク
  3. スクリプトの途中でエラーを見つけ、その場で処理を終了させたい。最も直接的な方法は?

    A. sys.stderr を閉じる B. sys.exit() を呼ぶ C. sys.argv を空にする D. pass 文を書く

    答えと解説

    正解: B 【A(不正解)】 ? エラー出力の流れを閉じる操作です。 出力先を閉じてもスクリプトの実行は続く。 【B(正解)】 ? スクリプトを終わらせる関数です。 チュートリアルは sys.exit() をスクリプトを終了させる最も直接的な方法として挙げる。 【C(不正解)】 ? 引数のリストを空にする操作です。 引数のリストを変えても、処理は止まらない。 【D(不正解)】 ? 何もしない文です。 pass 文は何もしないので、処理はそのまま次へ進む。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.4 エラー出力のリダイレクトとプログラムの終了)

    この問題へのリンク
  4. argparse で add_argument('filenames', nargs='+') と add_argument('-l', '--lines', type=int, default=10) を定義した。python top.py alpha.txt の args.lines は?

    A. None B. 文字列の '10' C. 整数の 10 D. エラーで終了する

    答えと解説

    正解: C 【A(不正解)】 ? 値が無いことを表す特別な値です。 default を指定しているので None にはならない。 【B(不正解)】 ? 数字を文字として持つ値です。 default に整数 10 を渡しているので、整数のまま入る。 【C(正解)】 ? 指定が無いときに使う既定の値です。 --lines を付けなかったので default の 10 が入る。alpha.txt は位置引数 filenames に入る。 【D(不正解)】 ? 必須の指定が抜けたときの動きです。 --lines は省略できるオプションで、alpha.txt も位置引数 filenames で受け取るので終了しない。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.3 コマンドライン引数)/Python 標準ライブラリ argparse --- コマンドラインオプションや引数、サブコマンド向けのパーサー

    この問題へのリンク

文字列のパターンマッチ(re)

  1. re.findall(r'\bs[a-z]*', 'she sells sea shells by the shore') の結果は?

    A. ['she', 'sells', 'sea', 'shells', 'by', 'the', 'shore'] B. ['she', 'sells', 'sea', 'shells'] C. ['s', 's', 's', 's', 's'] D. ['she', 'sells', 'sea', 'shells', 'shore']

    答えと解説

    正解: D 【A(不正解)】 ? 文中のすべての単語を集めた結果です。 \b の直後に s が要るので、s で始まらない by と the は一致しない。 【B(不正解)】 ? 最後の単語を除いた結果です。 shore も s で始まるので一致する。 【C(不正解)】 ? s の 1 文字だけを集めた結果です。 [a-z]* が続く英小文字も含めるので、単語全体が返る。 【D(正解)】 ? s で始まる単語をすべて集めた結果です。 \b は単語の境目、s[a-z]* は s で始まる英小文字の並び。単語の頭が s のものがすべて返る。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.5 文字列のパターンマッチ)/Python 標準ライブラリ re --- 正規表現操作

    この問題へのリンク
  2. re.sub(r'(\b[a-z]+) \1', r'\1', 'see you at the the station') の結果は?

    A. 'see you at the the station' B. 'see you at station' C. 'see you at the station' D. 'see you at \1 station'

    答えと解説

    正解: C 【A(不正解)】 ? 何も置き換わらなかった結果です。 'the the' がパターンに一致するので、置き換えが起きる。 【B(不正解)】 ? 重なった単語を両方消した結果です。 置き換え先の \1 は 1 つ目の単語なので、the が 1 つ残る。 【C(正解)】 ? 重なった単語を 1 つにまとめた結果です。 (\b[a-z]+) \1 は同じ単語が空白をはさんで続く部分に一致し、1 つ目の単語だけに置き換える。 【D(不正解)】 ? 置き換え先の記号がそのまま入った結果です。 \1 は記号そのものではなく、1 番目のグループに一致した文字列(ここでは the)を表す。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.5 文字列のパターンマッチ)/Python 標準ライブラリ re --- 正規表現操作

    この問題へのリンク
  3. 設定ファイル中の 'too' をすべて 'two' に変えたいだけ。チュートリアルの方針に沿った書き方は?

    A. 文字列メソッド replace() を使う B. re.sub() で正規表現を書く C. re.findall() で探してから組み立てる D. textwrap.fill() で書き直す

    答えと解説

    正解: A 【A(正解)】 ? 文字列そのものが持つ置き換え機能です。 機能が最小限で足りるなら、読みやすくデバッグしやすい文字列メソッドが勧められている。 【B(不正解)】 ? 正規表現で置き換える関数です。 動きはするが、re は複雑な一致や操作のための道具。単純な置き換えには文字列メソッドが勧められる。 【C(不正解)】 ? 一致した部分の一覧を得てから処理する方法です。 一覧を作ってから組み立て直すのは手間が増え、読みにくい。 【D(不正解)】 ? 文章を指定の幅で折り返す関数です。 textwrap は段落の折り返し用で、語の置き換えはしない。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.5 文字列のパターンマッチ)

    この問題へのリンク

数学(math・random・statistics)

  1. statistics.median([9, 2, 7, 1, 4]) の結果は?

    A. 4.6 B. 9 C. 7 D. 4

    答えと解説

    正解: D 【A(不正解)】 ? 合計を個数で割った値です。 4.6 は mean()(平均)の結果で、中央値ではない。 【B(不正解)】 ? 最も大きい値です。 9 は最大値。中央値は並べ替えたときの真ん中の値。 【C(不正解)】 ? 並べ替える前のリストで、真ん中の位置にある値です。 中央値は並べ替えてから真ん中を取る。並べ替える前の位置では決まらない。 【D(正解)】 ? 小さい方から数えて 3 番目の値です。 並べ替えると 1,2,4,7,9 で、真ん中は 4。statistics の median() は中央値を返す。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.6 数学)/Python 標準ライブラリ statistics --- 数学的統計関数

    この問題へのリンク
  2. 応募者 100 人(番号 1〜100)から、重ならないように当選者 3 人を無作為に選びたい。使う関数は?

    A. random.choice(range(1, 101)) B. random.sample(range(1, 101), 3) C. [random.random() for i in range(3)] D. random.randrange(1, 101)

    答えと解説

    正解: B 【A(不正解)】 ? 1 つだけ選ぶ関数です。 choice() は 1 つしか選ばない。3 回呼ぶと同じ人が重なることがある。 【B(正解)】 ? 重なりなく複数を抜き出す関数です。 sample() は母集団から重複なしで指定の数を選ぶ。random の無作為な選択の道具の 1 つ。 【C(不正解)】 ? 0 以上 1 未満の小数を 3 つ作る式です。 random() は小数を返すだけで、1〜100 の番号は選ばない。 【D(不正解)】 ? 範囲から整数を 1 つ選ぶ関数です。 randrange() は 1 回に 1 つしか選ばない。3 回呼ぶと重なることがある。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.6 数学)/Python 標準ライブラリ random --- 疑似乱数を生成する

    この問題へのリンク
  3. import math のあと print(math.log(1024, 2)) を実行した。表示は?

    A. 10.0 B. 10 C. 512.0 D. 2048.0

    答えと解説

    正解: A 【A(正解)】 ? 2 を何乗すると 1024 になるかを小数で表した値です。 math の log(x, base) は底を指定した対数を浮動小数点数で返す。2 の 10 乗が 1024 なので 10.0。 【B(不正解)】 ? 同じ値を整数で表したものです。 math.log() は float を返すので、表示は 10.0 になる。 【C(不正解)】 ? 1024 を 2 で割った値です。 対数は割り算ではない。1024÷2 とは別の計算。 【D(不正解)】 ? 1024 に 2 を掛けた値です。 対数は掛け算でもない。2 を何乗すれば 1024 になるかを求める。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.6 数学)/Python 標準ライブラリ math --- 数学関数

    この問題へのリンク

インターネット・日付と時刻・データ圧縮・性能計測

  1. from datetime import date のあと、(date(2026, 12, 25) - date(2026, 11, 9)).days を表示した。結果は?

    A. 45 B. 46 C. 47 D. TypeError になる

    答えと解説

    正解: B 【A(不正解)】 ? 11 月 9 日から 12 月 24 日までの日数です。 21 日(11 月の残り)と 25 日を足すと 46 になる。 【B(正解)】 ? 11 月 9 日から 12 月 25 日までの日数です。 date どうしの引き算は timedelta を返し、days で日数が分かる。11/9→11/30 が 21 日、12/25 まで 25 日で 46。 【C(不正解)】 ? 11 月 9 日と 12 月 25 日の両方を含めて数えた日数です。 両端を両方数えると 47 になるが、引き算の結果は 46 日。 【D(不正解)】 ? 型が合わない演算の例外です。 datetime は日付の算術演算に対応しており、date どうしは引き算できる。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.8 日付と時刻)/Python 標準ライブラリ datetime --- 基本的な日付と時間の型

    この問題へのリンク
  2. Web 上の公開データを、URL を指定して Python から取得したい。チュートリアルが挙げる単純なモジュールは?

    A. smtplib B. xmlrpc.server C. urllib.request D. threading

    答えと解説

    正解: C 【A(不正解)】 ? メールを送るためのモジュールです。 smtplib はメール送信用で、URL からデータは取得しない。 【B(不正解)】 ? 遠隔手続き呼び出しのサーバー側を作るモジュールです。 xmlrpc.server は呼び出しを受ける側を作るもので、URL のデータ取得には使わない。 【C(正解)】 ? URL からデータを取得するモジュールです。 チュートリアルは URL からデータを取得するモジュールとして urllib.request を挙げる。 【D(不正解)】 ? 処理を並行して動かすモジュールです。 threading は並行処理用で、それ自体は URL からデータを取らない。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.7 インターネットへのアクセス)

    この問題へのリンク
  3. t = zlib.compress(s) で圧縮したバイト列 t を、元の s に戻したい。使う関数は?

    A. zlib.compress(t) B. zlib.crc32(t) C. t.decode() D. zlib.decompress(t)

    答えと解説

    正解: D 【A(不正解)】 ? データを圧縮する関数です。 もう一度圧縮するだけで、元には戻らない。 【B(不正解)】 ? チェックサムを計算する関数です。 crc32() は整数の検査値を返すだけで、展開はしない。 【C(不正解)】 ? バイト列を文字列に変える方法です。 圧縮後のバイト列は文字として読めず、多くは UnicodeDecodeError になる。展開もされない。 【D(正解)】 ? 圧縮したデータを展開する関数です。 zlib の decompress() は compress() の結果を元に戻す。zlib.decompress(t) == s は True。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.9 データ圧縮)/Python 標準ライブラリ zlib --- gzip 互換の圧縮

    この問題へのリンク
  4. 大きな業務アプリが遅い。どの関数に時間がかかっているか、全体から突き止めたい。チュートリアルが勧める道具は?

    A. timeit の Timer B. doctest の testmod() C. profile と pstats D. logging の basicConfig()

    答えと解説

    正解: C 【A(不正解)】 ? 小さなコード片の実行時間を測る道具です。 timeit は 2 通りの書き方の比較など、小さい単位の計測に向く。全体からの特定には向かない。 【B(不正解)】 ? docstring の使用例を確かめる道具です。 doctest は結果が正しいかを確かめるもので、速さは測らない。 【C(正解)】 ? 大きなコードの律速部分を調べる道具です。 timeit が小さい粒度を測るのに対し、profile と pstats は大きなコードブロックで律速となる部分を判定する。 【D(不正解)】 ? ログの出し方を設定する道具です。 ログに時刻を書くことはできるが、関数ごとの時間を集計する道具ではない。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.10 パフォーマンスの計測)

    この問題へのリンク

品質管理とバッテリー同梱(doctest・unittest ほか)

  1. 関数の docstring に書いた使用例が、コードを直した後もそのとおり動くか確かめたい。合う方法は?

    A. doctest で docstring の例を実行する B. unittest で同じ例を別ファイルに書き写す C. timeit で例の実行時間を繰り返し測る D. pprint で例の結果を整えて表示する

    答えと解説

    正解: A 【A(正解)】 ? 説明文の中の例をテストとして動かす方法です。 doctest は docstring に埋め込まれたテストを探して実行し、結果を照合する。例がそのまま検査になる。 【B(不正解)】 ? テストを別のファイルで管理する方法です。 unittest でも確かめられるが、docstring の例そのものを検証するのは doctest。 【C(不正解)】 ? コード片の速さを測る方法です。 timeit は速さを測るだけで、結果が合っているかは確かめない。 【D(不正解)】 ? データを整えて表示する方法です。 pprint は表示を整えるだけで、期待した結果との照合はしない。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.11 品質管理)/Python 標準ライブラリ doctest --- 対話型の Python の例をテストする

    この問題へのリンク
  2. テストを本体とは別のファイルにまとめ、空のリストで ZeroDivisionError になることも確かめたい。unittest での書き方は?

    A. docstring に例外が出る例だけを書いておく B. try 文で例外を受け止めて何もしないようにする C. logging.error() で例外の内容をログに記録する D. TestCase を継承し assertRaises() で確かめる

    答えと解説

    正解: D 【A(不正解)】 ? 説明文の中に例を書く方法です。 doctest でも例外は書けるが、別ファイルで網羅的に管理する目的には unittest が合う。 【B(不正解)】 ? 例外を受け止めて何もしない書き方です。 例外を捨ててしまうと、例外が起きたかどうかを検査できない。 【C(不正解)】 ? エラーをログに残す方法です。 記録はできるが、期待どおりの例外かどうかの合否は判定しない。 【D(正解)】 ? テストのクラスと、例外を確かめるメソッドです。 unittest は別ファイルでより網羅的なテストを管理でき、assertRaises() で例外の発生を確かめられる。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.11 品質管理)/Python 標準ライブラリ unittest --- ユニットテストフレームワーク

    この問題へのリンク
  3. 小さなアプリのデータを、別のサーバーを立てずに SQL で保存・検索したい。標準ライブラリで使うモジュールは?

    A. csv B. sqlite3 C. json D. zlib

    答えと解説

    正解: B 【A(不正解)】 ? CSV ファイルを読み書きするモジュールです。 csv は表形式のファイルを扱うが、SQL での検索はできない。 【B(正解)】 ? SQLite データベースを使うためのモジュールです。 sqlite3 は SQLite データベースライブラリのラッパーで、データを永続的に保存し SQL で扱える。 【C(不正解)】 ? JSON 形式を扱うモジュールです。 json はデータ交換形式の変換用で、SQL は使えない。 【D(不正解)】 ? データを圧縮するモジュールです。 zlib は圧縮用で、データの保存や検索の仕組みは持たない。

    出典: Python チュートリアル 10. 標準ライブラリをひとめぐり(10.12 バッテリー同梱)/Python 標準ライブラリ sqlite3 --- SQLite データベース用の DB-API 2.0 インターフェース

    この問題へのリンク

出力のフォーマットと文字列テンプレート(reprlib・pprint・textwrap・locale・string.Template)

  1. 要素がとても多い集合をログに出すと長すぎる。途中を ... で省略して短く表示したい。使う関数は?

    A. reprlib.repr() B. pprint.pprint() C. textwrap.fill() D. str()

    答えと解説

    正解: A 【A(正解)】 ? 大きなコンテナを省略して表す関数です。 reprlib の repr() は大きい・深く入れ子のコンテナを省略して表示する(例: {'a', 'c', 'd', 'e', 'f', 'g', ...})。 【B(不正解)】 ? 構造を改行やインデントで整える関数です。 pprint は見やすく整えるが、中身を省略はしない。 【C(不正解)】 ? 文章を指定の幅で折り返す関数です。 textwrap は段落を折り返すだけで、要素を省略しない。 【D(不正解)】 ? オブジェクトを文字列に変える組み込み関数です。 str() は全要素を並べるので、長いまま表示される。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.1 出力のフォーマット)/Python 標準ライブラリ reprlib --- もう一つの repr() の実装

    この問題へのリンク
  2. 長い英文の説明を、1 行 40 文字以内に収まるよう改行して表示したい。使う関数は?

    A. print(reprlib.repr(doc)) B. textwrap.fill(doc, width=40) C. print(doc[:40]) D. print(doc.split(40))

    答えと解説

    正解: B 【A(不正解)】 ? 長い表示を省略する関数です。 reprlib は省略して短くするもので、全文を幅に合わせて改行しない。 【B(正解)】 ? 段落を指定の幅で折り返す関数です。 textwrap は段落を指定した画面幅に収まるよう調整する。fill() は折り返した 1 つの文字列を返す。 【C(不正解)】 ? 先頭の 40 文字だけを取り出して表示する方法です。 41 文字目以降が切り捨てられ、残りの文章は表示されない。 【D(不正解)】 ? 文字列を区切り文字で分ける方法です。 split() の引数は区切り文字で、整数を渡すと TypeError になる。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.1 出力のフォーマット)/Python 標準ライブラリ textwrap --- テキストの折り返しと詰め込み

    この問題へのリンク
  3. t = Template('Send the $item to $owner.') のとき、t.safe_substitute(item='invoice') の結果は?

    A. 'Send the invoice to .' B. 'Send the invoice to None.' C. 'Send the invoice to $owner.' D. KeyError になる

    答えと解説

    正解: C 【A(不正解)】 ? 値の無い部分を空にした結果です。 safe_substitute() は空文字に置き換えない。元の $owner を残す。 【B(不正解)】 ? 値の無い部分を None にした結果です。 None を入れる動きは無い。値が無ければ $owner のまま残る。 【C(正解)】 ? 値の無いプレースホルダが残った結果です。 safe_substitute() は値が無いプレースホルダをそのまま残して出力する。 【D(不正解)】 ? 辞書にキーが無いときの例外です。 KeyError になるのは substitute() のほう。safe_substitute() は例外を出さない。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.2 文字列テンプレート)/Python 標準ライブラリ string --- 一般的な文字列操作

    この問題へのリンク
  4. Template('${city}jin pay $$5 for $cause.').substitute(city='Osaka', cause='the fund') の結果は?

    A. 'Osaka jin pay $5 for the fund.' B. 'Osakajin pay $$5 for the fund.' C. KeyError になる D. 'Osakajin pay $5 for the fund.'

    答えと解説

    正解: D 【A(不正解)】 ? 置き換えた値の後ろに空白が入った結果です。 {} は空白を入れずに英字を続けるための書き方で、空白は足されない。 【B(不正解)】 ? $$ がそのまま残った結果です。 $$ はエスケープで、出力では 1 つの $ になる。 【C(不正解)】 ? 値の無いプレースホルダがあるときの例外です。 city と cause の両方に値を渡しているので、例外は起きない。 【D(正解)】 ? 波括弧の部分と $$ がそれぞれ置き換わった結果です。 {} で囲むと後ろに英字を続けられ、$$ は $ 自体を表す。string.Template の規則どおりの結果になる。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.2 文字列テンプレート)/Python 標準ライブラリ string --- 一般的な文字列操作

    この問題へのリンク
  5. 売上の数値を、その地域の書式に合わせて桁区切り付きで表示したい。チュートリアルが挙げるモジュールは?

    A. reprlib B. struct C. locale D. decimal

    答えと解説

    正解: C 【A(不正解)】 ? 大きなコンテナを省略して表すモジュールです。 reprlib は表示を短くする道具で、地域の書式は扱わない。 【B(不正解)】 ? バイナリデータを詰めたり取り出したりするモジュールです。 struct はバイト列の形式を扱うもので、画面向けの数値の書式は扱わない。 【C(正解)】 ? 地域ごとのデータ形式を扱うモジュールです。 locale は文化によって異なるデータ形式にアクセスし、grouping 引数で桁区切りを入れられる。第 4 版(3.9)の例は format()(3.12 で削除)、現行は format_string()。 【D(不正解)】 ? 10 進の浮動小数点演算を行うモジュールです。 decimal は計算の正確さのための型を提供し、地域ごとの書式は扱わない。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.1 出力のフォーマット)/Python 標準ライブラリ locale --- 国際化サービス

    この問題へのリンク

バイナリデータ・マルチスレッド・ログ・弱参照(struct・threading・logging・weakref)

  1. import struct のあと struct.calcsize('<HHI') を実行した。結果は?

    A. 8 B. 3 C. 6 D. 12

    答えと解説

    正解: A 【A(正解)】 ? H と I の大きさが違うとみた場合の合計です。 '<' は標準サイズ・リトルエンディアン。'H' は 2 バイト、'I' は 4 バイトの符号無し整数なので 2+2+4=8。 【B(不正解)】 ? パック符号の個数です。 calcsize() は符号の数ではなく、詰めたときのバイト数を返す。 【C(不正解)】 ? 3 つとも同じ 2 バイトとみた場合の合計です。 'I' は 4 バイトなので、2+2+4 で 8 になる。 【D(不正解)】 ? 3 つとも同じ 4 バイトとみた場合の合計です。 'H' は 2 バイトの符号無し整数で、4 バイトではない。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.3 バイナリデータレコードのレイアウトの操作)/Python 標準ライブラリ struct --- バイト列をパックされたバイナリデータとして解釈する

    この問題へのリンク
  2. 設定をしないまま次の 3 行を実行した。表示されるのは? import logging logging.debug('a') logging.info('b') logging.warning('c')

    A. 標準出力に a、b、c の 3 行が出る B. 標準エラー出力に INFO:root:b と WARNING:root:c が出る C. 何も表示されない D. 標準エラー出力に WARNING:root:c だけが出る

    答えと解説

    正解: D 【A(不正解)】 ? すべてのメッセージがそのまま出た場合の結果です。 logging の既定では debug と info は出ない。送り先も標準出力ではない。 【B(不正解)】 ? info 以上が出た場合の結果です。 既定では info() も抑えられるので、b は出ない。 【C(不正解)】 ? すべてが抑えられた場合の結果です。 warning() の出力は既定でも抑えられず、標準エラーに出る。 【D(正解)】 ? 警告より軽いメッセージが抑えられた場合の結果です。 既定では info() と debug() の出力は抑えられ、出力は標準エラーに送られる。warning() の分だけが出る。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.5 ログ記録)/Python 標準ライブラリ logging --- Python 用のログ記録手段

    この問題へのリンク
  3. 複数のスレッドが同じファイルに書き込み、ときどき内容が壊れる。チュートリアルが勧める作りは?

    A. スレッドの数を増やして早く終わらせる B. 書き込みを 1 つのスレッドに集め、queue で依頼を送る C. 各スレッドで sys.exit() を呼んで止める D. すべてのスレッドで同じグローバル変数に結果を足す

    答えと解説

    正解: B 【A(不正解)】 ? 並行して動く数を増やす作りです。 数を増やしても書き込みの衝突は減らず、調整の問題はそのまま残る。 【B(正解)】 ? 1 か所に任せて依頼を受け渡す作りです。 リソースへのアクセスを 1 つのスレッドに集め、queue で他のスレッドからの依頼を送る方法が推奨されている。 【C(不正解)】 ? それぞれを終了させる作りです。 スレッドを止めても、共有するファイルへのアクセスの調整にはならない。 【D(不正解)】 ? 共有の変数を直接使う作りです。 共有データを直接触ると調整がさらに難しくなる。queue での受け渡しが勧められている。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.4 マルチスレッディング)/Python 標準ライブラリ queue --- 同期キュークラス

    この問題へのリンク
  4. 作成コストの高いオブジェクトをキャッシュしたい。ただしキャッシュのせいで、使われなくなったオブジェクトが解放されないのは困る。使うモジュールは?

    A. weakref B. threading C. pprint D. array

    答えと解説

    正解: A 【A(正解)】 ? 参照を作らずにオブジェクトを追跡するモジュールです。 weakref は参照を増やさずに追跡でき、参照先が不要になると weakref のテーブルから自動で取り除かれる。 【B(不正解)】 ? 処理を並行して動かすモジュールです。 threading は並行処理用で、オブジェクトの解放とは関係ない。 【C(不正解)】 ? データを見やすく表示するモジュールです。 pprint は表示用で、オブジェクトの寿命は管理しない。 【D(不正解)】 ? 同じ型の値をまとめて持つ配列のモジュールです。 array に入れると値を保持し続けるので、解放されない問題は解決しない。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.6 弱参照)/Python 標準ライブラリ weakref --- 弱参照

    この問題へのリンク

リスト操作のツールと 10 進浮動小数点演算(array・collections・bisect・heapq・decimal)

  1. 次のコードを実行すると何が表示される? from collections import deque d = deque(['a', 'b']) d.append('c') print(d.popleft())

    A. c B. a C. b D. AttributeError になる

    答えと解説

    正解: B 【A(不正解)】 ? 右端から取り出した値です。 右端から取り出すのは pop()。popleft() は左端から取り出す。 【B(正解)】 ? 左端から取り出した値です。 collections.deque の popleft() は左端から取り出す。先に入れた 'a' が出るので、キューに向く。 【C(不正解)】 ? 真ん中にある値です。 deque は両端の出し入れが速いが、popleft() で取り出すのは左端の値。 【D(不正解)】 ? その名前のメソッドが無いときの例外です。 deque は popleft() を持つので、例外は起きない。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.7 リストを操作するツール)/Python 標準ライブラリ collections --- コンテナデータ型

    この問題へのリンク
  2. 次のコードを実行すると何が表示される? import bisect scores = [10, 20, 40] bisect.insort(scores, 30) print(scores)

    A. [10, 20, 40, 30] B. [30, 10, 20, 40] C. [10, 20, 30, 40] D. None

    答えと解説

    正解: C 【A(不正解)】 ? 末尾に追加した結果です。 末尾に足すのは append()。insort() は並び順を保つ位置に入れる。 【B(不正解)】 ? 先頭に挿入した結果です。 先頭に入れる動きではない。並び順の正しい位置に入る。 【C(正解)】 ? 並び順を保った位置に入った結果です。 bisect の insort() は、ソート済みのリストの順序を保つ位置に値を挿入する。 【D(不正解)】 ? 関数の戻り値をそのまま表示した場合の結果です。 print(scores) はリストそのものを表示する。insort() はリストをその場で書き換える。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.7 リストを操作するツール)/Python 標準ライブラリ bisect --- 配列二分法アルゴリズム

    この問題へのリンク
  3. 次のコードを実行すると何が表示される? from heapq import heapify, heappush, heappop data = [5, 1, 8, 3] heapify(data) heappush(data, -2) print([heappop(data) for i in range(3)])

    A. [8, 5, 3] B. [5, 1, 8] C. [1, 3, 5] D. [-2, 1, 3]

    答えと解説

    正解: D 【A(不正解)】 ? 大きい値から順に取り出した結果です。 heapq は最小の値を取り出す仕組みで、大きい順にはならない。 【B(不正解)】 ? 元のリストの先頭から取り出した結果です。 heapify() で並べ替えられ、取り出しは小さい順になる。 【C(不正解)】 ? 追加した値を除いて小さい順に並べた結果です。 heappush() で -2 を足しているので、最初に -2 が出る。 【D(正解)】 ? 小さい値から順に 3 つ取り出した結果です。 heapq のヒープでは最小の値が常に位置 0 にある。heappop() は小さい順に -2、1、3 を返す。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.7 リストを操作するツール)/Python 標準ライブラリ heapq --- ヒープキューアルゴリズム

    この問題へのリンク
  4. 70 セントに 5% の税を加え、セント単位に丸める。print(round(Decimal('0.70') * Decimal('1.05'), 2)) の表示は?

    A. 0.73 B. 0.7350 C. 0.74 D. 0.735

    答えと解説

    正解: C 【A(不正解)】 ? float で掛けてから 2 桁に丸めた値です。 0.73 は float で計算したときの結果。decimal では 10 進のまま正確に計算する。 【B(不正解)】 ? 丸める前の計算結果です。 0.7350 は掛け算の結果で、round(…, 2) により小数点以下 2 桁に丸められる。 【C(正解)】 ? Decimal のまま掛けてから 2 桁に丸めた値です。 Decimal では 0.70×1.05 が 0.7350 と正確に求まり、丸めて 0.74。float の round(.70 * 1.05, 2) は 0.73 になる。 【D(不正解)】 ? 末尾のゼロを落とした結果です。 Decimal は末尾のゼロを保つ。しかもここでは 2 桁に丸めるので 0.74 になる。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.8 10 進浮動小数点演算)/Python 標準ライブラリ decimal --- 10進固定小数点と浮動小数点の演算

    この問題へのリンク
  5. 金額の合計チェックで == の比較を使う。from decimal import Decimal と a = Decimal('0.1') の後、True になる式は?

    A. a + a + a == Decimal('0.3') B. 0.1 + 0.1 + 0.1 == 0.3 C. round(0.1, 1) * 3 == 0.3 D. float(a) * 3 == 0.3

    答えと解説

    正解: A 【A(正解)】 ? 10 進の型で足して比べる式です。 decimal の Decimal は 10 進の値を厳密に表すので、等値テストが期待どおり True になる。 【B(不正解)】 ? 小数をそのまま足して比べる式です。 float は 2 進で 0.1 を正確に表せず、合計がわずかにずれて False になる。 【C(不正解)】 ? 丸めた値を 3 倍して比べる式です。 丸めても 0.1 は 2 進で近い値のまま。3 倍すると 0.30000000000000004 になり False。 【D(不正解)】 ? a を 2 進の小数に変えて 3 倍する式です。 float に変えると 2 進の近い値になり、3 倍すると 0.3 とずれて False。

    出典: Python チュートリアル 11. 標準ライブラリをひとめぐり その II(11.8 10 進浮動小数点演算)/Python 標準ライブラリ decimal --- 10進固定小数点と浮動小数点の演算

    この問題へのリンク

この分野に出てくる用語(77 語)

__init__():インスタンスを作った直後に自動で呼ばれる特殊メソッド。引数を受け取って初期状態を設定する。

argparse:コマンドライン引数を高度に処理するための標準モジュール。

array:同じ型の数値をコンパクトに保持する配列を提供する標準モジュール。

bisect:ソート済みのリストを操作する関数を提供する標準モジュール。

collections.deque:両端での要素の追加と取り出しが速い、リストに似た型。キューの実装に向く。

csv:データベースや表計算で使われる CSV ファイルを直接読み書きする標準モジュール。

dataclasses:名前付きのデータ項目をまとめるクラスを簡単に作るための標準モジュール。

datetime:日付と時刻を扱う標準モジュール。日時の計算や書式化ができ、タイムゾーンを扱えるオブジェクトもある。

decimal:10 進数の浮動小数点演算を行う標準モジュール。財務計算など正確な 10 進表現や丸めの制御が必要な場面に向く。

dir():モジュールなどが定義している名前の一覧を、並べ替えたリストで返す組み込み関数。引数なしでは今定義している名前を返す。

doctest:docstring に書いた実行例を実際に動かして、結果が一致するかを検証する標準モジュール。

float:小数部を持つ数を表す型。5.0 や 1.6 など。整数と混ぜて計算すると結果は float になる。

glob:ワイルドカード(*.py など)に一致するファイルの一覧を作る標準モジュール。

global 文:関数の中で、指定した名前をグローバル(モジュール)のスコープのものとして扱う宣言。

heapq:通常のリストでヒープを実装する標準モジュール。最小の要素を常に先頭に置く。

isinstance():オブジェクトが指定したクラス(またはその派生クラス)のインスタンスかを調べる組み込み関数。

issubclass():あるクラスが別のクラスの派生クラスかを調べる組み込み関数。

iter():オブジェクトからイテレータを取り出す組み込み関数。for 文は内部でこれを呼ぶ。

json:リストや辞書などのデータを JSON 形式の文字列に変換したり戻したりする標準モジュール。

KeyError:辞書に存在しないキーを指定したときに発生する例外。

locale:地域や文化によって違うデータ形式(数値の桁区切りなど)を扱う標準モジュール。

logging:ログを出力する標準モジュール。既定では info() と debug() の出力は抑えられ、標準エラー出力に送られる。

math:浮動小数点演算のための C ライブラリ関数を使える標準モジュール。math.cos() や math.log() など。

next():イテレータから次の要素を取り出す組み込み関数。

nonlocal 文:入れ子の関数の中で、指定した名前を外側の関数のスコープのものとして扱う宣言。

open():ファイルを開いてファイルオブジェクトを返す組み込み関数。mode は 'r'(既定)・'w'・'a'・'r+' などで、'b' を付けるとバイナリモード。

os:オペレーティングシステムと対話する関数を提供する標準モジュール。import os の形で使う。

pass 文:何もしない文。構文上は文が必要だが処理は要らないときや、書きかけのコードの仮置きに使う。

pprint:入れ子のデータ構造を見やすく整形して表示する標準モジュール。

random:乱数に基づいて要素を選ぶ標準モジュール。choice()・sample()・random()・randrange() など。

raw 文字列:最初のクォートの前に r を付けた文字列。\ を特殊文字として解釈しない。

re:正規表現による高度な文字列処理を提供する標準モジュール。単純な処理なら文字列メソッドの方が読みやすい。

reprlib:大きなコンテナや深い入れ子を省略して表示する repr() を提供する標準モジュール。

self:メソッドの第 1 引数に付ける慣習上の名前。呼び出したインスタンスが渡される。名前自体に特別な意味は無い。

shutil:ファイルやディレクトリのコピー・移動など、日常的な管理を高水準で行う標準モジュール。

smtplib:メールを送信するための標準モジュール。

sqlite3:SQLite データベースライブラリを Python から使うための標準モジュール。データを永続的に保存し SQL で扱える。

statistics:平均(mean)・中央値(median)・分散(variance)など基本的な統計量を求める標準モジュール。

StopIteration:イテレータに要素がもう無いことを知らせる例外。for ループはこれを受けて終わる。

string.Template:$name の形のプレースホルダに値を差し込むクラス。substitute() は値が無いと KeyError、safe_substitute() はそのまま残す。

struct:pack() と unpack() でバイナリのレコード形式を扱う標準モジュール。

super():親クラス(基底クラス)のメソッドを呼び出すための組み込み関数。

sys.argv:スクリプト名とそれに続く引数を文字列のリストで持つ変数。スクリプト名も引数も無いと sys.argv[0] は空文字列になる。

sys.exit():スクリプトを終了させる最も直接的な方法。SystemExit 例外を送出する。

sys.stderr:標準エラー出力を表す sys の属性。stdout をリダイレクトしても読める警告やエラーの出力に使う。

textwrap:段落を指定した幅に折り返して整形する標準モジュール。

threading:処理をスレッドに分けて並行に実行する標準モジュール。スレッド間の調整には queue モジュールが勧められる。

timeit:小さなコード片の実行時間を計測する標準モジュール。大きなコードには profile や pstats を使う。

unittest:別ファイルに網羅的なテストを書いて実行できる標準モジュール。

urllib.request:URL からデータを取得するための標準モジュール。

weakref:参照を増やさずにオブジェクトを追跡できる標準モジュール。

zlib:データを圧縮・展開する標準モジュール。gzip・bz2・lzma・zipfile・tarfile も同じ用途で使える。

イテレータ:要素を 1 つずつ取り出せるオブジェクト。__next__() で次の要素を返し、要素が無くなると StopIteration を送出する。

イミュータブル:作った後で内容を変更できない性質。数値・文字列・タプルなどがイミュータブル。

インスタンス:クラスを呼び出して作ったオブジェクト。データ属性とメソッドを持つ。

インスタンス変数:self.name = ... のように各インスタンスに代入する、インスタンスごとに固有の変数。

オーバーライド:派生クラスで、基底クラスと同じ名前のメソッドを定義して動きを上書きすること。

ガベージコレクション:使われなくなったオブジェクトのメモリを自動で回収する仕組み。Python は参照カウントと合わせて循環参照を取り除く。

キュー:最初に入れた要素を最初に取り出すデータ構造。Python では collections.deque を使う。

クラス:データと機能をひとまとめにする仕組み。class 文で定義し、呼び出すとインスタンスが作られる。

クラスオブジェクト:class 文の本体を最後まで実行すると作られるオブジェクト。属性参照とインスタンス化の 2 つの操作ができる。

クラス変数:クラスの中で定義し、すべてのインスタンスで共有される変数。

ジェネレータ:yield 文で値を 1 つずつ返す関数。呼ぶとイテレータを返し、呼び出しの間でローカル変数や実行状態を保つ。

ジェネレータ式:リスト内包表記の角括弧を丸括弧に替えた形の式。同じ内容のリスト内包表記よりメモリ使用量を抑えられることが多い。

スコープ:名前空間を直接参照できるプログラム上の範囲。名前は内側のスコープから順に探される。

ダイヤモンド継承:多重継承で、同じ祖先クラスに複数の経路でたどり着く関係。祖先を一度だけたどる順序で属性を探す。

ミュータブル:作った後でも内容を変更できる性質。リスト・辞書・集合などがミュータブル。

メソッド:クラスの中で定義した関数。x.f() は MyClass.f(x) と同じで、インスタンスが第 1 引数として渡される。

メソッド解決順序:メソッドや属性を探す基底クラスの順番。多重継承で使われる。

モジュール:定義や文を書いた .py ファイル。import で読み込んで、その中の関数や変数を使う。

リスト内包表記:[式 for 変数 in イテラブル if 条件] の形でリストを簡潔に作る書き方。

ローカル変数:関数の中で代入した変数。関数のローカルなシンボル表に入り、関数の外からは見えない。

継承:既存のクラス(基底クラス)の機能を引き継いで新しいクラス(派生クラス)を作ること。メソッドを上書き(オーバーライド)できる。

多重継承:複数の基底クラスを継承すること。属性は基本的に深さ優先・左から右の順に探される。

標準ライブラリ:Python に最初から付属するモジュールの集まり。追加のインストールなしで使える。

名前空間:名前からオブジェクトへの対応付け。組み込み・モジュールのグローバル・関数のローカルなどがあり、それぞれ独立している。

名前修飾:__spam のような名前をクラスの中で _クラス名__spam に置き換える仕組み。派生クラスとの名前の衝突を避ける。

用語集で全部の用語を見る →

独学の次に、講座で体系立てて学びたい人へ

この問題集は独学用です。IT の基礎から講師つきで体系立てて学びたい人には、資格や IT の講座がそろうスクールも選択肢になります。

本ページは広告・アフィリエイトプログラムを利用しており、リンク経由でのお申し込み・購入により当サイトに収益が発生することがあります。ただし、ランキング・評価・掲載内容は広告費や報酬の有無に関わらず編集部の独自基準で決定しており、広告主からの指示により内容を変更することはありません。

ヒューマンアカデミー(資格・IT/Webスクール)PR

IT・Webデザイン・資格まで幅広い講座。生成AI/DX講座はリスキリング補助金の対象

ヒューマンアカデミー(資格・IT/Webスクール)の広告無料で講座資料を探す →

まずは無料ではじめられます。リンク先は公式サイトです。

このサービスの解説記事を読む →