本文へ移動

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

制御構造と関数の要点整理と想定問題

公式の出題範囲の「4章 制御構造ツール」にあたる分野です。まず要点整理で全体をつかみ、下の演習で 63 問を 1 問ずつ解けます。答えると A〜D すべての解説が出ます。

この分野の小項目

  • 4.1 if 文と elif(4 問) if 文に 0 個以上の elif 部と省略可能な else 部を付けられる。elif は else if の略で、if ... elif ... の並びは他言語の switch 文や case 文の代わりになる。
  • 4.2 for 文(4 問) Python の for 文は任意のシーケンス(リストや文字列)の要素を、現れる順に反復する。反復中にそのコレクションを変更するのは難しいため、コピーを反復するか新しいコレクションを作るのが簡単。
  • 4.3 range() 関数(5 問) range() は等差数列を生成し、終端値は含まない。開始値や増分(負も可)を指定できる。インデックスで反復するには range() と len() を組み合わせるが、多くは enumerate() が便利。range() が返すのはリストではなく反復可能(iterable)なオブジェクトで、sum() や list() に渡せる。
  • 4.4 break・continue とループの else 節(5 問) break は最も内側の for/while ループを抜け、continue は次の反復へ進む。ループの else 節は break せずにループが終わったとき(for は反復を終えたとき、while は条件が偽になったとき)に実行され、break・return・例外で抜けたときは実行されない。
  • 4.5 pass 文(4 問) pass は何もしない文。構文上は文が必要だが処理が要らないとき(空のループ、最小のクラス、書きかけの関数や条件の仮置き)に使う。
  • 4.6 関数の定義(def・return・スコープ)(6 問) def で関数を定義し、本体の最初の文字列はドキュメンテーション文字列になる。関数内の代入はローカルのシンボル表に入り、名前はローカル→外側の関数→グローバル→組み込みの順に探す。引数は値渡し(値はオブジェクトの参照)。関数名は関数オブジェクトを指し別名を付けられる。return の無い関数は None を返す。
  • 4.7.1 引数のデフォルト値(4 問) 引数にデフォルト値を指定すると、少ない引数で呼べる。デフォルト値は関数を定義した時点で 1 回だけ評価されるため、リストや辞書などの可変オブジェクトを使うと呼び出しの間で値が共有される。共有を避けるには None を既定にして関数内で作る。
  • 4.7.2 キーワード引数(5 問) kwarg=value の形で引数を渡せる。キーワード引数は位置引数の後に置く必要があり、同じ引数に 2 回値を渡すことはできない。**name の仮引数は残りのキーワード引数を辞書で受け取り、*name(タプル)は **name より前に置く。
  • 4.7.3 特殊引数(位置専用 / とキーワード専用 *)(5 問) 仮引数リストの / より前は位置専用引数、* より後はキーワード専用引数、どちらも無い部分は位置でもキーワードでも渡せる。名前を API に含めたくないときは位置専用、意味を明確にしたいときはキーワード専用を使う。
  • 4.7.4 任意引数リスト(*args)(3 問) *args のような仮引数は任意個の位置引数をタプルで受け取る。その後ろに置いた仮引数はキーワード引数としてしか渡せない。
  • 4.7.5 引数リストのアンパック(4 問) リストやタプルに入った値は * 演算子で位置引数として展開して渡せる(例: range(*args))。辞書は ** 演算子でキーワード引数として渡せる。
  • 4.7.6 ラムダ式(4 問) lambda で小さな無名関数を作れる。構文上 1 つの式しか書けない。外側のスコープの変数を参照でき、関数を返したり、list.sort() の key のように小さな関数を引数に渡したりするときに使う。
  • 4.7.7 ドキュメンテーション文字列(3 問) 1 行目は目的の短い要約で、大文字で始まりピリオドで終える。複数行のときは 2 行目を空行にして説明を続ける。パーサは字下げを取り除かないため、ツール側で処理する慣習を説明する。
  • 4.7.8 関数アノテーション(3 問) 関数アノテーションは引数や戻り値の型について任意で付けるメタデータ。引数名の後に : 式、戻り値は -> 式で書き、関数の __annotations__ 属性に辞書として保存される。関数の動作には影響しない。
  • 4.8 コーディングスタイル(PEP 8)(4 問) 多くのプロジェクトが従う PEP 8 の要点。インデントは空白 4 つでタブを使わない、1 行は 79 文字以内、関数やクラスの間は空行、コメントは独立した行に、docstring を使う、演算子の前後とコンマの後に空白、クラスは UpperCamelCase・関数とメソッドは lowercase_with_underscores、メソッドの第 1 引数は self、エンコーディングは UTF-8 など。

要点整理

if 文と elif

if 文は「最初に真になった 1 つ」だけを実行する

if 文には elif 部を 0 個以上、else 部を 1 つまで付けられます。elif は else if の略で、深い字下げを避けるために使います。

条件は上から順に調べ、最初に真になった分岐だけを実行します。後ろに真になる条件があっても、そこへは進みません。出力を問う問題では、この点をまず確かめます。

Python に switch 文はありません。他の言語の switch 文や case 文の代わりには、if … elif … elif … の並びを使います(Web 版のチュートリアルにある match 文は Python 3.10 からの別の構文で、第 4 版の範囲外です)。

空のリストや空の文字列、0、None は条件の中で偽と判定されます。ただし空のリストと None は別物で、is None では区別されます。

出典: Python チュートリアル 4. その他の制御フローツール(4.1 if 文)/組み込み型(真理値判定)

for 文

for 文はシーケンスの要素を順に取り出す

Python のfor 文は、C 言語のように回数を数える形ではありません。リストや文字列などのシーケンスの要素を、現れる順に 1 つずつ取り出します。文字列なら 1 文字ずつです。

反復している最中にそのコレクションを書き換えるのは難しく、辞書なら大きさが変わると、次の要素を取り出すときに RuntimeError になります。チュートリアルは、コピー(users.copy().items())を反復して元を書き換えるか、条件に合うものだけを新しいコレクションに入れる方法を勧めています。

ループ変数は、ループが終わった後も最後の値のまま残ります。

出典: Python チュートリアル 4. その他の制御フローツール(4.2 for 文)/複合文(for 文)

range() 関数

range() は終端値を含まない

range() は等差数列を表すオブジェクトを返します。range(5) は 0〜4 で、指定した終端値は含みません。range(開始, 終端, 増分) の形で開始値と増分を指定でき、増分は負でもかまいません(range(-10, -100, -30) は -10, -40, -70)。

range() が返すのはリストではなくイテラブルなオブジェクトです。print(range(4)) と書くと range(0, 4) と表示されます。中身を見るには list() に渡し、合計は sum() で求めます(sum(range(4)) は 6)。

番号と要素を一緒に使いたいときは、range(len(a)) より enumerate() のほうが多くの場合便利だとされています。

出典: Python チュートリアル 4. その他の制御フローツール(4.3 range() 関数)/組み込み型(range)

break・continue とループの else 節

break・continue とループの else 節

break 文は、その文を囲む最も内側の for・while ループを抜けます。外側のループは続きます。continue 文はその回の残りを飛ばし、次の反復に進みます。

for 文や while 文には else 節を付けられます。ループの else 節は、break せずにループが終わったとき(for は最後の反復の後、while は条件が偽になった後)に 1 回だけ実行されます。break・return・例外でループを出たときは実行されません。

内側のループが 1 回も回らなかった場合も、break していないので else 節は実行されます。素数を探す例では、range(2, 2) が空でも n = 2 が素数として扱われます。

try 文の else 節は「例外が起きなかったとき」、ループの else 節は「break されなかったとき」に実行されると覚えると区別しやすくなります。

文・節何をするか使える場所
break 文最も内側のループを抜けるfor・while の中
continue 文その回の残りを飛ばし、次の反復へfor・while の中
ループの else 節break せずに終わったときに 1 回実行for・while の後ろ
pass 文何もしない(文の置き場所を埋める)文を書けるところならどこでも

出典: Python チュートリアル 4. その他の制御フローツール(4.4 break 文と continue 文)/Python チュートリアル 4. その他の制御フローツール(4.5 ループの else 節)

pass 文

pass 文は何もしない

pass 文は何もしない文です。構文上は文が必要でも、処理は要らないときに使います。書きかけの関数やクラスの仮置き、空のクラス、キーボード割り込みを待つ while True: pass のようなビジーウェイトが例です。

関数の本体を空にしたり、コメントだけにしたりすると IndentationError になります。コメントは文ではないためです。continue は関数の本体に直接書くと SyntaxError です。

出典: Python チュートリアル 4. その他の制御フローツール(4.6 pass 文)/単純文(pass 文)

関数の定義(def・return・スコープ)

関数の定義と、名前を探す順番

関数を定義するときは、def の後に関数名と仮引数の並びを丸括弧で書き、本体は次の行から字下げして書きます。本体の最初の文が文字列リテラルなら、それがドキュメンテーション文字列になります。

関数内で代入した変数はローカル変数になります。名前を参照するときは、ローカル、外側の関数のローカル、グローバル、組み込みの順に探します。関数内からグローバル変数に直接代入するには global 文、外側の関数の変数には nonlocal 文が要ります。付けずに count += 1 のように書くと UnboundLocalError になります。

実引数は値渡しで渡されますが、その値はオブジェクトへの参照です。チュートリアルの脚注は「オブジェクトへの参照渡し」と言うほうが正確だとしています。渡したリストに関数内で append すると、呼び出し側からも変更が見えます。

関数名は関数オブジェクトを指すので、g = greet のように別の名前に代入して g() と呼べます。return 文が無い関数や、式を書かない return は None を返します。

出典: Python チュートリアル 4. その他の制御フローツール(4.8 関数を定義する)/実行モデル(名前解決)

引数のデフォルト値

デフォルト値は定義の時に 1 回だけ評価される

デフォルト引数を持つ仮引数は、呼び出しで省略できます。def power(base, exp=2) なら power(3) は 9 です。

デフォルト値は関数を定義した時点で評価されます。i = 5 の後に def f(arg=i) と書けば、後で i = 6 にしても f() は 5 を出力します。

評価は 1 度だけなので、リストや辞書などのミュータブルなオブジェクトをデフォルト値にすると、呼び出しの間で同じオブジェクトが共有されます。def f(a, L=[]) は f(1)、f(2)、f(3) で [1, 2, 3] までたまります。共有を避けるには L=None とし、関数の中で if L is None: L = [] と新しく作ります。

出典: Python チュートリアル 4. その他の制御フローツール(4.9.1 デフォルトの引数値)/複合文(関数定義)

キーワード引数

キーワード引数と **kwargs

kwarg=value の形で、仮引数の名前を指定して値を渡せます。名前で対応づけるので、順番は定義と違ってもかまいません。

決まりは 3 つあります。キーワード引数は位置引数の後に置く(逆は SyntaxError)。同じ仮引数に 2 回値を渡さない(TypeError)。仮引数に無い名前は渡さない(TypeError)。必須の引数を省いても TypeError です。

**name の形の仮引数は、他の仮引数に対応しない残りのキーワード引数を辞書で受け取ります。*name の形(タプルで受け取る)と一緒に使うときは、*name を **name より前に置きます。辞書に入る順番は、呼び出しで渡した順と同じです。

出典: Python チュートリアル 4. その他の制御フローツール(4.9.2 キーワード引数)/式(呼び出し)

特殊引数(位置専用 / とキーワード専用 *)

/ と * で渡し方を決める

仮引数の並びの / より前は位置専用引数、* より後はキーワード専用引数です。どちらも無い部分は、位置でもキーワードでも渡せます。def f(a, /, b, *, c) なら f(1, 2, c=3) や f(1, b=2, c=3) が正しい呼び方です。

位置専用にすると、仮引数の名前は呼び出し側から見えません。def foo(name, /, **kwds) なら foo(1, **{'name': 2}) でも name とぶつからず、'name' は kwds に入ります。

チュートリアルの要約では、名前を使わせたくないときや将来名前を変えても API を壊したくないときは位置専用、名前に意味があり呼び出しを分かりやすくしたいときはキーワード専用を使うとしています。

書き方引数の種類f(1) のような位置渡しf(x=1) のような名前渡し
def f(x, /)位置専用引数できるできない(TypeError)
def f(x)位置またはキーワードできるできる
def f(*, x)キーワード専用引数できない(TypeError)できる
def f(*args, x)*args の後ろもキーワード専用1 は *args に入る(x が無く TypeError)できる

出典: Python チュートリアル 4. その他の制御フローツール(4.9.3 特殊なパラメータ)

任意引数リスト(*args)

*args は任意個の位置引数をタプルで受け取る

*args のような仮引数は、残りの位置引数をまとめてタプルで受け取ります(可変長引数)。普通は仮引数の並びの最後のほうに置きます。

*args より後ろに置いた仮引数はキーワード専用になります。def concat(*args, sep='/') では concat('a', 'b', '.') の '.' も *args に入り、結果は a/b/. です。区切りを変えるには sep='.' と名前で渡します。

出典: Python チュートリアル 4. その他の制御フローツール(4.9.4 任意引数リスト)

引数リストのアンパック

* と ** で引数を展開して渡す

リストやタプルに入った値は、呼び出しで * を付けると位置引数として展開されます(引数のアンパック)。args = [3, 6] なら range(*args) は range(3, 6) と同じです。* を付けずに range(args) とすると、リストが 1 つの引数として渡り TypeError になります。

辞書は ** を付けるとキーワード引数として渡せます。キーが仮引数の名前に対応するので、辞書の中の順番は関係ありません。

出典: Python チュートリアル 4. その他の制御フローツール(4.9.5 引数リストのアンパック)

ラムダ式

ラムダ式は 1 つの式だけの小さな関数

lambda で名前の無い小さな関数を作れます(ラムダ式)。lambda a, b: a + b は 2 つの引数の和を返します。本体は 1 つの式だけで、return などの文は書けません。

入れ子の関数と同じく、外側のスコープの変数を参照できます。make_incrementor(42) が lambda x: x + n を返すと、その関数は n = 42 を使い続けます。

小さな関数を引数に渡すときにも使います。pairs.sort(key=lambda p: p[1]) は、各要素の 2 番目の値で並べ替えます。

出典: Python チュートリアル 4. その他の制御フローツール(4.9.6 ラムダ式)/式(ラムダ)

ドキュメンテーション文字列

docstring の慣習

関数本体の最初の文に書いた文字列がドキュメンテーション文字列になり、関数の __doc__ で読めます。2 文目以降に書いた文字列は docstring にならず、__doc__ は None のままです。

1 行目は目的の短い要約で、名前や型は書かず、大文字で始めてピリオドで終えます。続きがあるときは 2 行目を空行にし、3 行目から呼び出し方や副作用を書きます。

複数行の docstring の字下げの扱いは版で記述が違います。第 4 版が準拠する 3.9 のチュートリアルは「パーザは字下げを取り除かないので、処理するツール側で取り除く」と説明していました。現在の Web 版は「パーサーが取り除く」と書いています。

出典: Python チュートリアル 4. その他の制御フローツール(4.9.7 ドキュメンテーション文字列)/Python 3.9 チュートリアル(4.7.7 ドキュメンテーション文字列)

関数アノテーション

関数アノテーションは動作に影響しない

関数アノテーションは、引数や戻り値の型について任意で付けるメタデータです。引数は名前の後に : 式、戻り値は仮引数の並びと最後のコロンの間に -> 式 で書きます(def f(ham: str) -> str:)。

注釈は関数の __annotations__ 属性に辞書として入り、戻り値の注釈のキーは 'return' です。関数の動作には影響しないので、int と注釈した引数に文字列を渡してもエラーにはなりません。

出典: Python チュートリアル 4. その他の制御フローツール(4.9.8 関数のアノテーション)/データモデル(function.__annotations__)

コーディングスタイル(PEP 8)

コーディングスタイル(PEP 8 の要点)

多くのプロジェクトが従うスタイルガイドが PEP 8 です。チュートリアルは最も重要な点を次の表のように抜き出しています。

名前の付け方は特に問われやすいところです。クラスは ShoppingCart のような UpperCamelCase、関数とメソッドは add_item のような lowercase_with_underscores、メソッドの第 1 引数は常に self です。

項目勧められていること
インデント空白 4 つ。タブは使わない
1 行の長さ79 文字を超えないように折り返す
空行関数・クラス・関数内の大きめのブロックの区切りに使う
コメントできれば独立した行に書く
説明docstring を使う
空白演算子の前後とコンマの後に入れ、括弧のすぐ内側には入れない(a = f(1, 2) + g(3, 4))
名前クラスは UpperCamelCase、関数・メソッドは lowercase_with_underscores、第 1 引数は self
文字コード世界中で使うなら UTF-8 かプレーン ASCII。識別子に非 ASCII 文字を使わない

出典: Python チュートリアル 4. その他の制御フローツール(4.10 間奏曲: コーディングスタイル)/PEP 8 – Style Guide for Python Code

演習(63 問)

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

第 1 問 / 63 問

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

全問と解説の一覧

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

全 63 問

if 文と elif

  1. 次のコードを実行したときの出力はどれか? x = 0 if x < 0: print('負') elif x == 0: print('ゼロ') elif x < 10: print('一桁') else: print('大きい')

    A. ゼロ 一桁 B. ゼロ C. 一桁 D. 大きい

    答えと解説

    正解: B 【A(不正解)】 ? 真になる条件がいくつあれば、その分岐を全部実行すると考えた場合の出力です。 x < 10 も真だが、if 文は最初に真になった 1 つの分岐だけを実行する。 【B(正解)】 ? 最初に真になった分岐だけが実行されると考えた場合の出力です。 x == 0 が最初に真になるので「ゼロ」だけが出力される。後ろの elif は調べられない。Python 3.9.13 と 3.13.14 で実行した出力は「ゼロ」。 【C(不正解)】 ? x < 10 の分岐だけを見た場合の出力です。 x < 10 より先に x == 0 が真になるため、「一桁」の分岐には進まない。 【D(不正解)】 ? どの条件にも当てはまらないと考えた場合の出力です。 else 部は、上のどの条件も偽のときだけ実行される。ここでは x == 0 が真である。

    出典: Python チュートリアル 4. その他の制御フローツール(4.1 if 文)

    この問題へのリンク
  2. 会員ランクに応じて割引率を変える処理を書く。他の言語の switch 文のように分けたい。チュートリアルが代わりの書き方として紹介しているものは?

    A. switch 文を書き、case ごとに処理を分ける B. while 文を使い、条件ごとに break で抜ける C. if … elif … elif … の並びで条件を順に書く D. else の中に if を入れ、条件ごとに字下げを深くする

    答えと解説

    正解: C 【A(不正解)】 ? C や Java などにある分岐の構文です。 Python に switch 文は無く、書くと構文エラーになる(3.10 で加わった match 文は別の構文で、第 4 版の範囲外)。 【B(不正解)】 ? 繰り返しの構文を分岐に転用する方法です。 while 文は繰り返しの構文で、値による分岐の代わりとしては紹介されていない。 【C(正解)】 ? 1 つの if 文に複数の条件の分岐を並べる書き方です。 チュートリアルは if … elif … elif … の並びを、他の言語の switch 文や case 文の代わりとして紹介している。 【D(不正解)】 ? else 部の中に次の if 文を入れ子にする方法です。 動作はするが字下げが深くなる。elif はこの過剰な字下げを避けるためにある。

    出典: Python チュートリアル 4. その他の制御フローツール(4.1 if 文)

    この問題へのリンク
  3. if 文の elif について、チュートリアルの説明に合うものは?

    A. 1 つの if 文に 1 個までしか付けられない B. else 部の後ろに書き足して条件を追加する C. else if を短くしたもので、深い字下げを避けるのに役立つ D. 使うときは else 部も必ず付けなければならない

    答えと解説

    正解: C 【A(不正解)】 ? 付けられる個数に上限があるという説明です。 elif は 0 個以上付けられる。個数の上限は無い。 【B(不正解)】 ? else 部と elif 部の並び順についての説明です。 else 部は最後に置く。elif は if と else の間に書く。 【C(正解)】 ? キーワードの名前の由来と役割に触れた説明です。 elif は 'else if' の略で、過剰なインデントを避けるのに役立つと説明されている。 【D(不正解)】 ? else 部が必須かどうかについての説明です。 else 部は省略できる。elif だけを並べてもよい。

    出典: Python チュートリアル 4. その他の制御フローツール(4.1 if 文)/複合文(if 文)

    この問題へのリンク
  4. 次のコードを実行したときの出力はどれか? items = [] if items: print('あり') elif items is None: print('None') else: print('空')

    A. あり B. 空 C. None D. 何も出力されない

    答えと解説

    正解: B 【A(不正解)】 ? リストというオブジェクトがあるだけで真になると考えた場合の出力です。 長さ 0 のシーケンスは偽と判定される。空のリストでは if items: の分岐に入らない。 【B(正解)】 ? 空のリストが条件の中で偽として扱われ、None とも別物だと考えた場合の出力です。 空のリストは偽と判定され、None とも別のオブジェクトなので else 部に進む。Python 3.9.13 と 3.13.14 で実行した出力は「空」。 【C(不正解)】 ? 空のリストを None と同じものと見なした場合の出力です。 items is None は、items が None そのものかを調べる。空のリストは None ではない。 【D(不正解)】 ? どの分岐も実行されないと考えた場合の結果です。 else 部があるので、上の条件がすべて偽でも else 部が実行される。

    出典: Python チュートリアル 4. その他の制御フローツール(4.1 if 文)/組み込み型(真理値判定)

    この問題へのリンク

for 文

  1. 次のコードを実行したときの出力はどれか? for ch in 'abc': print(ch, end='-')

    A. abc- B. a-b-c C. a-b-c- D. 0-1-2-

    答えと解説

    正解: C 【A(不正解)】 ? 文字列全体を 1 回で取り出したと考えた結果です。 for 文は文字列を 1 文字ずつ反復するので、print は 3 回呼ばれる。 【B(不正解)】 ? 最後の文字の後ろには - が付かないと考えた結果です。 end='-' は毎回の print に付くので、最後の c の後ろにも - が出る。 【C(正解)】 ? 1 文字ごとに毎回 - が付くと考えた結果です。 for 文は文字列の要素(1 文字ずつ)を現れる順に取り出す。print の end='-' で改行の代わりに - が付く。Python 3.9.13 と 3.13.14 で実行した出力は「a-b-c-」。 【D(不正解)】 ? 文字ではなく番号を取り出したと考えた結果です。 for 文が取り出すのは要素そのもので、番号ではない。番号が要るときは enumerate() を使う。

    出典: Python チュートリアル 4. その他の制御フローツール(4.2 for 文)

    この問題へのリンク
  2. 会員の辞書 users から、状態が 'inactive' の会員を消したい。チュートリアルが勧める書き方は?

    A. users.items() をそのまま反復し、その中で del する B. users.keys() をそのまま反復し、その中で del する C. 反復の途中で users に別のキーを足し、数を合わせる D. users.copy().items() を反復し、元の users から del する

    答えと解説

    正解: D 【A(不正解)】 ? 反復しているその辞書を、反復の途中で書き換える方法です。 反復中に辞書の大きさが変わると、次の要素を取り出すときに RuntimeError になる。Python 3.9.13 と 3.13.14 で確かめた。 【B(不正解)】 ? キーの一覧(ビュー)を反復しながら辞書を書き換える方法です。 keys() のビューも元の辞書と連動するため、反復中に del すると RuntimeError になる。 【C(不正解)】 ? 要素の数を保ったまま書き換えようとする方法です。 数を合わせても、反復中に辞書を書き換えることに変わりはない。キーが入れ替わると RuntimeError(dictionary keys changed during iteration)になることがある。 【D(正解)】 ? コピーを反復しながら、元の辞書を書き換える方法です。 反復中のコレクションを書き換えるのは難しいので、コピーを反復するか新しいコレクションを作るのが簡単だと勧められている。

    出典: Python チュートリアル 4. その他の制御フローツール(4.2 for 文)/複合文(for 文)

    この問題へのリンク
  3. Python のfor 文の説明として、チュートリアルに合うものは?

    A. 開始値・終了条件・増分の 3 つを必ず書いて回数を決める B. 数値の並びしか反復できず、文字列は反復できない C. 要素を末尾から先頭へ逆の順で取り出す D. リストや文字列などのシーケンスの要素を、現れる順に反復する

    答えと解説

    正解: D 【A(不正解)】 ? C 言語の for 文のような書き方の説明です。 Python の for 文は回数を数える形ではない。数の並びが要るときは range() を使う。 【B(不正解)】 ? 反復できる対象を数値に限る説明です。 文字列も反復できる。for ch in 'abc': は 1 文字ずつ取り出す。 【C(不正解)】 ? 反復の順番を逆向きとする説明です。 for 文は要素を現れる順に取り出す。逆順にしたいときは reversed() を使う。 【D(正解)】 ? 反復の対象と、取り出す順番についての説明です。 Python の for 文は任意のシーケンスの要素を、そのシーケンス内の順番で反復する。

    出典: Python チュートリアル 4. その他の制御フローツール(4.2 for 文)

    この問題へのリンク
  4. 次のコードを実行したときの出力はどれか? users = {'a': 'active', 'b': 'inactive', 'c': 'active'} active = {} for user, status in users.items(): if status == 'active': active[user] = status print(list(active))

    A. ['b'] B. ['a', 'b', 'c'] C. ['a', 'c'] D. RuntimeError が発生する

    答えと解説

    正解: C 【A(不正解)】 ? 条件を逆に読んだ場合の結果です。 if の条件は status == 'active' なので、'inactive' の b は入らない。 【B(不正解)】 ? 条件に関係なく全部入れたと考えた結果です。 if の条件を満たした要素だけが active に入る。 【C(正解)】 ? 'active' の会員のキーだけが並ぶと考えた結果です。 元の users は書き換えず、'active' のものだけを新しい辞書 active に入れる。キーの順は入れた順になる。Python 3.9.13 と 3.13.14 で実行した出力は「['a', 'c']」。 【D(不正解)】 ? 反復中に辞書を書き換えたと考えた結果です。 書き換えているのは別の辞書 active で、反復中の users は変えていないのでエラーにならない。

    出典: Python チュートリアル 4. その他の制御フローツール(4.2 for 文)

    この問題へのリンク

range() 関数

  1. range() に終端値だけを渡して中身を表示する。出力はどれか? print(list(range(5)))

    A. [1, 2, 3, 4, 5] B. [0, 1, 2, 3, 4, 5] C. [1, 2, 3, 4] D. [0, 1, 2, 3, 4]

    答えと解説

    正解: D 【A(不正解)】 ? 1 から始まり、終端値を含む並びです。 開始値を省くと 0 から始まる。終端値の 5 は含まない。 【B(不正解)】 ? 0 から始まり、終端値も含む並びです。 指定した終端値は生成される並びに入らない。 【C(不正解)】 ? 1 から始まり、終端値の手前で止まる並びです。 開始値を省いたときの開始は 1 ではなく 0 である。 【D(正解)】 ? 0 から始まり、指定した終端値の手前で止まる並びです。 range() は 0 から始まり、終端値の 5 は含まない。Python 3.9.13 と 3.13.14 で実行した出力は「[0, 1, 2, 3, 4]」。

    出典: Python チュートリアル 4. その他の制御フローツール(4.3 range() 関数)

    この問題へのリンク
  2. 開始値・終端値・増分の 3 つを指定した range() の中身を表示する。出力は? print(list(range(0, 10, 3)))

    A. [0, 3, 6, 9] B. [0, 3, 6, 9, 12] C. [3, 6, 9] D. [0, 1, 2]

    答えと解説

    正解: A 【A(正解)】 ? 0 から 3 ずつ増やし、10 の手前で止めた並びです。 range(0, 10, 3) は開始 0・終端 10・増分 3。0, 3, 6, 9 の次の 12 は終端を超える。Python 3.9.13 と 3.13.14 で実行した出力は「[0, 3, 6, 9]」。 【B(不正解)】 ? 終端値を超えるまで増やし続けた並びです。 終端値 10 以上の値は生成されない。 【C(不正解)】 ? 開始値を増分の 3 と読んだ並びです。 1 つ目の引数 0 が開始値で、3 は増分である。 【D(不正解)】 ? 3 つ目の引数を個数と読んだ並びです。 3 つ目の引数は個数ではなく増分(ステップ)である。

    出典: Python チュートリアル 4. その他の制御フローツール(4.3 range() 関数)

    この問題へのリンク
  3. 増分に負の数を指定して、数を減らしながら並べたい。次のコードの出力は? print(list(range(-10, -100, -30)))

    A. [-10, -40, -70] B. [-10, -40, -70, -100] C. [] D. [-100, -70, -40, -10]

    答えと解説

    正解: A 【A(正解)】 ? -10 から 30 ずつ減らし、-100 に届く手前で止めた並びです。 増分 -30 で減っていく。-70 の次の -100 は終端値なので含まない。Python 3.9.13 と 3.13.14 で実行した出力は「[-10, -40, -70]」。 【B(不正解)】 ? 終端値の -100 も含めた並びです。 増分が負でも、終端値は生成される並びに入らない。 【C(不正解)】 ? 開始値が終端値より大きいので空になると考えた結果です。 増分が負なら、開始値から終端値に向かって減っていく並びになる。 【D(不正解)】 ? 小さい値から順に並べ直した結果です。 並びは開始値 -10 から増分の向きに生成され、並べ替えはされない。

    出典: Python チュートリアル 4. その他の制御フローツール(4.3 range() 関数)

    この問題へのリンク
  4. 次のコードを実行したときの出力はどれか? print(range(4)) print(sum(range(4)))

    A. [0, 1, 2, 3] 6 B. range(0, 4) 10 C. range(0, 4) 6 D. [0, 1, 2, 3] 10

    答えと解説

    正解: C 【A(不正解)】 ? range() がリストを返すと考えた場合の表示です。 range() が返すのはリストではなく、要素を順に返すイテラブルなオブジェクトである。 【B(不正解)】 ? 終端値の 4 まで足したと考えた合計です。 終端値 4 は含まないので、合計は 0+1+2+3=6 になる。 【C(正解)】 ? range オブジェクトの表示と、0〜3 の合計が出ると考えた結果です。 range() はリストを作らず、print すると range(0, 4) と表示される。sum() は 0+1+2+3=6 を返す。Python 3.9.13 と 3.13.14 で実行した出力は「range(0, 4) / 6」。 【D(不正解)】 ? リストとして表示し、4 まで足したと考えた結果です。 表示は range(0, 4) で、合計は 6 である。

    出典: Python チュートリアル 4. その他の制御フローツール(4.3 range() 関数)/組み込み型(range)

    この問題へのリンク
  5. 売上のリストを、1 から始まる番号付きで表示したい。要素と番号を一度に取り出せ、チュートリアルが便利だとしている組み込み関数は?

    A. zip() B. reversed() C. enumerate() D. sorted()

    答えと解説

    正解: C 【A(不正解)】 ? 複数の反復可能なものから、同じ位置の要素を組にする関数です。 zip() は複数のシーケンスを並べて組にする。番号は付けない。 【B(不正解)】 ? シーケンスを逆順に取り出す関数です。 reversed() は順番を逆にするだけで、番号は付けない。 【C(正解)】 ? 反復するときに番号と要素の組を返す関数です。 range(len(a)) でも番号は作れるが、多くの場合は enumerate() が便利だとされている。enumerate(a, 1) で 1 から数えられる。 【D(不正解)】 ? 要素を並べ替えた新しいリストを返す関数です。 sorted() は並べ替えで、番号と要素の組は作らない。

    出典: Python チュートリアル 4. その他の制御フローツール(4.3 range() 関数)/組み込み関数(enumerate)

    この問題へのリンク

break・continue とループの else 節

  1. 次のコードを実行したときの出力はどれか? primes = [] for n in range(2, 8): for x in range(2, n): if n % x == 0: break else: primes.append(n) print(primes)

    A. [2, 3, 5, 7] B. [4, 6] C. [2, 3, 4, 5, 6, 7] D. [3, 5, 7]

    答えと解説

    正解: A 【A(正解)】 ? 割り切る数が見つからなかった n だけが残ると考えた結果です。 内側の for が break せずに終わったときだけ else 節で n を加える。割り切れない数(素数)だけが残る。Python 3.9.13 と 3.13.14 で実行した出力は「[2, 3, 5, 7]」。 【B(不正解)】 ? 割り切る数が見つかった n を集めたと考えた結果です。 4 と 6 は割り切れて break するので、else 節は実行されない。 【C(不正解)】 ? break しても else 節が実行されると考えた結果です。 ループの else 節は break で抜けたときは実行されない。 【D(不正解)】 ? 内側のループが 1 回も回らないと else 節も動かないと考えた結果です。 n = 2 では range(2, 2) が空でループは 1 回も回らないが、break していないので else 節は実行される。

    出典: Python チュートリアル 4. その他の制御フローツール(4.5 ループの else 節)

    この問題へのリンク
  2. 次のコードを実行したときの出力はどれか? odd = [] for n in range(1, 6): if n % 2 == 0: continue odd.append(n) print(odd)

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

    答えと解説

    正解: C 【A(不正解)】 ? 偶数が出たところでループ全体を終えたと考えた結果です。 ループ全体を終えるのは break 文。continue は次の反復に進むだけである。 【B(不正解)】 ? 偶数だけを集めたと考えた結果です。 偶数のときに continue で append を飛ばすので、残るのは奇数である。 【C(正解)】 ? 偶数の回だけ append が飛ばされると考えた結果です。 continue 文はその回の残りを飛ばして次の反復に進む。偶数は append されない。Python 3.9.13 と 3.13.14 で実行した出力は「[1, 3, 5]」。 【D(不正解)】 ? continue が何もしないと考えた結果です。 continue はその回の後ろの処理(append)を飛ばす。

    出典: Python チュートリアル 4. その他の制御フローツール(4.4 break 文と continue 文)

    この問題へのリンク
  3. 次のコードを実行したときの出力はどれか? n = 0 while n < 3: n += 1 if n == 5: break else: print('else', n)

    A. 何も出力されない B. else 3 C. else 5 D. else 2

    答えと解説

    正解: B 【A(不正解)】 ? while 文に付けた else 節は実行されないと考えた結果です。 while 文の else 節も、break せずに条件が偽になって終わったときに実行される。 【B(正解)】 ? 条件 n < 3 が偽になって終わり、else 節が動くと考えた結果です。 n は 3 で止まり、n == 5 にはならないので break しない。条件 n < 3 が偽になって終わるため、else 節が実行される。Python 3.9.13 と 3.13.14 で実行した出力は「else 3」。 【C(不正解)】 ? n が 5 になるまで回ると考えた結果です。 ループ条件は n < 3 なので、n が 3 になったところで終わる。 【D(不正解)】 ? n が 3 になる前に終わると考えた結果です。 n = 2 のとき条件 n < 3 は真なので、もう 1 回回って n は 3 になる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.5 ループの else 節)/複合文(while 文)

    この問題へのリンク
  4. 次のコードを実行したときの出力はどれか? for i in range(3): for j in range(3): if j == 1: break print(i, j)

    A. 0 0 B. 0 0 1 0 2 0 C. 0 0 0 1 0 2 D. 0 0 0 2 1 0 1 2 2 0 2 2

    答えと解説

    正解: B 【A(不正解)】 ? break で外側のループまで抜けたと考えた結果です。 break が抜けるのは、その文を囲む最も内側のループだけである。 【B(正解)】 ? break で抜けるのは内側のループだけと考えた結果です。 break 文は最も内側のループだけを抜ける。外側の i は 0〜2 まで回り、毎回 j = 0 だけが出力される。Python 3.9.13 と 3.13.14 で実行した出力は「0 0 / 1 0 / 2 0」。 【C(不正解)】 ? 外側が 1 回だけ回り、内側は最後まで回ったと考えた結果です。 j == 1 で break するので、内側で出力されるのは j = 0 のときだけである。 【D(不正解)】 ? j == 1 の回だけを飛ばしたと考えた結果です。 その回だけ飛ばすのは continue の動き。break は内側のループを抜ける。

    出典: Python チュートリアル 4. その他の制御フローツール(4.4 break 文と continue 文)

    この問題へのリンク
  5. for 文に付けたループの else 節が実行されるのは、どの場合か?

    A. break でループを途中で抜けたとき B. ループの中で例外が発生したとき C. break せずにループを終えたとき D. 反復が 1 回終わるたびに毎回

    答えと解説

    正解: C 【A(不正解)】 ? ループを途中で打ち切った場合です。 break で抜けたときは else 節は実行されない。 【B(不正解)】 ? エラーでループが止まった場合です。 例外や return でループを出たときも、else 節は実行されない。 【C(正解)】 ? ループが途中で打ち切られずに終わった場合です。 ループの else 節は break せずにループが終了したときに実行される。 【D(不正解)】 ? 反復 1 回ごとに動くと考えた場合です。 else 節はループ全体の終了後に 1 回だけ実行される。毎回ではない。

    出典: Python チュートリアル 4. その他の制御フローツール(4.5 ループの else 節)

    この問題へのリンク

pass 文

  1. 書きかけのクラスの本体にpass 文を置いた。この文の働きを表したものは?

    A. 何もしない文で、構文上は文が必要なときに使う B. ループを途中で抜ける文 C. 関数を終えて呼び出し元に値を返す文 D. その回の残りを飛ばし、次の反復に進む文

    答えと解説

    正解: A 【A(正解)】 ? 処理をせずに、文の置き場所だけを埋める文です。 pass は何もしない。文が必要だが処理は要らないときに使う。 【B(不正解)】 ? 繰り返しを打ち切る働きの説明です。 ループを抜けるのは break 文である。 【C(不正解)】 ? 関数から戻る働きの説明です。 値を返して関数を終えるのは return 文である。 【D(不正解)】 ? 繰り返しの 1 回分を飛ばす働きの説明です。 次の反復に進むのは continue 文である。

    出典: Python チュートリアル 4. その他の制御フローツール(4.6 pass 文)

    この問題へのリンク
  2. 後で中身を書く予定の関数 save_log() を、今はエラーなく定義だけしておきたい。本体に何を書くとよいか?

    A. pass だけを書く B. 何も書かず、次の行から字下げせずに続ける C. # TODO というコメントだけを書く D. continue だけを書く

    答えと解説

    正解: A 【A(正解)】 ? 何もしない文を 1 つ置く方法です。 pass は書きかけの関数やクラスの仮置きに使える。定義も呼び出しもエラーにならない。 【B(不正解)】 ? 本体を空のままにする方法です。 関数の本体には文が 1 つ以上要る。空のままだと IndentationError になる。 【C(不正解)】 ? あとでやることをメモとして残す方法です。 コメントは文ではないので本体は空のままと同じで、IndentationError になる。Python 3.9.13 と 3.13.14 で確かめた。 【D(不正解)】 ? ループの次の反復に進む文を置く方法です。 continue はループの中でしか使えない。関数の本体に直接書くと SyntaxError になる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.6 pass 文)/単純文(pass 文)

    この問題へのリンク
  3. 対話モードで次のコードを実行した。チュートリアルの説明に合う動きは? while True: pass

    A. pass でループを抜け、すぐに次の行へ進む B. 何もせず回り続け、Ctrl+C で止めるまで待つ C. 本体が空と見なされ、IndentationError になる D. 1 回だけ本体を実行して、そのまま終わる

    答えと解説

    正解: B 【A(不正解)】 ? pass がループを終わらせると考えた動きです。 pass は何もしない。ループを抜けるのは break である。 【B(正解)】 ? 条件がずっと真のまま、本体を繰り返し続けると考えた動きです。 チュートリアルはこの形をキーボード割り込みを待つビジーウェイトの例として示している。 【C(不正解)】 ? pass を空の本体と同じに扱った動きです。 pass は文なので、本体は空ではない。構文として正しい。 【D(不正解)】 ? True の条件を 1 回だけ調べると考えた動きです。 条件 True は常に真なので、while 文は止まらずに繰り返す。

    出典: Python チュートリアル 4. その他の制御フローツール(4.6 pass 文)

    この問題へのリンク
  4. 次のコードを実行したときの出力はどれか? for i in range(3): pass print(i)

    A. 3 B. 0 C. 2 D. NameError が発生する

    答えと解説

    正解: C 【A(不正解)】 ? ループ変数が終端値まで進んだと考えた結果です。 range(3) は 0〜2 を生成し、3 は含まない。 【B(不正解)】 ? pass のため i が更新されないと考えた結果です。 i への代入は for 文が行う。本体が pass でも変わらない。 【C(正解)】 ? ループ変数に最後の値が残ると考えた結果です。 pass は何もしないが、for 文は i に 0, 1, 2 を順に代入する。ループ後も i には最後の 2 が残る。Python 3.9.13 と 3.13.14 で実行した出力は「2」。 【D(不正解)】 ? ループ変数はループの外では使えないと考えた結果です。 for 文のループ変数は、ループが終わった後も同じスコープに残る。

    出典: Python チュートリアル 4. その他の制御フローツール(4.6 pass 文)/複合文(for 文)

    この問題へのリンク

関数の定義(def・return・スコープ)

  1. 次のコードを実行したときの出力はどれか? def f(): print('hi') r = f() print(r)

    A. hi hi B. hi C. hi None D. hi 0

    答えと解説

    正解: C 【A(不正解)】 ? print した文字列がそのまま戻り値になると考えた結果です。 print() は画面に出すだけで、関数の戻り値にはならない。 【B(不正解)】 ? 戻り値の None は表示されないと考えた結果です。 対話モードで None だけを評価したときは表示されないが、print(r) では None と表示される。 【C(正解)】 ? 関数内の print と戻り値の両方が表示されると考えた結果です。 f() は hi を出力する。return 文が無い関数は None を返すので、r は None になる。Python 3.9.13 と 3.13.14 で実行した出力は「hi / None」。 【D(不正解)】 ? return が無い関数は 0 を返すと考えた結果です。 return 文が無い関数が返すのは 0 ではなく None である。

    出典: Python チュートリアル 4. その他の制御フローツール(4.8 関数を定義する)

    この問題へのリンク
  2. 次のコードを実行したときの出力はどれか? x = 10 def f(): x = 20 return x print(f(), x)

    A. 20 10 B. 20 20 C. 10 10 D. 10 20

    答えと解説

    正解: A 【A(正解)】 ? 関数の中の代入は関数の中だけの変数を作ると考えた結果です。 関数内で代入した x はローカル変数になる。外の(グローバルの)x は 10 のまま変わらない。Python 3.9.13 と 3.13.14 で実行した出力は「20 10」。 【B(不正解)】 ? 関数の中の代入が、外の x を書き換えたと考えた結果です。 関数内の代入はローカルのシンボル表に入る。外の x を書き換えるには global 文が要る。 【C(不正解)】 ? 関数の中でも外の x が使われたと考えた結果です。 関数内で x = 20 と代入しているので、関数内の x はローカルの 20 である。 【D(不正解)】 ? 戻り値と外の x が入れ替わったと考えた結果です。 f() はローカルの 20 を返し、外の x は 10 のままである。

    出典: Python チュートリアル 4. その他の制御フローツール(4.8 関数を定義する)/実行モデル(名前解決)

    この問題へのリンク
  3. 関数の中で変数を参照したとき、名前を探す順番としてチュートリアルの説明に合うものは?

    A. ローカル → 外側の関数 → グローバル → 組み込み B. 組み込み → グローバル → 外側の関数 → ローカル C. グローバル → ローカル → 外側の関数 → 組み込み D. ローカル → グローバル → 組み込み(外側の関数は探さない)

    答えと解説

    正解: A 【A(正解)】 ? 内側から外側へ向かって順に探す並びです。 まずローカル、次に外側の関数のローカル、グローバル、最後に組み込み名のテーブルを探すと説明されている。 【B(不正解)】 ? 外側から内側へ向かって探す並びです。 探す順は逆で、ローカルが最初、組み込みが最後である。 【C(不正解)】 ? グローバルを最初に探す並びです。 最初に探すのはローカルのシンボル表である。 【D(不正解)】 ? 入れ子の関数の外側を飛ばす並びです。 関数が入れ子のときは、外側の関数のローカルもグローバルより先に探す。

    出典: Python チュートリアル 4. その他の制御フローツール(4.8 関数を定義する)/実行モデル(名前解決)

    この問題へのリンク
  4. 次のコードを実行したときの出力はどれか? def greet(): return 'hello' g = greet print(g())

    A. None B. <function greet at …> のような表示 C. NameError が発生する D. hello

    答えと解説

    正解: D 【A(不正解)】 ? 代入で関数の戻り値が失われると考えた結果です。 g = greet は関数を呼ばずに関数オブジェクトを代入する。g() は 'hello' を返す。 【B(不正解)】 ? 関数オブジェクトそのものを表示したと考えた結果です。 print(g()) は g を呼び出した結果を表示する。g() のように括弧があるので呼び出しである。 【C(不正解)】 ? g という関数は定義されていないと考えた結果です。 def で定義しなくても、関数オブジェクトを代入した名前で呼び出せる。 【D(正解)】 ? g も greet と同じ関数オブジェクトを指すと考えた結果です。 関数名は関数オブジェクトを指す。g = greet で g も同じ関数を指すので、g() で呼び出せる。Python 3.9.13 と 3.13.14 で実行した出力は「hello」。

    出典: Python チュートリアル 4. その他の制御フローツール(4.8 関数を定義する)

    この問題へのリンク
  5. 次のコードを実行したときの出力はどれか? def add_item(lst): lst.append(4) nums = [1, 2, 3] add_item(nums) print(nums)

    A. [1, 2, 3] B. [4] C. [1, 2, 3, 4] D. None

    答えと解説

    正解: C 【A(不正解)】 ? 関数に渡したのがリストのコピーだと考えた結果です。 渡るのはコピーではなく同じオブジェクトへの参照である。チュートリアルは「オブジェクトへの参照渡し」と言うほうが正確だとしている。 【B(不正解)】 ? 関数内で新しいリストが作られたと考えた結果です。 lst.append(4) は渡されたリストそのものに要素を足す。新しいリストは作らない。 【C(正解)】 ? 関数内の変更が呼び出し側のリストにも及ぶと考えた結果です。 引数にはオブジェクトへの参照が渡る。関数内で append すると、呼び出し側の nums も同じリストなので変わる。Python 3.9.13 と 3.13.14 で実行した出力は「[1, 2, 3, 4]」。 【D(不正解)】 ? 関数が値を返さないので nums も None になると考えた結果です。 add_item() の戻り値は None だが、nums には代入していない。nums はリストのままである。

    出典: Python チュートリアル 4. その他の制御フローツール(4.8 関数を定義する)

    この問題へのリンク
  6. 次のコードで inc() を呼ぶとどうなるか? count = 0 def inc(): count += 1 inc()

    A. グローバルの count が 1 になる B. 関数の中だけで count が 1 になり、外は 0 のまま C. UnboundLocalError が発生する D. 何も起こらず、エラーにもならない

    答えと解説

    正解: C 【A(不正解)】 ? 関数内から外の変数に直接足し込めると考えた結果です。 関数内からグローバル変数に直接代入するには global 文で指定する必要がある。 【B(不正解)】 ? ローカル変数が 0 から始まると考えた結果です。 ローカル変数 count には初期値が無い。count += 1 は値を読もうとしてエラーになる。 【C(正解)】 ? 代入があるため count がローカル変数と見なされると考えた結果です。 関数内で count に代入しているので count はローカル変数になり、値が無いまま参照してUnboundLocalErrorになる。global count と書けば外の count を変えられる。Python 3.9.13 と 3.13.14 で実行すると UnboundLocalError が発生した。 【D(不正解)】 ? 代入が無視されると考えた結果です。 代入は無視されない。値の無いローカル変数を読もうとして例外が起きる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.8 関数を定義する)/単純文(global 文)/組み込み例外(UnboundLocalError)

    この問題へのリンク

引数のデフォルト値

  1. 次のコードを実行したときの出力はどれか? i = 5 def f(arg=i): print(arg) i = 6 f()

    A. 5 B. 6 C. None D. TypeError が発生する

    答えと解説

    正解: A 【A(正解)】 ? デフォルト値は定義した時点の i で決まると考えた結果です。 デフォルト引数の値は関数を定義した時点で評価される。def の時点で i は 5 なので、後で i = 6 にしても 5 のまま。Python 3.9.13 と 3.13.14 で実行した出力は「5」。 【B(不正解)】 ? デフォルト値が、呼び出した時点の i の値で決まると考えた結果です。 デフォルト値は呼び出しのたびに評価されるのではなく、定義の時点で 1 回だけ評価される。 【C(不正解)】 ? 引数を省くと None になると考えた結果です。 デフォルト値を指定しているので、省いたときはその値(5)が使われる。 【D(不正解)】 ? 引数を省いて呼べないと考えた結果です。 デフォルト値を持つ引数は、呼び出しで省略できる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.1 デフォルトの引数値)/複合文(関数定義)

    この問題へのリンク
  2. 次のコードを実行したときの出力はどれか? def f(a, L=[]): L.append(a) return L f(1) f(2) print(f(3))

    A. [3] B. [1, 2, 3] C. [1, 2] D. [3, 2, 1]

    答えと解説

    正解: B 【A(不正解)】 ? 呼び出しのたびに新しい空のリストが作られると考えた結果です。 空のリストが作られるのは定義の時点の 1 回だけである。呼び出しごとには作られない。 【B(正解)】 ? 呼び出しの間で同じリストが使い回されると考えた結果です。 デフォルト値は 1 度しか評価されないので、L=[] のリストは全呼び出しで共有され、要素がたまっていく。Python 3.9.13 と 3.13.14 で実行した出力は「[1, 2, 3]」。 【C(不正解)】 ? 3 回目の呼び出しの値が入らないと考えた結果です。 f(3) でも append してから L を返すので、3 も入る。 【D(不正解)】 ? 新しい要素が先頭に入ると考えた結果です。 append() は末尾に足すので、順番は 1, 2, 3 である。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.1 デフォルトの引数値)

    この問題へのリンク
  3. def add(item, items=[]): のように書いたら、呼ぶたびに前の値が残った。呼び出しごとに新しいリストを使う書き方として、チュートリアルが示すものは?

    A. items=None にし、関数の中で None なら新しいリストを作る B. items=[] のまま、関数の最後で items を del する C. items=[] を items=list のように型名に書き換える D. 呼び出し側で毎回 items= を省いて呼ぶ

    答えと解説

    正解: A 【A(正解)】 ? 既定値を変更されないものにし、リストは呼ばれてから作る方法です。 if items is None: items = [] とすれば、呼び出しのたびに新しいリストが作られ、値が共有されない。 【B(不正解)】 ? 使い終わった名前を消す方法です。 名前を消してもデフォルト値のリスト自体は残る。次の呼び出しでも同じリストが使われる。 【C(不正解)】 ? 既定値に型そのものを渡す方法です。 これではデフォルト値が list 型そのものになり、append() を呼ぶとエラーになる。 【D(不正解)】 ? 引数を指定しない呼び方です。 省くと共有のデフォルト値が使われるので、値が残る問題はそのままである。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.1 デフォルトの引数値)

    この問題へのリンク
  4. 次のコードを実行したときの出力はどれか? def power(base, exp=2): return base ** exp print(power(3))

    A. 3 B. 9 C. 6 D. TypeError が発生する

    答えと解説

    正解: B 【A(不正解)】 ? 指数が 1 として扱われたと考えた結果です。 デフォルト値は 2 なので、3 ** 1 ではなく 3 ** 2 を計算する。 【B(正解)】 ? 省いた指数にデフォルト値の 2 が使われると考えた結果です。 exp を省くとデフォルト値 2 が使われ、3 ** 2 = 9 になる。Python 3.9.13 と 3.13.14 で実行した出力は「9」。 【C(不正解)】 ? べき乗ではなく掛け算をしたと考えた結果です。 ** はべき乗なので、3 × 2 ではなく 3 の 2 乗である。 【D(不正解)】 ? 引数が足りないと考えた結果です。 デフォルト値を持つ引数は省いて呼べる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.1 デフォルトの引数値)

    この問題へのリンク

キーワード引数

  1. def order(item, qty=1, size='M'): と定義した関数で、エラーになる呼び出しはどれか?

    A. order('tea') B. order(item='tea', size='L') C. order('tea', size='S', qty=3) D. order('tea', item='coffee')

    答えと解説

    正解: D 【A(不正解)】 ? 必須の引数だけを渡す呼び出しです。 qty と size にはデフォルト値があるので、item だけで呼べる。 【B(不正解)】 ? 必須の引数と一部の省略できる引数を、キーワードで渡す呼び出しです。 すべてキーワードで渡しており、qty は省いてデフォルト値になる。正常に呼べる。 【C(不正解)】 ? キーワードを定義と違う順番で渡す呼び出しです。 キーワード引数の順番は仮引数の順と違ってよい。正常に呼べる。 【D(正解)】 ? 同じ仮引数に、位置とキーワードで 2 回値を渡す呼び出しです。 item に位置で 'tea' を渡したうえ、キーワードでも渡している。同じ引数に 2 つの値は渡せず TypeError になる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.2 キーワード引数)/式(呼び出し)

    この問題へのリンク
  2. order(item='tea', 2) と呼び出した。どうなるか?

    A. キーワード引数の後の位置引数で SyntaxError B. 2 が qty に入り、そのまま正常に呼べる C. 2 は無視され、qty はデフォルト値の 1 になる D. item の値が後から渡した 2 で上書きされる

    答えと解説

    正解: A 【A(正解)】 ? キーワード引数の後には位置引数を書けないと考えた結果です。 関数呼び出しでは、キーワード引数は位置引数の後に置く。逆にすると構文エラーになる。Python 3.9.13 と 3.13.14 で実行すると SyntaxError が発生した。 【B(不正解)】 ? 残りの仮引数に順に入ると考えた結果です。 キーワード引数の後に位置引数を書くこと自体が許されない。 【C(不正解)】 ? 余分な値は捨てられると考えた結果です。 値が無視されることはない。呼び出しの書き方そのものが構文エラーである。 【D(不正解)】 ? 後から渡した値が勝つと考えた結果です。 上書きはされない。この並びは構文として許されない。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.2 キーワード引数)/式(呼び出し)

    この問題へのリンク
  3. 次のコードを実行したときの出力はどれか? def shop(kind, *args, **kw): print(kind, args, kw) shop('a', 1, 2, x=3)

    A. a [1, 2] {'x': 3} B. a (1, 2, 3) {} C. TypeError が発生する D. a (1, 2) {'x': 3}

    答えと解説

    正解: D 【A(不正解)】 ? 余った位置引数がリストにまとまると考えた結果です。 *args が受け取るのはリストではなくタプルである。 【B(不正解)】 ? キーワード引数も位置引数と同じにまとまると考えた結果です。 x=3 はキーワード引数なので、**kw の辞書に入る。 【C(不正解)】 ? 定義に無い名前 x を渡せないと考えた結果です。 **kw があるので、仮引数に無い名前のキーワード引数も受け取れる。 【D(正解)】 ? 余った位置引数はタプル、余ったキーワード引数は辞書になると考えた結果です。 *args は残りの位置引数をタプルで、**kw は残りのキーワード引数を辞書で受け取る。Python 3.9.13 と 3.13.14 で実行した出力は「a (1, 2) {'x': 3}」。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.2 キーワード引数)

    この問題へのリンク
  4. 次のコードを実行したときの出力はどれか? def f(**kw): print(list(kw)) f(b=1, a=2)

    A. ['b', 'a'] B. ['a', 'b'] C. [1, 2] D. []

    答えと解説

    正解: A 【A(正解)】 ? 渡した順番のまま並ぶと考えた結果です。 **kw に入るキーワード引数の順番は、呼び出しで渡した順と同じになるとチュートリアルにある。Python 3.9.13 と 3.13.14 で実行した出力は「['b', 'a']」。 【B(不正解)】 ? キーの名前の順に並べ替えられたと考えた結果です。 名前で並べ替えはされない。渡した順の b, a になる。 【C(不正解)】 ? キーではなく値を並べたと考えた結果です。 list() に辞書を渡すと、値ではなくキーの一覧になる。 【D(不正解)】 ? **kw には何も入らないと考えた結果です。 仮引数に無いキーワード引数は、すべて **kw の辞書に入る。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.2 キーワード引数)

    この問題へのリンク
  5. def order(item, qty=1): の関数を order('tea', color='red') と呼んだ。どうなるか?

    A. color は無視され、そのまま正常に呼べる B. 未知のキーワード引数として TypeError C. 'red' が空いている仮引数 qty に入る D. 呼び出しの書き方が誤りで SyntaxError になる

    答えと解説

    正解: B 【A(不正解)】 ? 定義に無い名前は捨てられると考えた結果です。 知らないキーワード引数は無視されず、エラーになる。 【B(正解)】 ? 定義に無い名前は呼び出した時点で拒まれると考えた結果です。 仮引数に color は無く、**name の仮引数も無いので受け取れない。TypeError になる。Python 3.9.13 と 3.13.14 で実行すると TypeError が発生した。 【C(不正解)】 ? 空いている仮引数に順に入ると考えた結果です。 キーワード引数は名前で対応づける。名前が違う仮引数には入らない。 【D(不正解)】 ? 書き方そのものが構文として誤っていると考えた結果です。 構文としては正しい。呼び出した時点で TypeError になる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.2 キーワード引数)

    この問題へのリンク

特殊引数(位置専用 / とキーワード専用 *)

  1. def f(a, /, b, *, c): と定義した関数を、エラーなく呼べるのはどれか?

    A. f(a=1, b=2, c=3) B. f(1, 2, 3) C. f(1, 2, c=3) D. f(1, c=3)

    答えと解説

    正解: C 【A(不正解)】 ? すべてキーワードで渡す呼び出しです。 / より前の a は位置専用引数なので、a=1 のように名前では渡せない。TypeError になる。 【B(不正解)】 ? すべて位置で渡す呼び出しです。 * より後の c はキーワード専用引数なので、位置では渡せない。TypeError になる。 【C(正解)】 ? a と b を位置で、c をキーワードで渡す呼び出しです。 a は位置専用、b は位置でもキーワードでもよく、c はキーワード専用である。この呼び出しはすべての決まりを満たす。 【D(不正解)】 ? b を省いた呼び出しです。 b にはデフォルト値が無いので省けない。TypeError になる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.3 特殊なパラメータ)

    この問題へのリンク
  2. 仮引数の並びに / を書いたとき、その前にある仮引数はどう扱われるか?

    A. 名前でしか渡せないキーワード専用引数になる B. 位置でしか渡せない位置専用引数になる C. 任意個の値をタプルで受け取る D. 値を省略できるデフォルト引数になる

    答えと解説

    正解: B 【A(不正解)】 ? 名前を書いて値を渡す引数です。 キーワード専用になるのは * より後の仮引数である。 【B(正解)】 ? 名前を使わず、並び順だけで値を渡す引数です。 / より前の仮引数は位置専用引数になり、キーワードでは渡せない。 【C(不正解)】 ? 数を決めずに値を受け取る引数です。 任意個を受け取るのは *args の形の仮引数である。 【D(不正解)】 ? 呼び出しで省ける引数です。 省略できるかどうかは = でデフォルト値を書くかで決まり、/ とは関係ない。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.3 特殊なパラメータ)

    この問題へのリンク
  3. 次のコードを実行したときの出力はどれか? def foo(name, /, **kwds): return 'name' in kwds print(foo(1, **{'name': 2}))

    A. False B. True C. TypeError が発生する D. SyntaxError が発生する

    答えと解説

    正解: B 【A(不正解)】 ? キーワードの 'name' が仮引数 name に入ったと考えた結果です。 name は位置専用なので、キーワードの name は仮引数には入らず **kwds に入る。 【B(正解)】 ? キーワードの 'name' が **kwds に入ると考えた結果です。 / で name を位置専用にすると、キーワードの 'name' は仮引数とぶつからず **kwds に入る。'name' in kwds は True。Python 3.9.13 と 3.13.14 で実行した出力は「True」。 【C(不正解)】 ? 同じ name に 2 つの値が渡ったと考えた結果です。 / が無い def foo(name, **kwds) なら TypeError になる。/ があるのでぶつからない。 【D(不正解)】 ? / と **kwds は同時に書けないと考えた結果です。 / と **kwds は同じ仮引数の並びに書ける。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.3 特殊なパラメータ)

    この問題へのリンク
  4. 社内向けに公開する関数で、将来仮引数の名前を変えても呼び出し側のコードを壊したくない。チュートリアルの要約に沿った引数の種類は?

    A. キーワード専用引数(* より後) B. 位置専用引数(/ より前) C. 位置でもキーワードでも渡せる引数(/ も * も書かない) D. デフォルト引数(= で既定値を書く)

    答えと解説

    正解: B 【A(不正解)】 ? 名前を書いて値を受け取る引数です。 呼び出し側が名前を書くため、名前を変えると呼び出しが壊れる。意味を明確にしたいときに向く。 【B(正解)】 ? 名前を使わず、並び順だけで値を受け取る引数です。 位置専用にすると呼び出し側は名前を使えないので、将来名前を変えても API の呼び出しは壊れない。 【C(不正解)】 ? 呼び出し側が渡し方を選べる引数です。 キーワードで呼ばれている場合、名前を変えると呼び出しが壊れる。 【D(不正解)】 ? 省略できるように既定値を持たせた引数です。 既定値の有無は渡し方の制限とは別の話で、名前で渡されれば名前の変更で壊れる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.3 特殊なパラメータ)

    この問題へのリンク
  5. def f(*, key): と定義した関数を f(3) と呼んだ。どうなるか?

    A. key に 3 が入る B. TypeError になる C. 3 は *args として捨てられる D. SyntaxError になる

    答えと解説

    正解: B 【A(不正解)】 ? 残りの位置に順に入ると考えた結果です。 * の後の仮引数には、位置で値を渡せない。 【B(正解)】 ? 位置では渡せず、呼び出した時点で拒まれると考えた結果です。 * より後の key はキーワード専用引数なので、位置では渡せない。f(key=3) と呼ぶ。Python 3.9.13 と 3.13.14 で実行すると TypeError が発生した。 【C(不正解)】 ? 余った位置引数がどこかにまとまると考えた結果です。 * だけでは余った位置引数を受け取る仮引数は作られない。 【D(不正解)】 ? 呼び出しの書き方が構文として誤っていると考えた結果です。 f(3) は構文としては正しい。呼び出した時点で TypeError になる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.3 特殊なパラメータ)

    この問題へのリンク

任意引数リスト(*args)

  1. 受け取った文字列を区切り文字でつなぐ関数を作った。3 つの文字列を渡したときの出力は? def concat(*args, sep='/'): return sep.join(args) print(concat('a', 'b', 'c'))

    A. a/b/c B. abc C. ('a', 'b', 'c') D. TypeError が発生する

    答えと解説

    正解: A 【A(正解)】 ? 既定の区切り文字 / でつながると考えた結果です。 *args が 'a', 'b', 'c' をタプルで受け取り、sep の既定値 '/' でつなぐ。Python 3.9.13 と 3.13.14 で実行した出力は「a/b/c」。 【B(不正解)】 ? 区切り文字なしでつないだと考えた結果です。 sep の既定値は '/' なので、間に / が入る。 【C(不正解)】 ? タプルをそのまま返したと考えた結果です。 sep.join(args) はタプルの要素を区切り文字でつないだ 1 つの文字列を返す。 【D(不正解)】 ? 引数の数が多すぎると考えた結果です。 *args は任意個の位置引数を受け取れる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.4 任意引数リスト)

    この問題へのリンク
  2. 区切りを '.' に変えるつもりで、最後に '.' を位置引数として渡した。出力はどれか? def concat(*args, sep='/'): return sep.join(args) print(concat('a', 'b', '.'))

    A. a.b B. a/b C. TypeError が発生する D. a/b/.

    答えと解説

    正解: D 【A(不正解)】 ? 最後の '.' が区切り文字として使われたと考えた結果です。 sep を変えるには concat('a', 'b', sep='.') のようにキーワードで渡す必要がある。 【B(不正解)】 ? 最後の '.' が捨てられたと考えた結果です。 位置で渡した値は捨てられず、すべて *args のタプルに入る。 【C(不正解)】 ? sep に値が 2 つ渡ったと考えた結果です。 '.' は sep ではなく *args に入るので、ぶつからずに動く。 【D(正解)】 ? '.' も *args に入り、区切りは既定値のままと考えた結果です。 *args の後ろの sep はキーワード専用なので、位置で渡した '.' は *args に入る。区切りは既定の '/' のまま。Python 3.9.13 と 3.13.14 で実行した出力は「a/b/.」。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.4 任意引数リスト)

    この問題へのリンク
  3. 次のコードを実行したときの出力はどれか? def f(*args): print(type(args).__name__) f(1, 2)

    A. list B. dict C. int D. tuple

    答えと解説

    正解: D 【A(不正解)】 ? 値を後から変えられる入れ物の型です。 *args はリストではなくタプルで受け取る。 【B(不正解)】 ? 名前と値の組を入れる入れ物の型です。 辞書で受け取るのは **kwargs の形の仮引数である。 【C(不正解)】 ? 1 つ目の値の型です。 args は値をまとめた入れ物で、個々の値の型ではない。 【D(正解)】 ? 値を後から変えられない並びの型です。 *args の形の仮引数は、残りの位置引数をタプルで受け取る。Python 3.9.13 と 3.13.14 で実行した出力は「tuple」。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.4 任意引数リスト)

    この問題へのリンク

引数リストのアンパック

  1. 次のコードを実行したときの出力はどれか? args = [3, 6] print(list(range(*args)))

    A. [3, 6] B. [3, 4, 5] C. [0, 1, 2] D. TypeError が発生する

    答えと解説

    正解: B 【A(不正解)】 ? リストがそのまま返ったと考えた結果です。 * はリストの値を展開して range() に渡す。結果は 3 から 5 までの並びになる。 【B(正解)】 ? 2 つの値が開始値と終端値として渡ると考えた結果です。 range(*args) は range(3, 6) と同じになる。終端値 6 は含まない。Python 3.9.13 と 3.13.14 で実行した出力は「[3, 4, 5]」。 【C(不正解)】 ? リストの長さが渡されたと考えた結果です。 渡るのは長さではなく、要素の 3 と 6 である。 【D(不正解)】 ? range() にリストは渡せないと考えた結果です。 * を付けているので、リストではなく 2 つの整数として渡る。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.5 引数リストのアンパック)

    この問題へのリンク
  2. 次のコードを実行したときの出力はどれか? def order(item, qty): print(item, qty) d = {'qty': 2, 'item': 'tea'} order(**d)

    A. tea 2 B. 2 tea C. qty item D. TypeError が発生する

    答えと解説

    正解: A 【A(正解)】 ? キーと同じ名前の仮引数に値が入ると考えた結果です。 **d は辞書をキーワード引数に展開する。order(qty=2, item='tea') と同じで、名前で対応づく。Python 3.9.13 と 3.13.14 で実行した出力は「tea 2」。 【B(不正解)】 ? 辞書に書いた順に、位置で渡ったと考えた結果です。 ** はキーワード引数として渡すので、辞書の順番ではなく名前で対応する。 【C(不正解)】 ? キーが値として渡ったと考えた結果です。 キーだけを位置で渡すのは *d の場合である。**d では値が名前付きで渡る。 【D(不正解)】 ? 辞書は引数として渡せないと考えた結果です。 ** を付けると、辞書のキーと値がキーワード引数として渡る。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.5 引数リストのアンパック)

    この問題へのリンク
  3. args = [3, 6] のとき、list(range(args)) を実行するとどうなるか?

    A. [3, 4, 5] が返る B. [0, 1] が返る C. TypeError が発生する D. [3, 6] が返る

    答えと解説

    正解: C 【A(不正解)】 ? リストが自動で展開されると考えた結果です。 自動では展開されない。range(*args) と * を付けて展開する。 【B(不正解)】 ? リストの長さが終端値になると考えた結果です。 range() はリストの長さを使わない。整数以外を渡すとエラーになる。 【C(正解)】 ? リストは整数の代わりに渡せないと考えた結果です。 * を付けないとリストそのものが 1 つの引数として渡る。range() は整数を求めるので TypeError になる。Python 3.9.13 と 3.13.14 で実行すると TypeError が発生した。 【D(不正解)】 ? リストがそのまま返ると考えた結果です。 range() はリストを受け取れないので、値は返らずエラーになる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.5 引数リストのアンパック)

    この問題へのリンク
  4. 設定を入れた辞書 opts を、関数にキーワード引数として展開して渡したい。呼び出しに付ける記号は?

    A. **(例: func(**opts)) B. *(例: func(*opts)) C. &(例: func(&opts)) D. ->(例: func(->opts))

    答えと解説

    正解: A 【A(正解)】 ? 辞書をキーワード引数に展開する記号です。 ** 演算子で辞書をキーワード引数として渡せる。 【B(不正解)】 ? リストやタプルを位置引数に展開する記号です。 辞書に * を付けるとキーだけが位置引数として渡る。キーワード引数にはならない。 【C(不正解)】 ? C 言語でアドレスを取り出す記号です。 Python の関数呼び出しに & で展開する書き方は無い。 【D(不正解)】 ? 関数定義で戻り値の注釈に使う記号です。 -> は関数アノテーションで戻り値を書く記号で、展開には使わない。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.5 引数リストのアンパック)

    この問題へのリンク

ラムダ式

  1. 次のコードを実行したときの出力はどれか? def make_incrementor(n): return lambda x: x + n f = make_incrementor(42) print(f(0), f(1))

    A. 0 1 B. 42 42 C. NameError が発生する D. 42 43

    答えと解説

    正解: D 【A(不正解)】 ? 外側の n が使われないと考えた結果です。 ラムダ式は外側のスコープの n を参照できる。 【B(不正解)】 ? 引数 x が無視されると考えた結果です。 x + n なので、x が 1 なら 43 になる。 【C(不正解)】 ? 関数が終わると n が消えると考えた結果です。 入れ子の関数は外側の変数を参照できる。make_incrementor() が終わった後も n を使える。 【D(正解)】 ? ラムダ式が外側の n = 42 を使い続けると考えた結果です。 make_incrementor(42) は lambda x: x + 42 にあたる関数を返す。f(0) は 42、f(1) は 43。Python 3.9.13 と 3.13.14 で実行した出力は「42 43」。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.6 ラムダ式)

    この問題へのリンク
  2. 次のコードを実行したときの出力はどれか? pairs = [(1, 'b'), (2, 'c'), (3, 'a')] pairs.sort(key=lambda p: p[1]) print(pairs)

    A. [(1, 'b'), (2, 'c'), (3, 'a')] B. [(3, 'a'), (1, 'b'), (2, 'c')] C. [(2, 'c'), (1, 'b'), (3, 'a')] D. None

    答えと解説

    正解: B 【A(不正解)】 ? 各タプルの 1 番目の要素の順に並べた結果です。 key を省いた場合はこの順になる。ここでは p[1] で比べている。 【B(正解)】 ? 各タプルの 2 番目の要素の順に並べた結果です。 key=lambda p: p[1] で 2 番目の要素(文字列)を比べて並べ替える。a, b, c の順になる。Python 3.9.13 と 3.13.14 で実行した出力は「[(3, 'a'), (1, 'b'), (2, 'c')]」。 【C(不正解)】 ? 2 番目の要素の逆順に並べた結果です。 逆順にするには reverse=True が要る。ここでは昇順である。 【D(不正解)】 ? sort() の戻り値を表示したと考えた結果です。 sort() の戻り値は None だが、ここで print しているのは並べ替えた後の pairs である。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.6 ラムダ式)

    この問題へのリンク
  3. ラムダ式の説明として、チュートリアルに合うものは?

    A. if や for などの文を何行でも本体に書ける B. 名前の無い小さな関数を作れ、本体は 1 つの式に限られる C. 外側のスコープの変数は参照できない D. def で作る関数より実行が必ず速くなる

    答えと解説

    正解: B 【A(不正解)】 ? 本体に文を並べられるという説明です。 ラムダ式の本体に文は書けない。1 つの式だけである。 【B(正解)】 ? 書ける中身に制限がある、短い関数の作り方の説明です。 lambda で小さな無名関数を作れる。構文上 1 つの式しか書けない。 【C(不正解)】 ? 使える変数の範囲を狭く見た説明です。 入れ子の関数と同じく、外側のスコープの変数を参照できる。 【D(不正解)】 ? 実行速度についての説明です。 チュートリアルに速さの話は無い。ラムダ式は通常の関数定義に構文的な糖衣をかぶせたものだと説明されている。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.6 ラムダ式)/式(ラムダ)

    この問題へのリンク
  4. 次のうち、構文エラー(SyntaxError)になるラムダ式はどれか?

    A. lambda x, y: x + y * 2 B. lambda: print('hi') C. lambda x: return x * 2 D. lambda x=1, y=2: x * y

    答えと解説

    正解: C 【A(不正解)】 ? 引数を 2 つ受け取るラムダ式です。 引数はいくつでも書ける。x + y * 2 という 1 つの式の値を返す。 【B(不正解)】 ? 引数を受け取らないラムダ式です。 引数は無くてもよい。print() の呼び出しは式なので本体に書ける。 【C(正解)】 ? 本体に return 文を書いたラムダ式です。 ラムダ式の本体は 1 つの式だけで、return のような文は書けない。値は式の結果がそのまま返る。Python 3.9.13 と 3.13.14 で実行すると SyntaxError が発生した。 【D(不正解)】 ? 引数にデフォルト値を付けたラムダ式です。 ラムダ式の引数にもデフォルト値を付けられる。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.6 ラムダ式)/式(ラムダ)

    この問題へのリンク

ドキュメンテーション文字列

  1. 次のコードを実行したときの出力はどれか? def f(): """Return zero.""" return 0 print(f.__doc__)

    A. None B. Return zero. C. 0 D. """Return zero."""

    答えと解説

    正解: B 【A(不正解)】 ? 文字列が説明として扱われないと考えた結果です。 本体の最初の文が文字列なので、__doc__ には None ではなくその文字列が入る。 【B(正解)】 ? 本体の最初の文字列が説明として保存されると考えた結果です。 関数本体の最初の文の文字列リテラルはドキュメンテーション文字列になり、__doc__ で読める。Python 3.9.13 と 3.13.14 で実行した出力は「Return zero.」。 【C(不正解)】 ? 関数の戻り値が表示されたと考えた結果です。 f.__doc__ は関数を呼ばずに説明の文字列を取り出す。戻り値の 0 ではない。 【D(不正解)】 ? 文字列を囲む引用符まで含めて表示した結果です。 引用符は文字列リテラルの書き方で、文字列の中身には含まれない。

    出典: Python チュートリアル 4. その他の制御フローツール(4.8 関数を定義する)/データモデル(function.__doc__)

    この問題へのリンク
  2. 関数のドキュメンテーション文字列の書き方として、チュートリアルの慣習に合うものは?

    A. 1 行目は目的の短い要約で、続きがあれば 2 行目を空行にする B. 1 行目には必ず関数名と引数の型を書く C. 要約は最後の行に書き、1 行目は空行にする D. 説明は docstring でなく、関数の前のコメントにだけ書く

    答えと解説

    正解: A 【A(正解)】 ? 要約の行と詳しい説明を分ける書き方です。 1 行目は目的を短くまとめ、大文字で始めてピリオドで終える。続きがあるときは 2 行目を空行にする。 【B(不正解)】 ? 名前や型を最初に明記する書き方です。 名前や型は他の方法で分かるので、簡潔にするため明記しないとされている。 【C(不正解)】 ? まとめを末尾に置く書き方です。 要約は最初の行に書く。空行にするのは 2 行目である。 【D(不正解)】 ? コメントで説明を残す書き方です。 チュートリアルとコーディングスタイルの節は、docstring を使うよう勧めている。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.7 ドキュメンテーション文字列)/Python チュートリアル 4. その他の制御フローツール(4.10 間奏曲: コーディングスタイル)

    この問題へのリンク
  3. 次のコードを実行したときの出力はどれか? def g(): x = 1 """Not a docstring.""" return x print(g.__doc__)

    A. Not a docstring. B. 1 C. SyntaxError が発生する D. None

    答えと解説

    正解: D 【A(不正解)】 ? 本体のどこにある文字列でも説明になると考えた結果です。 2 文目以降の文字列は docstring にならない。 【B(不正解)】 ? 戻り値が表示されたと考えた結果です。 g.__doc__ は関数を呼ばないので、戻り値の 1 は出ない。 【C(不正解)】 ? 関数の途中に文字列だけの行は書けないと考えた結果です。 文字列だけの行は式文として書ける。評価されるだけで何もしない。 【D(正解)】 ? 2 文目以降の文字列は説明にならないと考えた結果です。 docstring になるのは本体の最初の文の文字列リテラルだけ。x = 1 の後の文字列はただの式文で、__doc__ は None。Python 3.9.13 と 3.13.14 で実行した出力は「None」。

    出典: Python チュートリアル 4. その他の制御フローツール(4.8 関数を定義する)/データモデル(function.__doc__)

    この問題へのリンク

関数アノテーション

  1. 次のコードを実行したときの出力はどれか? def double(x: int) -> int: return x * 2 print(double('ab'))

    A. TypeError が発生する B. 0 C. None D. abab

    答えと解説

    正解: D 【A(不正解)】 ? 注釈の型と違う値を渡すとエラーになると考えた結果です。 注釈は任意のメタデータで、実行時に型を調べたりはしない。 【B(不正解)】 ? 注釈の int に合わせて変換されたと考えた結果です。 注釈が値を変換することは無い。 【C(不正解)】 ? 型が合わないと戻り値が None になると考えた結果です。 注釈は戻り値にも影響しない。x * 2 の結果がそのまま返る。 【D(正解)】 ? 注釈は実行に影響しないと考えた結果です。 関数アノテーションは関数の動作に影響しない。'ab' * 2 が計算されて abab になる。Python 3.9.13 と 3.13.14 で実行した出力は「abab」。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.8 関数のアノテーション)

    この問題へのリンク
  2. 次のコードを実行したときの出力はどれか? def f(a: int) -> str: return str(a) print(f.__annotations__['return'])

    A. <class 'int'> B. None C. KeyError が発生する D. <class 'str'>

    答えと解説

    正解: D 【A(不正解)】 ? 引数 a の注釈を取り出したと考えた結果です。 a の注釈はキー 'a' で入る。'return' は戻り値の注釈である。 【B(不正解)】 ? 関数を呼ばないと注釈は入らないと考えた結果です。 注釈は関数を定義した時点で関数オブジェクトに付く。 【C(不正解)】 ? 'return' というキーは無いと考えた結果です。 戻り値の注釈を書けば、キー 'return' で取り出せる。 【D(正解)】 ? 'return' のキーに戻り値の注釈が入ると考えた結果です。 注釈は__annotations__に辞書として入る。戻り値の注釈のキーは 'return' である。Python 3.9.13 と 3.13.14 で実行した出力は「<class 'str'>」。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.8 関数のアノテーション)/データモデル(function.__annotations__)

    この問題へのリンク
  3. 関数の戻り値に型の注釈を付けたい。def の行で使う書き方は?

    A. 仮引数の括弧の後に -> 型 を書く(例: def f(x) -> int:) B. 関数名の前に型を書く(例: def int f(x):) C. 最後のコロンの後に : 型 を書く(例: def f(x):: int) D. return 文に as 型 を付ける(例: return x as int)

    答えと解説

    正解: A 【A(正解)】 ? 括弧と最後のコロンの間に矢印で書く形です。 戻り値の注釈は、仮引数リストと def 文の終わりのコロンの間に -> と式を書く。 【B(不正解)】 ? C 言語のように型を先に書く形です。 Python の関数定義では、この書き方は構文エラーになる。 【C(不正解)】 ? コロンを重ねて型を書く形です。 コロンを重ねる書き方は無い。: 型 は仮引数の注釈に使う。 【D(不正解)】 ? 戻すときに型を付ける形です。 return 文に as は付けられない。注釈は def の行に書く。

    出典: Python チュートリアル 4. その他の制御フローツール(4.9.8 関数のアノテーション)

    この問題へのリンク

コーディングスタイル(PEP 8)

  1. チュートリアルが紹介する PEP 8 の要点で、インデントの付け方として勧められているものは?

    A. タブ 1 つを使い、空白は使わない B. 空白 2 つを使う C. 空白とタブを行ごとに混ぜて使う D. 空白 4 つを使い、タブは使わない

    答えと解説

    正解: D 【A(不正解)】 ? タブ文字で字下げする付け方です。 タブは混乱させるので使わないよう勧められている。 【B(不正解)】 ? 字下げを浅くする付け方です。 勧められているのは空白 4 つである。 【C(不正解)】 ? その場に合わせて使い分ける付け方です。 混ぜると読みにくく混乱のもとになる。タブは使わない。 【D(正解)】 ? 空白の数を決め、タブを避ける付け方です。 空白 4 つは小さいインデントと大きいインデントのちょうど中間で、タブは混乱させるので使わないとされている。

    出典: Python チュートリアル 4. その他の制御フローツール(4.10 間奏曲: コーディングスタイル)/PEP 8 – Style Guide for Python Code

    この問題へのリンク
  2. チュートリアルが紹介する PEP 8 の要点で、1 行の長さについて勧められているものは?

    A. 120 文字を超えないように折り返す B. 1 文は必ず 1 行に収め、折り返さない C. 79 文字を超えないように折り返す D. 画面の幅に合わせて自由に決める

    答えと解説

    正解: C 【A(不正解)】 ? やや長めの上限を設ける考え方です。 チュートリアルが挙げている上限は 79 文字である。 【B(不正解)】 ? 行を分けずに書く考え方です。 長い行は折り返すよう勧められている。 【C(正解)】 ? 1 行の文字数に上限を設ける考え方です。 79 文字以内なら小さい画面でも読みやすく、大きい画面ではファイルを並べて表示できると説明されている。 【D(不正解)】 ? 上限を決めない考え方です。 上限を決めずにおくと小さい画面で読みにくい。79 文字が勧められている。

    出典: Python チュートリアル 4. その他の制御フローツール(4.10 間奏曲: コーディングスタイル)/PEP 8 – Style Guide for Python Code

    この問題へのリンク
  3. 買い物かごを表すクラスと、品物を追加するメソッドを作る。チュートリアルが紹介する名前の付け方に合う組み合わせは?

    A. class shopping_cart と def AddItem(self, item) B. class ShoppingCart と def AddItem(this, item) C. class SHOPPING_CART と def additem(self, item) D. class ShoppingCart と def add_item(self, item)

    答えと解説

    正解: D 【A(不正解)】 ? クラスとメソッドの名付け方を入れ替えた組み合わせです。 クラスと関数の名付け方が逆になっている。 【B(不正解)】 ? メソッドも大文字始まりにし、第 1 引数を this にした組み合わせです。 メソッド名は小文字と _ で書き、第 1 引数は常に self とする。 【C(不正解)】 ? すべて大文字のクラス名と、区切りの無いメソッド名の組み合わせです。 クラス名は UpperCamelCase、メソッド名は単語を _ でつなぐ。 【D(正解)】 ? クラスは単語の頭を大文字で続け、メソッドは小文字を _ でつなぐ組み合わせです。 クラス名は UpperCamelCase、関数名とメソッド名は lowercase_with_underscores、メソッドの第 1 引数は self が慣習である。

    出典: Python チュートリアル 4. その他の制御フローツール(4.10 間奏曲: コーディングスタイル)/PEP 8 – Style Guide for Python Code

    この問題へのリンク
  4. チュートリアルが紹介する PEP 8 の要点に沿った空白の入れ方はどれか?

    A. a=f(1,2)+g(3,4) B. a = f( 1, 2 ) + g( 3, 4 ) C. a = f(1 ,2) + g(3 ,4) D. a = f(1, 2) + g(3, 4)

    答えと解説

    正解: D 【A(不正解)】 ? 空白をまったく入れない書き方です。 演算子の前後とコンマの後に空白が無く、読みにくい。 【B(不正解)】 ? 括弧のすぐ内側にも空白を入れた書き方です。 括弧類のすぐ内側には空白を入れないよう勧められている。 【C(不正解)】 ? コンマの前に空白を入れた書き方です。 空白はコンマの前ではなく後に入れる。 【D(正解)】 ? 演算子の前後とコンマの後に空白があり、括弧のすぐ内側には無い書き方です。 演算子の前後とコンマの後に空白を入れ、括弧類のすぐ内側には入れない。チュートリアルの例と同じ形。

    出典: Python チュートリアル 4. その他の制御フローツール(4.10 間奏曲: コーディングスタイル)/PEP 8 – Style Guide for Python Code

    この問題へのリンク

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

break 文:最も内側の for ループや while ループを途中で抜ける文。

continue 文:ループの残りの処理を飛ばして、次の繰り返しに進む文。

enumerate():シーケンスの位置(インデックス)と値を組にして返す組み込み関数。

for 文:リストや文字列などのシーケンスの要素を、並んでいる順に 1 つずつ取り出して繰り返す文。

function.__annotations__:関数アノテーションを辞書で保持する関数の属性。戻り値の注釈はキー 'return' に入る。

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

if 文:条件によって実行する処理を分ける文。elif を 0 個以上、else を 1 つまで付けられる。

None:値が無いことを表す特別な値。return の無い関数の戻り値になる。

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

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

PEP 8:多くのプロジェクトが従う Python のコーディングスタイルガイド。インデントは空白 4 つ、1 行は 79 文字以内などを定める。

range():等差数列を表す組み込みの型。range(10) は 0〜9 を生成し、終端値は含まない。開始値と増分(負も可)も指定できる。

return 文:関数から値を返して処理を終える文。式を書かない return や、return の無い関数は None を返す。

reversed():シーケンスを逆順にたどるイテレータを返す組み込み関数。

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

sort():リストをその場で(元のリストを書き換えて)並べ替えるメソッド。戻り値は None。

sorted():要素を並べ替えた新しいリストを返す組み込み関数。元のデータは変わらない。

sum():イテラブルの要素を左から順に足した合計を返す組み込み関数。sum(range(4)) は 6。

UnboundLocalError:関数の中のローカル変数を、値を代入する前に参照したときに起きる例外。NameError の一種。

UTF-8:Python のソースファイルの既定の文字コード。世界中のほとんどの言語の文字を扱える。

while 文:条件が真である限り本体を繰り返す文。

zip():複数のイテラブルの要素を順に組にして返す組み込み関数。

イテラブル:for 文で繰り返せるオブジェクト。リスト・文字列・辞書・range など。iter() に渡すとイテレータが得られる。

インデント:行頭の空白。Python は括弧ではなくインデントで文のまとまり(ブロック)を表す。

キーワード引数:name=value の形で、仮引数の名前を指定して渡す引数。位置引数より後に書く。

キーワード専用引数:仮引数リストの * より後に置いた引数。キーワード引数としてしか渡せない。

コメント:# から行末までの部分。Python は解釈しない。文字列リテラルの中の # はただの文字になる。

タプル:コンマで区切った値の並びで、変更できない(イミュータブル)シーケンス。要素 1 つのタプルは値の後にコンマを付ける。

デフォルト引数:仮引数に指定する既定の値。関数を定義した時点で 1 度だけ評価される。

ドキュメンテーション文字列:関数やクラスの本体の最初に書く説明の文字列。1 行目は目的の短い要約にする。

べき乗:** 演算子による計算。2 ** 7 は 2 の 7 乗で 128。

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

ラムダ式:lambda で作る小さな無名関数。本体には式を 1 つだけ書ける。

ループの else 節:for や while の後に書く else 節。break せずにループが終わったときだけ実行される。

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

位置引数:名前を付けずに、並んだ順番で仮引数に対応させて渡す引数。

位置専用引数:仮引数リストの / より前に置いた引数。位置でしか渡せず、キーワードでは渡せない。

引数のアンパック:リストやタプルを * で、辞書を ** で展開して関数に渡すこと。

仮引数:関数の定義で、呼び出し時に値を受け取る名前。def f(a, b): の a と b。

可変長引数:任意個の引数を受け取る仮引数。*args は位置引数をタプルで、**kwargs はキーワード引数を辞書で受け取る。

関数:def で定義する、名前の付いた処理のまとまり。引数を受け取り、return で値を返す。

関数アノテーション:引数や戻り値に付ける任意のメタデータ。引数は「名前: 式」、戻り値は「-> 式」で書き、__annotations__ 属性に保存される。

辞書:キーと値の組を集めたデータ型。キーには文字列や数値など変更できない型を使う。

実引数:関数を呼び出すときに渡す値。位置で渡す位置引数と、名前で渡すキーワード引数がある。

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

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

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

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

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

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

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

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

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