関数(解答)#

演習1:関数の基礎#

演習1-1#

以下の関数 simple_function は不完全な関数である(そのまま実行してもエラーが出る).

def simple_function():
    print(3 * x + 1)

引数として x を設定し,x に渡された数値を用いて \(3x + 1\) の計算結果を出力するように修正せよ.

また,実際に x に何かしらの値を設定して関数を呼び出し,計算結果が正しく表示されることを確認せよ(例えば x10 を設定すると 31 が表示されるはず).

# 解答例
def simple_function(x):
    print(3 * x + 1)

simple_function(10)
31

演習1-2#

先ほどの関数 simple_function を修正し, \(3x + 1\) の計算結果を戻り値として返すように変更せよ.

また,実際に x に何かしらの値を設定して関数を実行し,返ってきた戻り値を変数 result に格納せよ. この result の値を print 文で表示し,正しく計算できていることを確認せよ.

# 解答例
def simple_function(x):
    return 3 * x + 1

result = simple_function(10)
print(result)
31

演習1-3#

演習1-2の関数 simple_function をさらに修正し,2つの引数 x, y に対して \(3x^2 + 2y + 1\) を計算するように変更せよ.

また,実際に x, y に何かしらの値を設定して関数を実行し,返ってきた戻り値を変数 result に格納せよ. この result の値を print 文で表示し,正しく計算できていることを確認せよ.

# 解答例
def simple_function(x, y):
    return 3 * x**2 + 2 * y + 1

result = simple_function(2, 1)
print(result)
15

演習2:関数の実践#

以下の例題を参考に,課題2-1〜2-5の各課題の条件に合う関数を作成せよ. プログラムには,その関数を呼び出す命令文を含めること. 関数に戻り値がある場合は,受け取った戻り値を出力すること(return 文を使って戻り値を設定するかどうかは課題ごとに判断せよ).

課題を解くためには,前の回で学んだ条件分岐やループ処理に関する知識が必要になるので,不安な人は復習しておこう.

例題#

関数名:   get_rectangle_area
引数:    width, height
処理の内容: 引数で渡された幅(width)と高さ(height)の値を持つ長方形の面積を返す.

解答例

def get_rectangle_area(width, height):
    return width * height

result = get_rectangle_area(8, 3) # 関数を呼び出す命令文を書く
print(result) # 戻り値がある場合は,受け取った戻り値を出力する
24

演習2-1#

関数名:   say_hello
引数:    count
処理の内容: 引数で渡された count の数だけ,Hello という文字列を出力する.

出力例(count = 3 を引数とした場合):

Hello
Hello
Hello
# 解答例
def say_hello(count):
    for i in range(count):
        print('Hello')

say_hello(3)
Hello
Hello
Hello

演習2-2#

関数名:   get_triangle_area
引数:    base, height
処理の内容: 底辺の長さが base,高さが height で表される三角形の面積を返す

# 解答例
def get_triangle_area(base, height):
    return base * height / 2

result = get_triangle_area(5, 2)
print(result)
5.0

演習2-3#

関数名:   get_bigger_number
引数:    a, b
処理の内容: 引数で渡された2つの数字(a, b)のうち,大きな方の値を返す(値が等しい場合はどちらを返してもよい).

# 解答例
def get_bigger_number(a, b):
    if a > b:
        return a
    else:
        return b

result = get_bigger_number(10, 3)
print(result)
10

演習2-4#

関数名:   get_absolute_value
引数:    value
処理の内容: 引数で渡された value の値の絶対値を返す.
5.2 の絶対値は 5.2-3.3 の絶対値は 3.3
※ 組み込み関数の abs は使わないこと.

# 解答例
def get_absolute_value(value):
    if value < 0:
        return -1 * value
    else:
        return value

result = get_absolute_value(-3.3)
print(result)
3.3

演習2-5#

関数名:   print_each_character
引数:    string
処理の内容: 引数で渡された文字列 string に含まれる文字を1文字ずつ表示する

実行・出力例

print_each_character('Hello')
H
e
l
l
o
# 解答例
def print_each_character(string):
    for c in string:
        print(c)

print_each_character('Hello')
H
e
l
l
o

演習3:発展課題#

これ以降は発展的な演習課題となります. 解くことは必須ではありませんが,関数を応用する良い練習になるので,ぜひチャレンジしてみてください.

演習2と同様に,以下の条件に合う関数を作成せよ. 課題を解く上での要件は演習2を参照.

演習3-1#

関数名:   get_even
引数:    numbers(整数が格納されたリスト)
処理の内容: 引数で渡された整数のリスト(numbers)の中に,偶数が何個含まれているかカウントし,そのカウント数を返す.
※ 例:get_even([1, 2, 4]) とすると,値 2 を返すようにする.

# 解答例
def get_even(numbers):
    n_even = 0
    for num in numbers:
        if num % 2 == 0:
            n_even = n_even + 1
    
    return n_even

result = get_even([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(result)
5

演習3-2#

関数名:   get_even_and_odd
引数:    numbers(整数が格納されたリスト)
処理の内容: 引数で渡された整数のリスト(numbers)の中に,偶数が何個含まれているか,および奇数が何個含まれているかをカウントし,それぞれのカウント数を返す.
※ 例:get_even_and_odd([1, 2, 4]) とすると,タプル 2, 1 を返すようにする.

# 解答例
def get_even_and_odd(numbers):
    n_even = 0
    n_odd = 0
    for num in numbers:
        if num % 2 == 0:
            n_even = n_even + 1
        else:
            n_odd = n_odd + 1
    
    return n_even, n_odd

result1, result2 = get_even_and_odd([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(f'偶数の数: {result1},  奇数の数: {result2}')
偶数の数: 5,  奇数の数: 5

演習3-3#

関数名:   countdown
引数:    start, end=0
処理の内容: start に指定した整数から1つずつカウントダウンを行い,end に到達するまでカウントダウンの結果を表示するプログラムを作成せよ.例えば,start=5, end=0 と指定した場合,5, 4, 3, 2, 1, 0 を表示せよ.なお,end はデフォルト引数として定義し,呼び出し時に値が指定されない場合は 0 が設定されるようにせよ.

実行・出力例1

countdown(10, 2)
10
9
8
7
6
5
4
3
2

実行・出力例2end に値を指定しない場合,end=0 として扱われる)

countdown(4)
4
3
2
1
0
# 解答例
def countdown(start, end=0):
    counter = start
    while counter >= end:
        print(counter)
        counter -= 1

countdown(7, 3)
7
6
5
4
3

演習3-4#

関数名:   get_max
引数:    *values
処理の内容: 可変長引数で渡された複数の引数の中で,最も大きな値を返す.
※ 例:get_max(1,9,5,3) とすると,値 9 が返されるようにする.

# 解答例
def get_max(*values):
    max = 0
    for v in values:
        if max < v:
            max = v

    return max

get_max(1, 9, 5, 3, 2, 10, 7)
10

演習3-5#

関数名:   apply_function
引数:    numbers(数値が格納されたリスト), func(関数)
処理の内容: 第1引数として与えられたリストの各要素に対して,第2引数として与えられた関数を適用し,結果を返す.
※第2引数に指定する関数としては,以下の inversion 関数を使用せよ.

# 受け取った数値の符号を反転させる
def inversion(value):
    return -1 * value

実行・出力例

numbers = [-2, -1, 0, 5, 8]

result = apply_function(numbers, inversion)
print(result)
[2, 1, 0, -5, -8]
# 解答例
def inversion(value):
    return -1 * value

def apply_function(numbers, func):
    applied_list = []
    for num in numbers:
        applied_list.append(func(num))
    return applied_list

numbers = [-2, -1, 0, 5, 8]
result = apply_function(numbers, inversion)
print(result)
[2, 1, 0, -5, -8]

演習3-6#

先ほどの演習3-5の課題について, inversion 関数を定義せずに,ラムダ式を用いて同様の処理を実現せよ.

# 解答例
def apply_function(numbers, func):
    applied_list = []
    for num in numbers:
        applied_list.append(func(num))
    return applied_list

numbers = [-2, -1, 0, 5, 8]
result = apply_function(numbers, lambda value: -1 * value)
print(result)
[2, 1, 0, -5, -8]