では「関数」を初心者向けにやさしく噛み砕いて、たっぷりの例題と解説で進めます。実際に手を動かしやすいように、短いコードスニペット→説明→発展例、という流れにします。複雑な部分は図的に説明しますが、まずはコードを写して動かしてみるのが一番学べます。
関数って何?
関数は「名前のついた処理(機能)のまとまり」です。
一度作っておけば、何度でも呼び出して使えます。
イメージ:レシピ(関数)に材料(引数)を渡すと、料理(戻り値)ができる感じ。
関数の基本:呼び出し(組み込み関数の例)
print("Hello") # print は組み込み関数(画面に表示する処理)
abs(-5) # abs は絶対値を返す関数 → 結果は 5
round(3.1415, 2) # → 3.14(小数点第2位まで丸める)
Pythonprint,abs,roundは最初から使える(組み込み)関数。- 関数を使うときは
関数名(引数1, 引数2, ...)の形。
自分で関数を作る(定義の基本)
def greet():
print("こんにちは!")
Pythondefで関数を定義。greet()と呼び出すと中の処理が実行されます:
greet() # 出力: こんにちは!
Python引数と戻り値(基本)
引数:関数に渡す情報。
戻り値:関数が返す結果(returnで返す)。
例:
def add(a, b):
return a + b
result = add(3, 4) # result は 7
print(result) # 出力: 7
Pythona,bはパラメータ(定義側の名前)、3,4は引数(呼び出し側の値)。
位置引数 vs キーワード引数
def describe(name, age):
print(name, "さんは", age, "歳です")
describe("太郎", 20) # 位置引数
describe(age=30, name="花子") # キーワード引数(順序を気にしない)
Pythonデフォルト引数(省略可能な引数)
def power(x, n=2):
return x ** n
print(power(3)) # 3の2乗 → 9(n を省略した場合は 2)
print(power(3, 3)) # 3の3乗 → 27
Python- デフォルト引数は定義で値を与えておくことで、呼び出し時に省略可能にします。
可変長引数(*args と **kwargs)
複数の値を柔軟に受け取る方法。
*args:位置引数をタプルで受け取る
def sum_all(*args):
total = 0
for x in args:
total += x
return total
print(sum_all(1,2,3,4)) # → 10
Python**kwargs:キーワード引数を辞書で受け取る
def print_info(**kwargs):
for k, v in kwargs.items():
print(k, "=", v)
print_info(name="A", age=20)
# 出力:
# name = A
# age = 20
Python複数の値を返す(実は1つのタプル)
def divmod_pair(a, b):
return a // b, a % b
q, r = divmod_pair(7, 3)
print(q, r) # → 2 1
Pythonreturnに複数値を書くと、Pythonはタプルとして返します。受け取り側でアンパックできます。
関数の中の変数(スコープの基本)
- 関数内で定義した変数はローカル(その関数内でだけ有効)。
- 関数外の変数はグローバル。ただし、関数内でグローバル変数を変更するには
global宣言が必要(でも多用は推奨されない)。
例:
x = 10 # グローバル
def f():
x = 5 # ローカル(グローバル x を変更しない)
print("関数内x:", x)
f() # 関数内x: 5
print("外のx:", x) # 外のx: 10
Python無名関数(lambda)
簡単な一行関数をその場で作れる。可読性を保つ範囲で使う。
square = lambda x: x * x
print(square(5)) # → 25
Python高階関数(関数を引数に取ったり返したり)
map,filter,sortedなどの関数は、他の関数を引数に取ります。
例(map + lambda):
nums = [1,2,3,4]
doubled = list(map(lambda x: x*2, nums))
print(doubled) # → [2,4,6,8]
Pythonドキュメンテーション文字列(docstring)
関数が何をするかを書いておくと便利(自分や他人のため)。
def greet(name):
"""名前を受け取って挨拶を表示する関数"""
print("こんにちは、" + name + "さん!")
Pythonhelp(greet)で docstring を確認できます。
よくあるミス・注意点
returnを忘れるとNoneが返る(意図せずNoneを扱ってエラーになることがある)。
def bad():
print("こんにちは")
print(bad()) # None が出力される
Python- デフォルト引数に ミュータブル(listやdict) を使うと状態が共有されて問題になる。
def append_item(item, lst=[]): # NG パターン
lst.append(item)
return lst
print(append_item(1)) # [1]
print(append_item(2)) # [1, 2] ← 共有されてしまう
Python→ 安全な書き方:
def append_item(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
Python実践的な例題(ステップで理解)
例題1:偶数か判定する関数
def is_even(n):
return n % 2 == 0
print(is_even(4)) # True
print(is_even(5)) # False
Python例題2:リスト内の最大値を返す(組み込み max を使わないで)
def my_max(numbers):
if not numbers:
return None
biggest = numbers[0]
for v in numbers[1:]:
if v > biggest:
biggest = v
return biggest
print(my_max([3, 7, 2])) # → 7
Python例題3:ユーザーからの入力を受け取り、数の平均を返す関数
def average_of_list(nums):
if not nums:
return 0
return sum(nums) / len(nums)
print(average_of_list([10,20,30])) # → 20.0
Python例題4:可変長引数で最小・最大を返す
def min_and_max(*args):
if not args:
return None, None
return min(args), max(args)
mi, ma = min_and_max(3,5,1,9)
print(mi, ma) # → 1 9
Python練習問題
※下に解答も載せます。まずは自分で考えてから確認してください。
基礎
square(n):n の2乗を返す関数を作れ。is_palindrome(s):文字列 s が回文(前から読んでも後ろから読んでも同じ)か判定する関数を作れ。
中級
3. count_vowels(s):文字列 s の母音(a,e,i,o,u、大小区別しない)を数える関数。
4. filter_even(nums):リスト nums から偶数だけを取り出して新しいリストで返す関数。
上級
5. factorial(n):再帰を使って n! を計算する関数(ただし n >= 0)。
6. word_frequencies(text):文字列 text を単語に分割して、各単語の出現回数を辞書で返す関数(大文字小文字は区別しない)。
練習問題 解答(サンプル)
# 1
def square(n):
return n * n
# 2
def is_palindrome(s):
s2 = s.lower().replace(" ", "") # 大文字小文字、空白を無視する簡易版
return s2 == s2[::-1]
# 3
def count_vowels(s):
s = s.lower()
return sum(1 for ch in s if ch in "aeiou")
# 4
def filter_even(nums):
return [x for x in nums if x % 2 == 0]
# 5
def factorial(n):
if n == 0 or n == 1:
return 1
return n * factorial(n - 1)
# 6
def word_frequencies(text):
words = text.lower().split()
freq = {}
for w in words:
freq[w] = freq.get(w, 0) + 1
return freq
Python発展トピック(興味があれば)
- 型ヒント(type hints):
def add(a: int, b: int) -> int:のように書いて型を明示できる(実行はされないが可読性とツール補助に有利)。 - デコレータ:関数をラップして機能を付け加える高度なテクニック。
- モジュール化:関数をファイル(モジュール)にまとめて、別のファイルから読み込む(
import)方法。
まとめ(初心者が押さえるべきポイント)
- 関数 = 名前付きの処理のまとまり。
defで定義して関数名()で呼ぶ。 - 引数(渡す値)と戻り値(返ってくる値)を意識する。
- デフォルト引数、
*args/**kwargs、戻り値のアンパックなどは便利な道具。 - グローバル変数を不用意に変更しない。可読性を重視する。
- 小さく単機能の関数を作る(1つの関数は1つの目的)ことが保守性を上げる。
