第9回:関数(解答)#

演習1:関数の基礎#

演習1-1#

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

def multiply_numbers():
    print(x * y)

2つの引数 x, y を設定し,それらの積を出力するように修正せよ.

また,実際に x に 5,y に 3 を設定して関数を呼び出し,計算結果が正しく表示されることを確認せよ(15 が表示されるはず).

# 解答例
def multiply_numbers(x, y):
    print(x * y)

multiply_numbers(5, 3)  # 15 が出力される
15

演習1-2#

先ほどの関数 multiply_numbers を修正し,計算結果を戻り値として返すように変更せよ.

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

# 解答例
def multiply_numbers(x, y):
    return x * y

result = multiply_numbers(4, 7)
print(result)  # 28 が出力される
28

演習1-3#

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

また,実際に x に 2,y に 3,z に 4 を設定して関数を実行し,返ってきた戻り値を変数 result に格納せよ. この result の値を print 文で表示し,正しく計算できていることを確認せよ(10 が表示されるはず).

# 解答例
def multiply_numbers(x, y, z):
    return (x * y) + z

result = multiply_numbers(2, 3, 4)
print(result)  # 10 が出力される
10

演習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#

関数名:   get_circle_area
引数:    radius
処理の内容: 引数で渡された半径(radius)の値を持つ円の面積を返す.円周率は 3.14 とする.

# 解答例
def get_circle_area(radius):
    return 3.14 * radius * radius

result = get_circle_area(5)  
print(result) 
78.5

演習2-2#

関数名:   get_average
引数:    a, b, c
処理の内容: 3つの数値の平均値を返す

# 解答例
def get_average(a, b, c):
    return (a + b + c) / 3

result = get_average(10, 20, 30)
print(result)  # 20.0 が出力される
20.0

演習2-3#

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

# 解答例
def get_smaller_number(a, b):
    if a < b:
        return a
    return b

result = get_smaller_number(7, 3)
print(result)  # 3 が出力される
3

演習2-4#

関数名:   is_positive
引数:    number
処理の内容: 引数で渡された number が正の数なら True,0または負の数なら False を返す.

# 解答例
def is_positive(number):
    return number > 0

print(is_positive(5))    # True が出力される
print(is_positive(-2))   # False が出力される
print(is_positive(0))    # False が出力される
True
False
False

演習2-5#

関数名:   count_characters
引数:    string
処理の内容: 引数で渡された文字列 string に含まれる文字数を返す

# 解答例
def count_characters(string):
    return len(string)

result = count_characters("Python")
print(result)  # 6 が出力される
6

演習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#

関数名:   count_vowels_consonants
引数:    string(英単語)
処理の内容: 引数で渡された英単語に含まれる母音(a, e, i, o, u)の数と子音の数をカウントし,それぞれの数を返す.
※ 例:count_vowels_consonants("hello") とすると,タプル 2, 3 を返す.

# 解答例
def count_vowels_consonants(string):
    vowels = 'aeiou'
    vowel_count = 0
    consonant_count = 0
    
    for char in string.lower():
        if char in vowels:
            vowel_count += 1
        elif char.isalpha():  # アルファベットであることを確認
            consonant_count += 1
            
    return vowel_count, consonant_count

result = count_vowels_consonants("hello")
print(result)  # (2, 3) が出力される
(2, 3)

演習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#

関数名:   calculate_sum
引数:    *numbers
処理の内容: 可変長引数で渡された複数の数値の合計を返す.
※ 例:calculate_sum(1, 2, 3, 4) とすると,値 10 が返される.

# 解答例
def calculate_sum(*numbers):
    return sum(numbers)

result = calculate_sum(1, 2, 3, 4)
print(result)  # 10 が出力される
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]