Python 3 エンジニア認定基礎試験 制御構造と関数 問題

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

制御構造と関数の問題を2⁠2問、小分野ごとにまとめました。選ぶと、その場で正誤と解説が出ます。

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

この分野の小分野

  • 条件分岐とループ(11問)
  • 関数の定義と引数(11問)

制御構造と関数の問題

22 問

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

  1. 条件分岐とループ

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

    x = 7
    if x > 5:
        print('大')
    elif x > 3:
        print('中')
    else:
        print('小')
  2. 問 2if 文の elif と else の書き方について、正しい説明はどれですか。

  3. 問 3辞書 d を for 文で回しながら、条件に合うキーを del で消したいとします。チュートリアルが勧める書き方として正しいものはどれですか。

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

    print(list(range(10, 0, -3)))
  5. 問 5組み込み関数 range() が返すオブジェクトについて、正しい説明はどれですか。

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

    pairs = []
    for i in range(3):
        for j in range(3):
            if j == 1:
                break
            pairs.append((i, j))
    print(pairs)
  7. 問 7次のコードを実行したときの出力として正しいものはどれですか。

    total = 0
    for n in range(1, 6):
        if n % 2 == 0:
            continue
        total += n
    print(total)
  8. 問 8次のコードを実行したときの出力として正しいものはどれですか。

    n = 12
    while n > 0:
        n -= 4
        if n == 0:
            break
    else:
        print('else', end=' ')
    print(n)
  9. 問 9for ループに付けた else 節が実行される場合として、正しい説明はどれですか。

  10. 問 10pass 文の説明として正しいものはどれですか。

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

    vals = [0, 0.0, '', 'False', [], [0], None]
    count = 0
    for v in vals:
        if v:
            count += 1
    print(count)
  12. 関数の定義と引数

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

    def greet(name):
        print('hi', name)
    
    r = greet('aya')
    print(r)
  13. 問 13関数のドキュメンテーション文字列 (docstring) について、正しい説明はどれですか。

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

    count = 0
    
    def up():
        count = 5
        return count
    
    print(up(), count)
  15. 問 15次のコードを実行したときの出力として正しいものはどれですか。

    def add(item, bag=[]):
        bag.append(item)
        return bag
    
    add('a')
    print(add('b'), add('c', []))
  16. 問 16次の関数 order を呼び出す書き方のうち、エラーにならないものはどれですか。

    def order(item, qty=1, note=''):
        return f'{item} x{qty} {note}'
  17. 問 17次のコードを実行したときの出力として正しいものはどれですか。

    def show(*args, **kwargs):
        print(type(args).__name__, type(kwargs).__name__, len(args), len(kwargs))
    
    show(1, 2, x=3)
  18. 問 18引数 a を位置専用、b を位置またはキーワード、c をキーワード専用にする関数定義はどれですか。

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

    def area(w, h, unit='cm'):
        return f'{w * h}{unit}'
    
    size = [3, 4]
    opts = {'unit': 'm'}
    print(area(*size, **opts))
  20. 問 20次のコードを実行したときの出力として正しいものはどれですか。

    def make_scaler(k):
        return lambda x: x * k
    
    double = make_scaler(2)
    triple = make_scaler(3)
    print(double(5), triple(double(1)))
  21. 問 21関数アノテーションについて、正しい説明はどれですか。

  22. 問 22チュートリアルが挙げる PEP 8 のコーディングスタイルの要点として、正しいものはどれですか。

22 問中 0 問に答えました

解説の一覧

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

条件分岐とループ

問1次のコードを実行したときの出力として正しいものはどれですか。
x = 7
if x > 5:
    print('大')
elif x > 3:
    print('中')
else:
    print('小')

正解は「大」です。if 文は上から順に条件を調べ、最初に真になった部分の本体だけを実行します。elif は else if を縮めた語で、それより前の条件がすべて偽だったときにだけ調べられます。このコードでは x が 7 なので、まず x > 5 が真になり 大 を出力します。x > 3 も真ですが、すでに if の部分が選ばれているので elif の本体は実行されず、そこで if 文全体が終わります。「大 と 中 の 2 行」は、真になる条件の本体をすべて実行すると考えた誤りです。「中」は、後ろに書いた条件ほど優先されると考えた誤りです。「大 と 中 と 小 の 3 行」は、else まで続けて実行されると考えた誤りで、else はどの条件も偽だったときだけ動きます。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#if-⁠statements

問2if 文の elif と else の書き方について、正しい説明はどれですか。

正解は「elif は else if を縮めた語で、0 個以上書けて else は省ける」です。チュートリアルの if 文の節には、elif の部分はゼロ個以上置けること、else の部分は付けても付けなくてもよいこと、elif は else if を短くした語で深いインデントを避けるのに役立つことが書かれています。if と elif をいくつも並べる形は、ほかの言語の switch 文や case 文の代わりになります。「1 つまでしか書けない」は誤りで、elif はいくつでも並べられます。「最後に else を必ず書く」も誤りで、else が無ければ、どの条件も偽のときは何もせずに if 文が終わります。「丸括弧で囲まなければならない」も誤りで、if n == 0 のように括弧なしで書くのが普通です。括弧を付けても動きますが、必須ではありません。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#if-⁠statements

問3辞書 d を for 文で回しながら、条件に合うキーを del で消したいとします。チュートリアルが勧める書き方として正しいものはどれですか。

正解は「for k, v in d.copy().items() の中で del d[k] とする」です。チュートリアルの for 文の節は、コレクションを反復しながら同じコレクションを変更するコードを正しく書くのは難しく、コピーを反復するか新しいコレクションを作るほうが簡単だと述べ、users.copy().items() を回して del する例を示しています。d.copy() は別の辞書なので、元の d からキーを消しても反復には響きません。ほかの 3 つは、どれも反復している辞書そのものからキーを消しています。d.items() も d も d.keys() も元の辞書を見ているため、反復の途中で大きさが変わると、次の要素を取りに行くところで RuntimeError が起きます。M6 の Python 3.1⁠2 で、copy() を回す形は消したあとの辞書を表示し、items() を直接回す形は RuntimeError になることを確かめました。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#for-⁠statements

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

正解は「[1⁠0, 7, 4, 1]」です。range(開始, 終わり, 増加量) は、開始の値から増加量ずつ進む等差数列を作り、終わりの値そのものは含みません。増加量は負でもよく、そのときは値が小さくなる向きに進みます。range(1⁠0, 0, -3) は 1⁠0 から始まり、1⁠0、7、4、1 と 3 ずつ減っていきます。次の -2 は終わりの 0 を越えるので作られません。list() に渡すと、その値を並べたリスト [1⁠0, 7, 4, 1] になります。「[]」は、開始が終わりより大きいと何も作られないと考えた誤りで、増加量が負なら減る向きに作られます。「[1⁠0, 7, 4]」は、1 を作り忘れた誤りです。1 は 0 より大きいので含まれます。「[9, 6, 3, 0]」は、開始の値を含まず終わりの値を含むと、両端を逆に考えた誤りです。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#the-⁠range-⁠function

問5組み込み関数 range() が返すオブジェクトについて、正しい説明はどれですか。

正解は「反復すると要素を順に返すイテラブルで、リストではない」です。チュートリアルの range() の節には、range() が返すオブジェクトはいろいろな点でリストのように振る舞うが本当はリストではなく、反復したときに数列の要素を順に返すオブジェクトで、リストを作らないので場所の節約になると書かれています。こうしたオブジェクトをイテラブルと呼びます。「すぐに全要素を持つリストを作る」は、まさにリストではない点と食い違います。「print で [0, 1, 2] のように並ぶ」も誤りで、print(range(3)) は range(0, 3) と表示されます。中身を並べて見たいときは list(range(3)) とします。「sum には渡せない」も誤りで、sum() はイテラブルを受け取るので sum(range(3)) は 3 になります。M6 の Python 3.1⁠2 で、range(3) の表示、型の名前、sum の結果、list にしたときの中身を確かめました。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#the-⁠range-⁠function

問6次のコードを実行したときの出力として正しいものはどれですか。
pairs = []
for i in range(3):
    for j in range(3):
        if j == 1:
            break
        pairs.append((i, j))
print(pairs)

正解は「[(0, 0), (1, 0), (2, 0)]」です。break 文は、その文を囲むいちばん内側の for ループか while ループだけを抜けます。外側のループは止まらずに次の反復へ進みます。このコードでは、i が 0 のとき内側で j が 0 なので (0, 0) を足し、j が 1 になったところで break して内側のループだけを抜けます。外側は i を 1 に進め、同じように (1, 0) を足してから抜け、i が 2 でも (2, 0) を足します。「[(0, 0)]」は、break で外側のループまで止まると考えた誤りです。「(0, 2) などを含む 6 組」は、break を continue のように j が 1 の回だけ飛ばす文と取り違えた誤りです。「[(0, 0), (0, 1), (0, 2)]」は、break が内側のループに効かないと考えた誤りです。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#break-⁠and-⁠continue-⁠statements

問7次のコードを実行したときの出力として正しいものはどれですか。
total = 0
for n in range(1, 6):
    if n % 2 == 0:
        continue
    total += n
print(total)

正解は「9」です。continue 文は、ループの本体の残りを飛ばして、次の反復に進みます。ループそのものは終わりません。range(1, 6) は 1 から 5 までを作ります。n が偶数の 2 と 4 では continue によって total += n が飛ばされ、奇数の 1、3、5 だけが足されます。そのため total は 1 + 3 + 5 で 9 になります。「6」は、偶数の 2 と 4 だけを足したと読んだ誤りで、continue で飛ばされるのは偶数のほうです。「1」は、continue を break と取り違え、最初の偶数 2 でループが終わると考えた誤りです。「1⁠5」は、continue が何もしないと考えて 1 から 5 をすべて足した誤りです。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#break-⁠and-⁠continue-⁠statements

問8次のコードを実行したときの出力として正しいものはどれですか。
n = 12
while n > 0:
    n -= 4
    if n == 0:
        break
else:
    print('else', end=' ')
print(n)

正解は「0」です。while 文の else 節は、ループの条件が偽になってループが終わったときに実行されます。break でループを抜けたときは実行されません。このコードでは n が 1⁠2 から 4 ずつ減り、8、4、0 になります。n が 0 になった回で n == 0 が真になって break し、ループを抜けます。break で抜けたので else 節の print('else', end=' ') は動かず、最後の print(n) だけが 0 を出力します。「else 0」は、break で抜けても else 節が動くと考えた誤りです。「else -4」は、break を見落として条件 n > 0 が偽になるまで回り、else 節まで動くと考えた誤りです。「-4」は、break を見落としたうえで、else 節だけは正しく飛ばした組み合わせの誤りです。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#else-⁠clauses-⁠on-⁠loops

問9for ループに付けた else 節が実行される場合として、正しい説明はどれですか。

正解は「break されずに終わると実行され、return で抜けると実行されない」です。チュートリアルのループの else 節の節には、for 文では最後の反復が終わったあと、つまり break が起きなかったときに else 節が実行され、return や例外の発生でループが途中で終わったときは else 節が飛ばされると書かれています。「break で抜けると実行され、最後まで回ると実行されない」は逆で、break で抜けると else 節は実行されず、最後まで回ると実行されます。「例外で止まっても実行され」も誤りで、例外で途中終了したときは飛ばされます。「本体が一度も動かないと実行され、一度でも動くと実行されない」は誤りです。空のリストを回したときも else 節は動きますが、要素を最後まで回し終えたときにも動きます。M6 の Python 3.1⁠2 で、関数の中のループから return で抜けると else が動かないこと、空のリストや最後まで回ったときは動くことを確かめました。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#else-⁠clauses-⁠on-⁠loops

問10pass 文の説明として正しいものはどれですか。

正解は「何もしない文で、構文上は文が要るが処理は要らない所に置く」です。チュートリアルの pass 文の節には、pass は何もしない文で、文を書くことが構文上は求められるがプログラム上は何もしなくてよいときに使うと書かれています。中身の無い最小のクラスを作るときや、まだ書いていない関数や条件文の本体を仮に置いておくときによく使います。「次の反復へ進む」は continue 文の説明です。「いちばん内側のループを抜ける」は break 文の説明です。「関数を終えて None を返す」は、式を付けない return 文の説明です。pass は実行されても何も起こらず、そのまま次の文へ進みます。M6 の Python 3.1⁠2 で、本体が pass だけの関数とクラスがそのまま定義でき、関数を呼ぶと None が返ることを確かめました。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#pass-⁠statements

問11次のコードを実行したときの出力として正しいものはどれですか。
vals = [0, 0.0, '', 'False', [], [0], None]
count = 0
for v in vals:
    if v:
        count += 1
print(count)

正解は「2」です。if 文の条件には、True と False だけでなく、どんなオブジェクトでも置けます。偽とみなされるのは None と False、数のゼロ (0 や 0.0)、空のシーケンスやコレクション ('' や [] など) で、それ以外は真とみなされます。リストの 7 つを順に見ると、0、0.0、''、[]、None は偽です。'False' は中身が 5 文字ある空でない文字列なので真、[0] は要素を 1 つ持つ空でないリストなので真です。真になるのは 2 つなので count は 2 になります。「1」は、'False' か [0] のどちらかを偽と見た誤りです。「0」は、両方とも偽と見た誤りで、中身の値ではなく空かどうかで決まります。「3」は、0.0 のような小数のゼロを真と見た誤りです。出典 https://docs.python.org/ja/3/library/stdtypes.html#truth-⁠value-⁠testing

関数の定義と引数

問12次のコードを実行したときの出力として正しいものはどれですか。
def greet(name):
    print('hi', name)

r = greet('aya')
print(r)

正解は「hi aya と None の 2 行」です。return 文を持たない関数も、実は値を返しています。関数の本体の終わりまで来たとき、または式を付けない return を実行したとき、関数は None を返します。このコードでは greet('aya') を呼んだ時点で、関数の中の print が hi aya を出力します。greet は何も return しないので、戻り値は None で、それが r に入ります。続く print(r) が None を出力するので、出力は hi aya と None の 2 行です。「hi aya と hi aya の 2 行」は、print(r) で関数がもう一度呼ばれると考えた誤りです。r に入っているのは戻り値だけです。「hi aya の 1 行」は、None は表示されないと考えた誤りです。対話モードで式の値が None のときは表示が省かれますが、print に渡せば None と出ます。「TypeError になる」は、return の無い関数の結果を変数に入れられないと考えた誤りです。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#defining-⁠functions

問13関数のドキュメンテーション文字列 (docstring) について、正しい説明はどれですか。

正解は「関数本体の最初の文に置く文字列リテラルで、1 行目に目的を短く書く」です。チュートリアルによると、関数本体の最初の文を文字列リテラルにすると、それがドキュメンテーション文字列になります。書き方の慣習として、最初の行にはオブジェクトの目的を短く簡潔にまとめ、さらに書くことがあれば 2 行目を空行にして残りの説明と分けます。「どこに置いてもよい」は誤りで、本体の途中に置いた文字列はただの式で、__doc__ には入りません。「# で書いたコメント」も誤りで、コメントは実行時には残らないので docstring になりません。「1 行目は空行」は順序が逆で、空けるのはまとめの行のあとの 2 行目です。M6 の Python 3.1⁠2 で、最初の文に置いた文字列は __doc__ に入り、途中に置いた文字列では __doc__ が None になることを確かめました。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#documentation-⁠strings

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

def up():
    count = 5
    return count

print(up(), count)

正解は「5 0」です。関数の中で変数に値を代入すると、その値は関数のローカルなシンボルテーブルに入ります。つまり関数の中の count = 5 は、外の count とは別のローカル変数を作ります。関数の中からグローバル変数に代入したいときは global 文で名前を宣言する必要があります。このコードでは up() の中で作られたローカル変数 count が 5 になり、それが返されます。グローバル変数の count は 0 のまま変わりません。print(up(), count) は 5 と 0 を並べて出力します。「5 5」は、関数の中の代入でグローバル変数まで書き換わると考えた誤りです。「0 5」は、ローカルとグローバルを逆に取り違えた誤りです。「0 0」は、関数がグローバル変数の値を返すと考えた誤りで、return count が見るのはローカル変数です。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#defining-⁠functions

問15次のコードを実行したときの出力として正しいものはどれですか。
def add(item, bag=[]):
    bag.append(item)
    return bag

add('a')
print(add('b'), add('c', []))

正解は「['a', 'b'] ['c']」です。デフォルトの引数値は関数を定義したときに 1 度だけ評価されます。そのため bag=[] のようにリストを既定値にすると、既定値を使う呼び出しのたびに同じ 1 つのリストが使い回され、中身がたまっていきます。このコードでは、まず add('a') が既定のリストに 'a' を足します。次の add('b') も同じリストに 'b' を足すので、そのリストは ['a', 'b'] になります。add('c', []) は新しい空のリストを明示して渡しているので、既定のリストには触れず ['c'] を返します。「['b'] ['c']」は、呼ぶたびに新しい空のリストが作られると考えた誤りです。「['a', 'b'] ['a', 'b', 'c']」は、引数で渡したリストより既定のリストが使われると考えた誤りです。「['b'] ['b', 'c']」は、評価の時期と使い回しの両方を取り違えた誤りです。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#default-⁠argument-⁠values

問16次の関数 order を呼び出す書き方のうち、エラーにならないものはどれですか。
def order(item, qty=1, note=''):
    return f'{item} x{qty} {note}'

正解は「order('pen', note='急ぎ')」です。関数の呼び出しでは、キーワード引数は位置引数のあとに書かなければなりません。また必須の引数には必ず値を渡し、1 つの引数に値を 2 回以上与えてはいけません。order('pen', note='急ぎ') は、item に位置引数で 'pen' を渡し、note をキーワードで指定しています。qty は既定値の 1 になり、pen x1 急ぎ が返ります。order(qty=2, 'pen') は、キーワード引数のあとに位置引数を書いているので SyntaxError になります。order('pen', item='ink') は、item に位置で 'pen' を、キーワードで 'ink' を渡して同じ引数に値が 2 つ入るので TypeError になります。order(note='急ぎ') は、必須の item を渡していないので TypeError になります。M6 の Python 3.1⁠2 で 4 つの呼び出しを試し、この結果を確かめました。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#keyword-⁠arguments

問17次のコードを実行したときの出力として正しいものはどれですか。
def show(*args, **kwargs):
    print(type(args).__name__, type(kwargs).__name__, len(args), len(kwargs))

show(1, 2, x=3)

正解は「tuple dict 2 1」です。仮引数に *args の形があると、ほかの仮引数に入らなかった位置引数がタプルにまとめられて入ります。**kwargs の形があると、ほかの仮引数に対応しないキーワード引数が、名前をキーにした辞書にまとめられて入ります。show(1, 2, x=3) では、位置引数の 1 と 2 が args に (1, 2) というタプルで入り、キーワード引数の x=3 が kwargs に {'x': 3} という辞書で入ります。型の名前は tuple と dict、長さは 2 と 1 なので、tuple dict 2 1 と出力されます。「list dict 2 1」は、*args がリストになると考えた誤りです。「tuple dict 3 0」は、キーワード引数の x=3 まで args に入ると考えた誤りです。「list list 2 1」は、どちらもリストで受け取ると考えた誤りです。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#arbitrary-⁠argument-⁠lists

問18引数 a を位置専用、b を位置またはキーワード、c をキーワード専用にする関数定義はどれですか。

正解は「def f(a, /, b, *, c):」です。チュートリアルの特殊なパラメータの節によると、/ より前に置いた仮引数は位置専用になり、キーワードでは渡せません。* より後ろに置いた仮引数はキーワード専用になり、キーワードでしか渡せません。/ と * のあいだの仮引数は、位置でもキーワードでも渡せます。def f(a, /, b, *, c) では、a は / の前なので位置専用、b は / と * のあいだなので位置またはキーワード、c は * の後ろなのでキーワード専用になり、問いの条件にぴったり合います。def f(*, a, b, /, c) と def f(a, *, b, /, c) は、/ が * より後ろにあり、正しい順になっていないので SyntaxError になります。def f(/, a, b, *, c) は、/ の前に仮引数が 1 つも無いので SyntaxError になります。M6 の Python 3.1⁠2 で、正解の定義の仮引数の種類と、ほかの 3 つが SyntaxError になることを確かめました。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#special-⁠parameters

問19次のコードを実行したときの出力として正しいものはどれですか。
def area(w, h, unit='cm'):
    return f'{w * h}{unit}'

size = [3, 4]
opts = {'unit': 'm'}
print(area(*size, **opts))

正解は「1⁠2m」です。関数を呼び出すときに引数の前に * を付けると、リストやタプルの中身が個別の位置引数としてアンパックされて渡されます。** を付けると、辞書の中身がキーワード引数として渡されます。area(*size, **opts) は、size の [3, 4] がばらされて w に 3、h に 4 が入り、opts の {'unit': 'm'} が unit='m' として渡されます。w * h は 1⁠2 で、unit は m なので 1⁠2m と出力されます。「1⁠2cm」は、**opts が効かず unit が既定値の cm のままになると考えた誤りです。「7m」は、w と h を掛けずに足したと読んだ誤りです。「TypeError になる」は、リストを 1 つの引数として w に渡してしまうと考えた誤りです。* を付けているので、リストは 2 つの位置引数に分かれます。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#unpacking-⁠argument-⁠lists

問20次のコードを実行したときの出力として正しいものはどれですか。
def make_scaler(k):
    return lambda x: x * k

double = make_scaler(2)
triple = make_scaler(3)
print(double(5), triple(double(1)))

正解は「1⁠0 6」です。lambda を使うと名前の無い小さな関数を作れます。本体は 1 つの式に限られ、その式の値が戻り値になります。入れ子の関数定義と同じく、lambda 式も取り囲むスコープの変数を参照できます。make_scaler(2) は、外側の k が 2 のまま使える lambda x: x * k を返すので、double は 2 倍する関数になります。同じように triple は 3 倍する関数です。double(5) は 1⁠0、double(1) は 2 で、triple(2) は 6 なので、1⁠0 6 と出力されます。「1⁠5 9」は、あとから make_scaler(3) を呼んだことで double の k も 3 に変わると考えた誤りです。呼び出しのたびに新しいローカルなシンボルテーブルが作られるので、double が参照する k は 2 のままです。「7 6」は、x * k を x + k と読んだ誤りです。「1⁠0 3」は、triple(double(1)) の内側を飛ばし、triple(1) を計算したと読んだ誤りです。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#lambda-⁠expressions

問21関数アノテーションについて、正しい説明はどれですか。

正解は「関数の __annotations__ 属性に辞書で入り、関数の動作には影響しない」です。チュートリアルによると、関数アノテーションは関数で使う型についての、まったく任意のメタデータです。アノテーションは関数の __annotations__ 属性に辞書として入り、関数のほかの部分には何も影響を与えません。「TypeError になる」は誤りで、Python はアノテーションの型を実行時に確かめません。def f(x: int) -> str の f に文字列 'ab' を渡しても、そのまま 'ab' * 2 が計算されます。「仮引数のリストより前に書く」も誤りで、戻り値のアノテーションは仮引数のリストと、def 文の終わりを表すコロンのあいだに -> を付けて書きます。「キーワード専用になる」も誤りで、アノテーションは引数の渡し方を変えません。M6 の Python 3.1⁠2 で、int と書いた引数に文字列を渡しても動くことと、__annotations__ の中身を確かめました。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#function-⁠annotations

問22チュートリアルが挙げる PEP 8 のコーディングスタイルの要点として、正しいものはどれですか。

正解は「インデントは空白 4 つにし、行は 7⁠9 文字を越えないよう折り返す」です。チュートリアルの間奏曲の節は、ほとんどのプロジェクトが守るスタイルガイドとして PEP 8 を紹介し、その要点を挙げています。その中に、インデントには空白 4 つを使ってタブは使わないこと、ソースコードの幅が 7⁠9 文字を越えないように行を折り返すことがあります。「タブを 1 つ使う」は逆で、タブは混乱のもとなので使わないよう勧めています。「クラス名は lowercase_with_underscores」も逆で、慣習ではクラス名に UpperCamelCase、関数名やメソッド名に lowercase_with_underscores を使います。「コメントは同じ行の末尾に」も違い、可能ならコメントは独立した行に書くよう勧めています。ほかにも、演算子の前後とコンマのあとに空白を入れること、docstring を使うことなどが挙げられています。出典 https://docs.python.org/ja/3/tutorial/controlflow.html#intermezzo-⁠coding-⁠style

ほかの分野

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

続きはゆめさくで

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