Python 3 エンジニア認定基礎試験 インタープリタと入門 問題

ゆめさくが作った練習問題です。本試験の問題ではありません。

インタープリタと入門の問題を2⁠2問、小分野ごとにまとめました。選ぶと、その場で正誤と解説が出ます。

ログインなしで解けます。答えはこのブラウザの中だけに残り、どこにも送りません。

この分野の小分野

  • インタープリタと対話環境(7問)
  • 数と文字列とリスト(15問)

インタープリタと入門の問題

22 問

選ぶと、すぐに正誤と解説が出ます。選んだ答えは変えられません。

  1. インタープリタと対話環境

    問 1Python という名前の由来として、チュートリアルで説明されているものはどれですか。

  2. 問 2チュートリアル1章が説明する Python の特徴として正しいものはどれですか。

  3. 問 3シェルで次のコマンドを実行したときの出力として正しいものはどれですか。

    python3 -c "import sys; print(sys.argv)" a b
  4. 問 4Python のソースファイルの文字コードについて、正しい説明はどれですか。

  5. 問 5スクリプトを実行し終えたあと、終了せずにそのまま対話モードに入りたいとき、スクリプト名の前に付けるオプションはどれですか。

  6. 問 6対話モードで string.a のようなドットで区切った式を入力して Tab キーを押したときの動きとして正しいものはどれですか。

  7. 問 7対話的なインタープリタの入力の履歴について、既定の設定での説明として正しいものはどれですか。

  8. 数と文字列とリスト

    問 8次のコードを実行したときの出力として正しいものはどれですか。

    print(7 / 2, 7 // 2, 7 % 2)
  9. 問 9次のコードを実行したときの出力として正しいものはどれですか。

    a = [1, 2, 3]
    b = a
    c = a[:]
    b.append(4)
    print(len(a), len(c))
  10. 問 10次のコードを実行したときの出力として正しいものはどれですか。

    print(-2 ** 2, 2 ** -1)
  11. 問 11対話モードで次の3行を順に入力したとき、最後の行で表示される値はどれですか。

    4 * 5
    y = 3
    _ + y
  12. 問 12I'm という3文字の文字列を表すリテラルとして正しいものはどれですか。

  13. 問 13次のコードを実行したときの出力として正しいものはどれですか。

    print(len(r'a\nb'), len('a\nb'))
  14. 問 14次のコードを実行したときの出力として正しいものはどれですか。

    s = """\
    ab
    cd\
    """
    print(len(s))
  15. 問 15次のコードを実行したときの出力として正しいものはどれですか。

    a = [1, 2]
    b = a + [3]
    print(a, b)
  16. 問 16prefix = 'Py' と代入したあとに書いたとき、構文エラーになる式はどれですか。

  17. 問 17次のコードを実行したときの出力として正しいものはどれですか。

    word = 'Python'
    print(word[-2], word[1:3])
  18. 問 18s = 'abc' のとき、エラーになる式はどれですか。

  19. 問 19word = 'cat' のとき、word を 'bat' にする書き方として正しいものはどれですか。

  20. 問 20次のコードを実行したときの出力として正しいものはどれですか。

    rows = [[1, 2, 3], [4, 5]]
    print(len(rows), len(rows[1]), rows[1][0])
  21. 問 21次のコードを実行したときの出力として正しいものはどれですか。

    letters = ['a', 'b', 'c', 'd', 'e']
    letters[1:3] = ['X']
    print(letters, len(letters))
  22. 問 22次のコードを実行したときの出力として正しいものはどれですか。

    a, b = 1, 2
    while b < 20:
        a, b = b, a * b
        print(b, end=',')

22 問中 0 問に答えました

解説の一覧

解いたあとに読み返せるよう、全問の解説を並べています。問いを開くと解説が出ます。

インタープリタと対話環境

問1Python という名前の由来として、チュートリアルで説明されているものはどれですか。

正解は「コメディ番組 Monty Python's Flying Circus」です。チュートリアル1章の終わりに、Python という名前は イギリスのコメディ番組 Monty Python's Flying Circus から来ていて、爬虫類とは関係がないと書かれています。文書の中でこの番組の寸劇に触れることは、許されているだけでなく勧められているとも書かれています。「大きな蛇のニシキヘビ」は英語の python の意味ですが、チュートリアルは爬虫類とは関係ないとはっきり書いています。「ギリシャ神話に出てくる大蛇」も英単語の語源としてはありえますが、言語の名前の由来ではありません。「最初に作られた計算機の名前」という話はチュートリアルのどこにも出てきません。名前は番組から取った、と覚えておけば迷いません。 出典 https://docs.python.org/ja/3/tutorial/appetite.html

問2チュートリアル1章が説明する Python の特徴として正しいものはどれですか。

正解は「インタープリタ言語なので、コンパイルとリンクが要らない」です。1章では、Python はインタープリタ言語で、コンパイルやリンクが要らないため開発の時間を大きく減らせると説明しています。インタープリタは対話的にも使えるので、機能を試したり関数を確かめたりするのも手軽です。「変数や引数は、使う前に型を宣言する必要がある」は逆で、プログラムが短くなる理由の1つとして、変数や引数の宣言が要らないことが挙げられています。「文のまとまりは、始まりと終わりの括弧で囲んで表す」も逆で、Python は括弧ではなくインデントで文をまとめます。「C で書いた関数やモジュールを足すことはできない」も誤りです。C を書ければ新しい組み込み関数やモジュールを足せる拡張性がある、と書かれています。 出典 https://docs.python.org/ja/3/tutorial/appetite.html

問3シェルで次のコマンドを実行したときの出力として正しいものはどれですか。
python3 -c "import sys; print(sys.argv)" a b

正解は「['-c', 'a', 'b']」です。python3 -c のあとに書いた文字列は、ファイルではなくその場で実行する文として扱われます。インタープリタに渡した引数は文字列のリストになって sys モジュールの argv に入りますが、-c を使ったときの sys.argv[0] は '-c' という文字列になる、とチュートリアル2章に書かれています。続く a と b はそのまま後ろに並ぶので、出力は ['-c', 'a', 'b'] です。「['a', 'b']」は先頭の要素を忘れた形で、sys.argv は少なくとも1つの要素を持ちます。「['python3', 'a', 'b']」はコマンドの名前が入ると考えた思い違いです。「['-c', 'import sys; print(sys.argv)', 'a', 'b']」のように実行した文そのものが argv に入ることはありません。 出典 https://docs.python.org/ja/3/tutorial/interpreter.html#argument-⁠passing

問4Python のソースファイルの文字コードについて、正しい説明はどれですか。

正解は「何も宣言しなければ UTF-⁠8 として読まれる」です。チュートリアル2章によると、Python のソースファイルは既定で UTF-⁠8 でエンコードされているものとして扱われます。そのため、文字列やコメントに日本語をそのまま書いても、宣言なしで動きます。「何も宣言しなければ ASCII として読まれる」は古い版の Python 2 の既定で、Python 3 には当てはまりません。「文字コードの宣言は、ファイルのどの行に書いてもよい」は誤りで、既定以外の文字コードを使うときは、# -*- coding: cp1⁠2⁠5⁠2 -*- のような特別なコメントをファイルの先頭の行に置きます。「shebang の行があるファイルには、文字コードを宣言できない」も誤りで、shebang で始まるときは例外として2行目に宣言を書きます。 出典 https://docs.python.org/ja/3/tutorial/interpreter.html#source-⁠code-⁠encoding

問5スクリプトを実行し終えたあと、終了せずにそのまま対話モードに入りたいとき、スクリプト名の前に付けるオプションはどれですか。

正解は「-i」です。チュートリアル2章には、スクリプトを実行したあとに対話モードに入れると便利なことがあり、そのときはスクリプトファイル名の前に -i を付ける、と書かれています。たとえば python3 -i calc.py と起動すると、calc.py の実行が終わったあとに >>> のプロンプトが出て、スクリプトで作った変数をそのまま調べられます。「-c」は、続く文字列をその場で実行する文として扱うオプションで、対話モードには入りません。「-m」は、モジュールを探してスクリプトとして実行するオプションです。「-u」は、標準出力と標準エラーをバッファしないようにするオプションで、対話モードとは関係ありません。 出典 https://docs.python.org/ja/3/tutorial/interpreter.html#invoking-⁠the-⁠interpreter

問6対話モードで string.a のようなドットで区切った式を入力して Tab キーを押したときの動きとして正しいものはどれですか。

正解は「最後のドットまでの式を評価し、その結果の属性から候補を出す」です。チュートリアル1⁠4章によると、変数とモジュール名の補完はインタープリタの起動時に自動で有効になり、Tab キーで補完が呼ばれます。string.a のようにドットで区切った式では、最後のドットまでの式を評価し、得られたオブジェクトの属性から候補を出します。式を評価するので、__getattr__ を持つオブジェクトではアプリケーションのコードが動くかもしれない、という注意も書かれています。「式は評価せず、入力した綴りだけを見て候補を出す」は、評価するという説明と逆です。「ドットを含む式では補完が働かず、Tab の文字が入る」も誤りで、ドットの式こそ属性の補完が働きます。「標準ライブラリのモジュール名だけを候補として出す」は狭すぎで、文の名前やローカル変数も候補になります。 出典 https://docs.python.org/ja/3/tutorial/interactive.html#tab-⁠completion-⁠and-⁠history-⁠editing

問7対話的なインタープリタの入力の履歴について、既定の設定での説明として正しいものはどれですか。

正解は「ユーザーのホームディレクトリの .python_history に保存される」です。チュートリアル1⁠4章には、既定の設定ではユーザーのディレクトリにある .python_history という名前のファイルに履歴を保存し、その履歴は次の対話セッションでも使える、と書かれています。上矢印キーで前に打った行を呼び出せるのは、この仕組みのおかげです。「いま開いているディレクトリの history.txt に保存される」は、場所もファイル名も違います。「セッションを閉じると消え、どこにも保存されない」は、次のセッションで再び使えるという説明と合いません。「シェルの履歴ファイル .bash_history に書き足される」も誤りで、Python はシェルとは別の自分の履歴ファイルを持ちます。 出典 https://docs.python.org/ja/3/tutorial/interactive.html#tab-⁠completion-⁠and-⁠history-⁠editing

数と文字列とリスト

問8次のコードを実行したときの出力として正しいものはどれですか。
print(7 / 2, 7 // 2, 7 % 2)

正解は「3.5 3 1」です。/ による除算は、整数どうしでも常に浮動小数点数を返すので、7 / 2 は 3.5 です。// は切り捨て除算で、小数部を切り捨てた 3 になります。% は剰余を返す演算子で、7 を 2 で割った余りの 1 です。print は引数の間に空白を入れて並べるので、出力は 3.5 3 1 です。「3 3 1」は、/ が整数どうしなら整数を返すと考えた思い違いです。「3.5 3.5 1」は、// も / と同じ結果になると考えています。「3.5 3 0.5」は、% が割り算の小数部を返すと考えた思い違いで、% が返すのは余りです。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#numbers

問9次のコードを実行したときの出力として正しいものはどれですか。
a = [1, 2, 3]
b = a
c = a[:]
b.append(4)
print(len(a), len(c))

正解は「4 3」です。単純な代入では Python はデータをコピーしません。b = a のあと、a と b は同じ1つのリストを指すので、b.append(4) で足した要素は a から見ても見えます。そのため len(a) は 4 です。一方、a[:] のようなスライスは要素を持つ新しいリスト、つまり浅いコピーを返します。c は append の前に作った別のリストなので、要素は 3 つのままです。出力は 4 3 になります。「3 3」は、b = a でコピーが作られると考えた思い違いです。「4 4」は、スライスも元のリストを指すだけだと考えています。「3 4」は、a と c の関係を逆にとらえています。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#lists

問10次のコードを実行したときの出力として正しいものはどれですか。
print(-2 ** 2, 2 ** -1)

正解は「-4 0.5」です。** は冪乗の演算子です。冪乗の演算は、左にある単項演算子のマイナスより強く結びつきます。そのため -2 ** 2 は (-2) ** 2 ではなく -(2 ** 2) と読まれ、-4 になります。また、整数どうしの冪乗でも、右の数が負のときは浮動小数点数が返ります。2 ** -1 は 2 の -1 乗で 0.5 です。出力は -4 0.5 です。「4 0.5」は、マイナスが先に 2 に付くと考えた思い違いです。「4 0」と「-4 0」は、整数どうしの計算なら結果も整数になり、0.5 が切り捨てられると考えています。負の数を2乗したいときは (-2) ** 2 のように丸括弧で囲みます。 出典 https://docs.python.org/ja/3/reference/expressions.html#the-⁠power-⁠operator

問11対話モードで次の3行を順に入力したとき、最後の行で表示される値はどれですか。
4 * 5
y = 3
_ + y

正解は「2⁠3」です。対話モードでは、最後に表示された式の値が変数 _ に入ります。1行目の 4 * 5 は式なので 2⁠0 が表示され、_ は 2⁠0 になります。2行目の y = 3 は代入なので値は表示されず、_ も変わりません。3行目の _ + y は 2⁠0 + 3 で、2⁠3 が表示されます。「6」は、代入した 3 が _ に入ると考えた思い違いです。_ が変わるのは式の値が表示されたときだけです。「2⁠0」は、_ + y の計算をしていません。「NameError になる」は、_ が対話モードで自動で用意されることを知らないときの思い違いです。なお、_ に自分で値を代入すると特別な働きが隠れてしまうので、読み取り専用として扱います。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#numbers

問12I'm という3文字の文字列を表すリテラルとして正しいものはどれですか。

正解は「'I\'m'」です。シングルクォートで囲んだ文字列の中にシングルクォートを書くときは、直前にバックスラッシュを付けてエスケープします。'I\'m' は I と ' と m の3文字の文字列になります。ダブルクォートで "I'm" と囲む書き方でも同じ文字列を作れます。「'I'm'」は、2つ目のシングルクォートで文字列が終わってしまい、構文エラーになります。「'I''m'」はエラーにはなりませんが、'I' と 'm' という2つのリテラルが並んだものとして自動で連結され、Im の2文字になります。「'I"m'」は、シングルクォートの代わりにダブルクォートの文字が入った別の文字列です。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#text

問13次のコードを実行したときの出力として正しいものはどれですか。
print(len(r'a\nb'), len('a\nb'))

正解は「4 3」です。クォートの前に r を付けた raw 文字列では、バックスラッシュのあとの文字を特殊文字として解釈しません。r'a\nb' は a、バックスラッシュ、n、b の4文字なので、長さは 4 です。一方、ふつうの文字列 'a\nb' では \n が改行の1文字になるので、a と改行と b の3文字で、長さは 3 です。出力は 4 3 になります。「3 3」は、r を付けても \n が改行になると考えた思い違いです。「3 4」は、raw 文字列とふつうの文字列の扱いを逆にしています。「4 4」は、ふつうの文字列でも \n が2文字のまま残ると考えています。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#text

問14次のコードを実行したときの出力として正しいものはどれですか。
s = """\
ab
cd\
"""
print(len(s))

正解は「5」です。三重引用符の文字列は複数行にまたがって書け、行の終わりの改行は自動で文字列に入ります。ただし行末にバックスラッシュを置くと、その改行は入りません。このコードでは、1行目の """ の直後にバックスラッシュがあるので最初の改行は入りません。ab のあとの改行は入り、cd の後ろのバックスラッシュで次の改行は入りません。s は a、b、改行、c、d の5文字になり、出力は 5 です。「7」は、バックスラッシュを無視して改行が3つとも入ると数えています。「6」は、バックスラッシュの働きを片方だけ数えています。「4」は、ab と cd の間の改行も文字列に入らないと考えた思い違いです。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#text

問15次のコードを実行したときの出力として正しいものはどれですか。
a = [1, 2]
b = a + [3]
print(a, b)

正解は「[1, 2] [1, 2, 3]」です。リストは + で連結できます。a + [3] は a の要素と [3] の要素を並べた新しいリストを作って返すので、b は [1, 2, 3] になります。このとき元の a は書き換わらず、[1, 2] のままです。出力は [1, 2] [1, 2, 3] です。「[1, 2, 3] [1, 2, 3]」は、+ が a そのものに要素を足すと考えた思い違いで、それは append の働きです。「[1, 2] [1, 2, [3]]」は、[3] がリストのまま1つの要素として入ると考えています。+ は要素どうしを並べます。「[1, 2, 3] [1, 2]」は、a と b の中身を取り違えています。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#lists

問16prefix = 'Py' と代入したあとに書いたとき、構文エラーになる式はどれですか。

正解は「prefix 'thon'」です。クォートで囲んだ文字列リテラルどうしを隣に並べると、自動で連結されます。ただしこの連結はリテラルどうしだけに働き、変数や式とリテラルを並べても連結されません。そのため prefix 'thon' は構文エラーになります。「prefix + 'thon'」は、変数とリテラルを + で連結する正しい書き方で、Python になります。「'Py' 'thon'」はリテラルどうしなので自動で連結され、Python になります。「('Py' 'thon') * 2」は、丸括弧の中で連結された Python を * で2回繰り返すので、PythonPython になります。変数を含めてつなぎたいときは、必ず + を使うと覚えておきましょう。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#text

問17次のコードを実行したときの出力として正しいものはどれですか。
word = 'Python'
print(word[-2], word[1:3])

正解は「o yt」です。インデックスに負の数を書くと右から数えます。-1 が最後の文字なので、word[-2] は後ろから2番目の o です。スライス word[1:3] は、開始位置の文字を含み、終了位置の文字を含みません。1番目の y から始まり、3番目の h の手前で止まるので yt です。出力は o yt になります。「n yt」は、負のインデックスが -0 から始まると考え、-2 を後ろから1つ目と数えた思い違いです。「o yth」と「n yth」は、スライスの終了位置の文字まで含めると考えています。インデックスは文字と文字の間を指す、と考えるとスライスの範囲を数えやすくなります。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#text

問18s = 'abc' のとき、エラーになる式はどれですか。

正解は「s[3]」です。文字列の長さを超えるインデックスで1文字を取り出そうとするとエラーになります。s は3文字で、使えるインデックスは 0 から 2 までなので、s[3] は IndexError になります。一方、スライスでは範囲の外の値を書いてもエラーにならず、範囲の中に収まる部分だけが取り出されます。「s[1:1⁠0]」は終わりが長さを超えていますが、1番目から最後までの bc が返ります。「s[5:]」は始まりが長さを超えているので、空の文字列が返ります。「s[-1⁠0:2]」は始まりが左の端を超えていますが、先頭から2番目の手前までの ab が返ります。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#text

問19word = 'cat' のとき、word を 'bat' にする書き方として正しいものはどれですか。

正解は「word = 'b' + word[1:]」です。Python の文字列は不変 (immutable) で、作ったあとに中身を変えられません。インデックスやスライスの位置に代入すると TypeError になります。別の文字列が要るときは、新しい文字列を作って変数に代入し直します。'b' + word[1:] は、'b' と 'at' を連結した新しい文字列 'bat' を作るので正しい書き方です。「word[0] = 'b'」は、文字列の1文字に代入しようとしているので TypeError になります。「word[:1] = 'b'」は、スライスへの代入で、文字列では同じく TypeError になります。「word[0:1] = ['b']」は、リストならできるスライスへの代入ですが、文字列には使えません。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#text

問20次のコードを実行したときの出力として正しいものはどれですか。
rows = [[1, 2, 3], [4, 5]]
print(len(rows), len(rows[1]), rows[1][0])

正解は「2 2 4」です。リストの中にリストを入れて、入れ子にできます。rows は [1, 2, 3] と [4, 5] の2つのリストを要素に持つので、len(rows) は 2 です。len は中の要素の数を数えるだけで、さらに内側の要素までは数えません。rows[1] は2つ目の要素 [4, 5] なので、len(rows[1]) は 2 です。rows[1][0] は、その [4, 5] の0番目の 4 です。出力は 2 2 4 になります。「5 2 4」は、len が内側のリストの要素まで足し合わせると考えた思い違いです。「2 3 4」は、rows[1] を1つ目のリストと取り違えています。インデックスは 0 から数えます。「2 2 1」は、rows[1][0] を rows[0][0] と読み違えています。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#lists

問21次のコードを実行したときの出力として正しいものはどれですか。
letters = ['a', 'b', 'c', 'd', 'e']
letters[1:3] = ['X']
print(letters, len(letters))

正解は「['a', 'X', 'd', 'e'] 4」です。リストはスライスに代入でき、代入するリストの長さが違えばリストの長さも変わります。letters[1:3] は1番目の 'b' と2番目の 'c' の2つの範囲で、そこを ['X'] の1要素に置き換えます。結果は ['a', 'X', 'd', 'e'] で、要素は 4 つになります。出力は ['a', 'X', 'd', 'e'] 4 です。「['a', 'X', 'c', 'd', 'e'] 5」は、スライスの代入が先頭の1つだけを置き換えると考えた思い違いです。「['a', 'X', 'X', 'd', 'e'] 5」は、範囲の長さに合わせて 'X' が繰り返されると考えています。「['a', 'X', 'c'] 3」は、スライスへの代入で、置き換えた位置より後ろが切り捨てられると考えた思い違いです。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#lists

問22次のコードを実行したときの出力として正しいものはどれですか。
a, b = 1, 2
while b < 20:
    a, b = b, a * b
    print(b, end=',')

正解は「2,4,8,3⁠2,」です。a, b = b, a * b は多重代入で、まず右辺の式がすべて評価され、そのあとで代入されます。そのため a * b には代入の前の a が使われます。順に追うと、(1, 2) から (2, 2) になり 2 を表示、(2, 4) になり 4、(4, 8) になり 8、(8, 3⁠2) になり 3⁠2 を表示します。b が 3⁠2 で b < 2⁠0 が偽になり、ループが終わります。print の end=',' で各値の後ろに改行ではなくコンマが付くので、出力は 2,4,8,3⁠2, です。「4,1⁠6,2⁠5⁠6,」は、a = b と b = a * b を1行ずつ順に実行したと考えた思い違いです。「2,4,8,」は、b が 2⁠0 を超えた回の表示を落としています。条件はループの頭で調べます。「2,4,8,3⁠2」は、最後の値の後ろにも end のコンマが付くことを見落としています。 出典 https://docs.python.org/ja/3/tutorial/introduction.html#first-⁠steps-⁠towards-⁠programming

ほかの分野

Python 3 エンジニア認定基礎試験の頁に、6分野の入口と試験の案内があります。

続きはゆめさくで

試験の知識を仕事につなげる一歩を、ここにまとめています。