基礎・上級問題チェック

問題 16 /40

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

num = [1, 2, 3, 4]

even = filter(lambda x: y % 2 == 0, num)

print(list(even))

選択 1

エラーになる。

選択 2

[1, 2, 3, 4]

選択 3

[1, 2]

選択 4

[2, 4]

解説

選択肢1が正解です。

無名関数lambdaに関する出題です。

lambdaは、defで関数を作成するほどではない小さな処理をする際に役立ちます。

構文は「lambda 引数 : 式」となり、式で使用した変数を引数に渡す必要があります。

問題文は式で使用した変数「y」を、引数「x」として渡しているため、「NameError: name 'y' is not defiend」とエラーになります。

正しい構文は「even = filter(lambda y: y % 2 == 0, num)」で、この場合は選択肢4の結果を得られます。

filter関数は「filter(関数, イテラブルオブジェクト)」と記述します。

第二引数で渡したイテラブルオブジェクト(num)を、第一引数の関数(lambda y: y % 2 == 0)に一つずつ渡して、Trueとなる要素だけのオブジェクトを作成します。

問題文の場合は、2で割った余りが0(偶数)の数値だけ抽出します。

問題文のコードは以下のリスト内包表記でも記述できます。

num = [1, 2, 3, 4]
even = [y for y in num if y % 2 == 0]
print(even)

(公式書籍 p.39)