Python | 関数

Python
スポンサーリンク

では「関数」を初心者向けにやさしく噛み砕いて、たっぷりの例題と解説で進めます。実際に手を動かしやすいように、短いコードスニペット→説明→発展例、という流れにします。複雑な部分は図的に説明しますが、まずはコードを写して動かしてみるのが一番学べます。


関数って何?

関数は「名前のついた処理(機能)のまとまり」です。
一度作っておけば、何度でも呼び出して使えます。
イメージ:レシピ(関数)に材料(引数)を渡すと、料理(戻り値)ができる感じ。


関数の基本:呼び出し(組み込み関数の例)

print("Hello")     # print は組み込み関数(画面に表示する処理)
abs(-5)            # abs は絶対値を返す関数 → 結果は 5
round(3.1415, 2)   # → 3.14(小数点第2位まで丸める)
Python
  • print, abs, round は最初から使える(組み込み)関数。
  • 関数を使うときは 関数名(引数1, 引数2, ...) の形。

自分で関数を作る(定義の基本)

def greet():
    print("こんにちは!")
Python
  • def で関数を定義。
  • greet() と呼び出すと中の処理が実行されます:
greet()  # 出力: こんにちは!
Python

引数と戻り値(基本)

引数:関数に渡す情報。
戻り値:関数が返す結果(returnで返す)。

例:

def add(a, b):
    return a + b

result = add(3, 4)  # result は 7
print(result)       # 出力: 7
Python
  • a, 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
Python
  • return に複数値を書くと、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 + "さん!")
Python
  • help(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

練習問題

※下に解答も載せます。まずは自分で考えてから確認してください。

基礎

  1. square(n):n の2乗を返す関数を作れ。
  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)方法。

まとめ(初心者が押さえるべきポイント)

  1. 関数 = 名前付きの処理のまとまり。def で定義して 関数名() で呼ぶ。
  2. 引数(渡す値)と戻り値(返ってくる値)を意識する。
  3. デフォルト引数、*args/**kwargs、戻り値のアンパックなどは便利な道具。
  4. グローバル変数を不用意に変更しない。可読性を重視する。
  5. 小さく単機能の関数を作る(1つの関数は1つの目的)ことが保守性を上げる。
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました