第5章_関数
今回の項目では、関数について出題されます。
本試験の主教材である「Python3エンジニア認定基礎試験問題集」では第5章(P68~P71)の5問の内容です。
練習問題 1
次のコードを実行した結果として正しいものを選択してください。
def add_to_list(value, my_list=[]):
my_list.append(value)
return my_list
print(add_to_list(1))
print(add_to_list(2))
print(add_to_list(3))
1.[1]
[2]
[3]
2.[1]
[1, 3]
[1, 3, 2]
3.[1]
[1, 2]
[1, 2, 3]
4、エラーが発生する。
答えはコチラをクリック!
答え:3
ポイント
デフォルト値としてリストを指定した場合、そのリストは関数定義時に1回だけ作成されます。
このコードでは、関数のデフォルト引数 my_list=[] は、関数定義時に一度だけ作られます。関数が呼び出されるたびに同じリストが使用され、各呼び出しで引数に値が追加されるたびにデフォルト値も変更されます。
練習問題 2
次のコードを実行した結果として正しいものを選択してください。
def print_arguments(*args, **kwargs):
print("args:", args)
print("kwargs:", kwargs)
print_arguments(1, 2, 3, name="太郎", age=25)
1、args: (1, 2, 3), kwargs: {‘name’: ‘太郎’, ‘age’: 25}
2、args: [1, 2, 3], kwargs: {‘name’: ‘太郎’, ‘age’: 25}
3、args: (1, 2, 3), kwargs: {‘age’: 25, ‘name’: ‘太郎’}
4、args: (1, 2, 3), kwargs: {‘name’: ‘太郎’}
答えはコチラをクリック!
答え:1
ポイント
Pythonでは関数定義で引数に * または ** (1個または2個のアスタリスク)をつけると、任意の数の引数(可変長引数)を関数に渡すことができます。
*args は位置引数をタプルとして受け取ります。関数呼び出し時に渡された引数の順番を保ちながら格納されます。この仕様により、args はタプル (1, 2, 3) となります。
**kwargs はキーワード引数を辞書として受け取ります。引数名をキー、対応する値を値として格納します。この仕様により、kwargs は {‘name’: ‘太朗’, ‘age’: 25} となります。
選択肢 2 のように args がリスト [1, 2, 3] になることはありません。Pythonでは *をつけた引数 を使うとタプルが生成されるように設計されているためです。
なお、慣例として「*args」, 「**kwargs」という名前が使われることが多いが、* と ** が頭についていれば他の名前でも問題ありません。
練習問題 3
次のコードを実行した結果として正しいものを選択してください。
def concat(*args, sep=" "):
return sep.join(args)
words = ["I", "am", "a student."]
options = {"sep" : ","}
print(concat(*words))
1.[“I”, “am”, “a student.”]
2.I, am, a student.
3.Iama student.
4.I am a student.
答えはコチラをクリック!
答え:4
ポイント
optionsの内容はプログラム中で使用されていないため、無視されます。
*words でリストがアンパックされ、concat に “I” , “am”, “a student.” が渡されます。
sepは指定されていないためデフォルトの ” “(スペース)が使われます。
結果として、”I am a student.” が出力されます。
練習問題 4
実行結果が [1, 4, 9, 16, 25] になるように、以下のプログラムの①に入る適切なプログラムを選択肢の中から選んでください。
numbers = [1, 2, 3, 4, 5]
result = list(map(①, numbers))
print(result)
- lambda x (x * x)
- lambda x: x * x
- lambda: x * x
- lambda(x * x)
答えはコチラをクリック!
答え:2
ポイント
lambda式の書式は、「lambda 引数: 式」という書き方をします。
lambda x (x * x)
→ 構文エラーです。lambda式では、「 : 」が必要です。
lambda x: x * x
→ 正しい構文です。x を引数に取り、その二乗を計算します。結果が [1, 4, 9, 16, 25] になります。
lambda: x * x
→ 構文エラーです。lambda式では引数が必要ですが、「 : 」の前に何も指定されていません。
lambda(x * x)
→ 構文エラーです。lambda式の引数部分を丸括弧で囲むのは無効です。
練習問題 5
以下のプログラムの関数内でドキュメンテーション文字列(docstring)を書く際に、①に書く必要のある記号を選択肢から選んでください。
def hello():
①
これはdocstringです。
この関数は実行すると「Hello」と表示をする関数です。
①
print("Hello")
hello()
1. ###
2. ///
3. /**
4. “””
答えはコチラをクリック!
答え:4
ポイント
ドキュメンテーション文字列は「”””」または「”’」で囲んで記述します。
基本的に、ドキュメンテーション文字列の1行目に関数の目的などを書き、1行開けた後3行目から関数の使い方や詳細な説明を書くことが推奨されます。
確認問題 1
次のコードを実行した結果として正しいものを選択してください。
def func(vegetables, fruits=["リンゴ","ナシ","モモ"]):
fruits.append(vegetables)
return fruits
func("イチゴ")
func("トマト", ["キュウリ","ナス"])
func("スイカ")
print(func("キャベツ", ["ネギ", "ピーマン"]))
1、[‘リンゴ’, ‘ナシ’, ‘モモ’, ‘スイカ’]
2、[‘リンゴ’,’ナシ’,’モモ’, ‘ネギ’, ‘ピーマン’, ‘キャベツ’]
3、[‘リンゴ’, ‘ナシ’, ‘モモ’, ‘イチゴ’, ‘スイカ’]
4、[‘ネギ’, ‘ピーマン’, ‘キャベツ’]
答えはコチラをクリック!
答え:4
引数のデフォルト値にリストを指定した場合、引数がなにも与えられていない場合はデフォルト値のリストに値が追加されますが、引数にリストが指定されていた場合はデフォルト値のリストは使われません。
今回はprint(func(“キャベツ”, [“ネギ”, “ピーマン”]))と、引数のリストが与えられているので、単純に[“ネギ”,”ピーマン”]というリストに”キャベツ”が追加されるだけの処理が行われました。
確認問題 2
次のプログラムの①に各プログラムで、実行するとエラーになるものを選んでください。
def func(name, *feature, **info):
print(name)
print(feature)
print(info)
func(①)
1. “レオ”, “活発”
2. “かよこ”, “絵が得意”, age=18, height=163
3. “翔太”, height=166, weight=51
4. age=22, “プログラマー”, “正博”
答えはコチラをクリック!
答え:4
name引数と*feature引数は位置引数です。**infoに入る辞書型の引数の後に位置引数を指定することはできません。
確認問題 3
次のコードを実行した結果として、正しいものを選択してください。
def func(args):
print(args)
words = ["a", "b", "c"]
func(*words)
- ([‘a’, ‘b’, ‘c’])
- [‘a’, ‘b’, ‘c’]
- a b c
- エラーになる
答えはコチラをクリック!
答え:4
リストやタプルを引数として関数に渡す際、先頭に「 * 」をつけることで要素を位置引数に展開して渡せます。(アンパックという)
このプログラムでは[“a”, “b”, “c”]というリストが入った変数wordsをアンパックして関数に渡しているが、関数funcの仮引数が1つしかないため引数を受け取り切れずエラーになります。
確認問題 4
次のコードを実行した結果として正しいものを選択してください。
func = lambda a, b: print(a + b)
x = "Hello"
y = "world."
func(x,y)
- Helloworld.
- Hello world.
- 何も出力されない
- エラーになる
答えはコチラをクリック!
答え:1
このプログラムでは引数として渡されたaとbを足してprint文で表示する無名関数を作っています。
引数として文字列を渡したため文字列同士が連結され「Helloworld.」と表示されます。
確認問題 5
次のドキュメンテーション文字列に関する選択肢のうち、正しいものを選んでください。
- ドキュメンテーション文字列は関数の中で一番最後に記述することが推奨される。
- ドキュメンテーション文字列は必ず単一行で記述する必要がある。
- ドキュメンテーション文字列には、関数のパラメータや戻り値の説明を含めることが推奨される。
- ドキュメンテーション文字列は必ず3つのダブルクォーテーションを使用して記述しなければならない。
答えはコチラをクリック!
答え:3
1.(間違い)ドキュメンテーション文字列(docstring)は関数の中で最初の行に記述します。関数の定義直後に置かれることで、Pythonの組み込み関数 help() などで適切に説明が表示されるようになっています。
2.(間違い)ドキュメンテーション文字列は単一行でも複数行でも記述できます。複雑な関数やクラスでは、詳細な説明を記述するために複数行を使うことが一般的です。
3.(正解)ドキュメンテーション文字列には、関数やクラスの使い方を明確にするために、引数や戻り値の説明を含めることが推奨されます。
4.(間違い)ドキュメンテーション文字列は3つのシングルクォート「 ”’ 」でも、3つのダブルクォート「 “”” 」でも記述できます。
次回は…
次回は「012_Pythonエンジニア認定基礎試験6-1~5」です。
その他コレクションの操作について学びましょう!
参考資料一覧:Python3エンジニア認定[基礎試験]問題集
https://www.pythonic-exam.com
https://data-engineer-japan.com
https://mynavi-agent.jp
https://python-basic.com
https://www.tokai-bs.co.jp
https://freelance.techcareer.jp/articles/wp/skills/python/detail/550/
https://pythonzen-pep8-exam.jp/