基礎・上級問題チェック

問題 14 /40

次のコードを実行したときの処理として、正しいものはどれか。

def job(*args, **kwargs):
    for arg in args:
        print(arg)
    for kwarg in kwargs:
        print(kwargs[kwarg])

args = [1, 2]
kwargs = {'three': 3, 'four': 4}

job(*args, **kwargs)

選択 1

1
2
three
four

選択 2

1
2
3
4

選択 3

[1, 2]
{'three': 3, 'four': 4}

選択 4

1
2
three: 3
four: 4

解説

選択肢2が正解です。

引数のアンパックに関する出題です。

リストや辞書を引数に渡して要素を一つずつ処理したい場合は、「def job(*args, **kwargs)」のように、「*(リストかタプル)」と「**(辞書)」で指定します。

最終行のように、呼び出す際も「job(*args, **kwargs)」と指定します。

「for kwarg in kwargs:」は、「kwargs」に「{'three': 3, 'four': 4}」が代入され、「kwarg」に辞書のキーである「three」と「four」が順番に代入されます。

「print(kwargs[kwarg])」は、「kwargs」に「{'three': 3, 'four': 4}」が代入され、「kwarg」に「three」と「four」が順番に代入されます。

その結果、「kwargs['three']」と「kwargs['four']」となり、値の「3」と「4」を出力します。

なお、最終行を「job(args, kwargs)」とすると、「def job(*args, **kwargs):」の「*args」にタプルの可変長引数「([1, 2], {'three': 3, 'four': 4})」として渡され、「for arg in args:」で一つずつ処理されて、選択肢3の結果になります。

(公式書籍 p.38-39)