Python関数の定義と引数の扱い

関数の基本構文

Pythonでは、defキーワードを使って関数を定義します。関数はコードの再利用性を高め、ロジックをモジュール化するのに役立ちます。

def 関数名(パラメータリスト):
    # 関数本体
    return 戻り値  # 省略可能(その場合 None を返す)

例として、学生情報を出力する関数を定義できます:

def show_student(name, age, gender):
    print(f"氏名: {name}, 年齢: {age}, 性別: {gender}")

# 位置引数で呼び出し
show_student("田中", "22", "male")

# キーワード引数で呼び出し(順序自由)
show_student(age="22", name="田中", gender="male")

引数の種類

  • 必須引数:呼び出し時に必ず指定が必要。
  • デフォルト引数:値が省略された場合に使われる初期値。必須引数の後に記述する必要がある。
  • *args:可変長の位置引数をタプルとして受け取る。
  • **kwargs:可変長のキーワード引数を辞書として受け取る。
def flexible_func(required, default_val=10, *args, **kwargs):
    print("必須:", required)
    print("デフォルト:", default_val)
    print("追加位置引数:", args)
    print("追加キーワード引数:", kwargs)

flexible_func("必須値", 5, "追加1", "追加2", key1="値1", key2="値2")

スコープとグローバル変数

Pythonの変数スコープはLEGBルール(Local → Enclosing → Global → Built-in)に従います。globalキーワードを使うと、関数内でグローバル変数を変更できます。

x = 100

def increment():
    global x
    x += 1

increment()
print(x)  # 101

引数の受け渡し:値渡しか参照渡しか?

Pythonでは「オブジェクト参照の値渡し」が行われます。つまり、不可変オブジェクト(int, str, tupleなど)は関数内で変更しても元の変数に影響しませんが、可変オブジェクト(list, dictなど)は元のオブジェクトが変更される可能性があります。

# 不可変オブジェクトの例
def modify_int(val):
    val += 10

num = 5
modify_int(num)
print(num)  # 5(変化なし)

# 可変オブジェクトの例
def modify_list(lst):
    lst.append(99)

items = [1, 2, 3]
modify_list(items)
print(items)  # [1, 2, 3, 99]

実用的な関数例

1. 複数の数値から最大値を求める関数

def find_max(*numbers):
    if not numbers:
        return None
    return max(numbers)

print(find_max(3, 7, 2, 9, 1))  # 9

2. パスワード強度チェック

import string

def check_password_strength(pwd):
    if len(pwd) < 8 or len(pwd) > 18:
        print("❌ パスワード長が8~18文字の範囲外です。")
        return

    has_digit = any(c in string.digits for c in pwd)
    has_lower = any(c in string.ascii_lowercase for c in pwd)
    has_upper = any(c in string.ascii_uppercase for c in pwd)
    has_punct = any(c in string.punctuation for c in pwd)

    types = sum([has_digit, has_lower or has_upper, has_punct])

    if types == 1:
        print("⚠️ 強度: 弱(1種類の文字種のみ使用)")
    elif types == 2:
        print("✅ 強度: 中(2種類の文字種使用)")
    else:
        print("🔒 強度: 強(3種類以上使用)")

# 使用例
check_password_strength("Pass123!")  # 🔒 強度: 強

3. ランダムな認証コード生成

import random
import string

def generate_code(length=6):
    chars = string.ascii_letters + string.digits
    return ''.join(random.choices(chars, k=length))

print(generate_code())      # 例: aB3xK9
print(generate_code(8))     # 例: mN8pQ2rL

高階関数とラムダ式

関数を引数として受け取る高階関数もよく使われます。例えばmap()filter()などがあります。

nums = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, nums))
print(squared)  # [1, 4, 9, 16]

タグ: Python 関数 引数 スコープ 高階関数

6月29日 18:24 投稿