では、先ほどの「関数の基本」をもとに、
レベル別(基礎 → 中級 → 上級)で練習問題+解答+詳しい解説 をセットでまとめます。
初心者でも無理なく「なぜそう書くのか」まで理解できるように、
1問ずつ 考え方 → コード → 実行結果 → 解説 の順で進めます。
基礎レベル(関数の書き方に慣れる)
Q1:2乗を計算する関数
問題:
数値 n を受け取って、その2乗(n × n)を返す関数 square(n) を作りましょう。
解答:
def square(n):
return n * n
print(square(3)) # → 9
Python解説:
defで関数を定義。returnは「結果を返す」命令。print()のように関数を呼び出して結果を確認できます。
💡 ポイント:return の代わりに print() だけだと、呼び出し側で値を使えません。
Q2:偶数かどうかを判定する関数
問題:
数 n が偶数なら True、奇数なら False を返す関数 is_even(n) を作りましょう。
解答:
def is_even(n):
return n % 2 == 0
print(is_even(4)) # → True
print(is_even(5)) # → False
Python解説:
%は余りを求める演算子。
偶数ならn % 2 == 0がTrueになります。- 比較式の結果はそのまま
True/Falseとして返せます。
Q3:文字列を3回表示する関数
問題:
文字列を受け取って、3回繰り返して出力する関数 repeat3(text) を作ってください。
解答:
def repeat3(text):
print(text * 3)
repeat3("Hi!") # → Hi!Hi!Hi!
Python解説:
- 文字列の繰り返しは
文字列 * 回数でできます。 returnではなくprint()で「表示だけ」することも可能です。
中級レベル(条件分岐・リスト処理など)
Q4:平均値を求める関数
問題:
リスト nums を受け取り、平均値を返す関数 average(nums) を作りましょう。
ただし、空リストなら 0 を返してください。
解答:
def average(nums):
if len(nums) == 0:
return 0
return sum(nums) / len(nums)
print(average([10, 20, 30])) # → 20.0
print(average([])) # → 0
Python解説:
len()で要素数を調べます。sum()で合計を出せます。- 空リストを渡すと
ZeroDivisionErrorになるため、最初にチェックするのが安全です。
Q5:偶数だけを抽出する関数
問題:
リストから偶数だけを取り出して新しいリストにして返す関数 filter_even(nums) を作りましょう。
解答:
def filter_even(nums):
result = []
for n in nums:
if n % 2 == 0:
result.append(n)
return result
print(filter_even([1,2,3,4,5,6])) # → [2, 4, 6]
Python解説:
- 空のリストを作って
.append()で要素を追加。 - 条件に合うものだけを選びます。
- リスト内包表記でも書けます:
return [n for n in nums if n % 2 == 0]
Q6:指定回数だけ文字列を繰り返す関数
問題:repeat(text, times) を作成し、文字列を times 回繰り返して返すようにしてください。
解答:
def repeat(text, times=1):
return text * times
print(repeat("Hi", 3)) # → HiHiHi
print(repeat("Hi")) # → Hi
Python解説:
- デフォルト引数
times=1を設定すれば、省略しても1回になる。 - 関数をより柔軟にできます。
上級レベル(再帰・辞書・文字列操作)
Q7:階乗(factorial)を計算する関数
問題:n!(階乗)を返す関数 factorial(n) を作ってください。
例:factorial(5) → 120
解答:
def factorial(n):
if n == 0 or n == 1:
return 1
return n * factorial(n - 1)
print(factorial(5)) # → 120
Python解説:
- 再帰(関数が自分自身を呼ぶ)で書く。
- 終了条件(ベースケース)を忘れると無限ループに陥ります。
- 例:
5 * factorial(4)→5 * 4 * 3 * 2 * 1
Q8:回文判定関数
問題:
文字列が前から読んでも後ろから読んでも同じなら True を返す is_palindrome(s) を作りましょう。
例:「level」「たけやぶやけた」など。
解答:
def is_palindrome(s):
s = s.lower().replace(" ", "")
return s == s[::-1]
print(is_palindrome("Level")) # → True
print(is_palindrome("Hello")) # → False
Python解説:
[::-1]は文字列を逆順にするスライス構文。lower()で大文字・小文字を無視。replace(" ", "")で空白を削除。
Q9:単語の出現回数を数える関数
問題:
文字列を受け取り、各単語の出現回数を辞書で返す word_count(text) を作ってください。
解答:
def word_count(text):
words = text.lower().split()
freq = {}
for w in words:
freq[w] = freq.get(w, 0) + 1
return freq
print(word_count("Apple banana apple orange Banana"))
# → {'apple': 2, 'banana': 2, 'orange': 1}
Python解説:
split()で空白区切りに分割。dict.get(key, 初期値)を使うと便利。- 同じ単語が出るたびにカウントを増やしています。
Q10:最大値と最小値を返す関数
問題:
複数の数を受け取り、最小値と最大値の両方を返す関数 minmax(*args) を作りましょう。
解答:
def minmax(*args):
if not args:
return None, None
return min(args), max(args)
mi, ma = minmax(3, 7, 1, 9)
print(mi, ma) # → 1 9
Python解説:
*argsは可変長引数(複数の引数をまとめて受け取る)。- 結果をタプルで返し、呼び出し側でアンパックできます。
まとめ表
| レベル | 学べるテーマ | 例題 |
|---|---|---|
| 基礎 | 関数定義、引数、return | Q1〜Q3 |
| 中級 | 条件分岐、リスト操作、デフォルト引数 | Q4〜Q6 |
| 上級 | 再帰、文字列操作、辞書、可変長引数 | Q7〜Q10 |
さらにステップアップしたい人へ
- チャレンジ問題:
「上級Q7〜Q10」をもとに、自動採点スクリプトを作る(assertでテスト)。 - 学習テーマ例:
- 関数の中で関数を定義(ネスト関数)
- 関数を引数に取る(高階関数)
- デコレーターでログ出力を追加
