関数の基本構文
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]