[python] 함수 프로그래밍 - 클로저, 람다, 데코레이터

혜진·2024년 8월 8일

Python

목록 보기
8/16
post-thumbnail

함수의 매개변수 전달 방법

Python에서는 함수에 다양한 방식으로 매개변수를 전달할 수 있다.

📑 매개변수 전달 예제

print('\ndict 타입의 자료형')

def Func3(w, h, **other):
    print('몸무게 {}, 키 {}'.format(w, h))
    print(other)  # 딕셔너리 형태로 출력

# 키워드 인수로 매개변수 전달
Func3(65, 175, irum='홍길동', nai=23, sex='남', addr='대전')
Func3(75, 185, irum='김길수')

# 출력:
# 몸무게 65, 키 175
# {'irum': '홍길동', 'nai': 23, 'sex': '남', 'addr': '대전'}
# 몸무게 75, 키 185
# {'irum': '김길수'}

가변 인수, 키워드 인수

가변 인수와 키워드 인수를 사용하여 함수에 여러 인수를 전달할 수 있다.

📑 가변 인수, 키워드 인수 예제

def Func4(a, b, *v1, **v2):
    print(a)
    print(b)
    print(v1)  # 튜플 형태로 출력
    print(v2)  # 딕셔너리 형태로 출력

Func4(1, 2)
Func4(1, 2, 3, 4, 5)
Func4(1, 2, 3, 4, 5, m=6, n=7)

# 출력:
# 1
# 2
# ()
# {}
# 1
# 2
# (3, 4, 5)
# {'m': 6, 'n': 7}

디폴트 매개변수

함수의 매개변수에 기본값을 설정할 수 있다.

📑 디폴트 매개변수 예제

def ShowGugudan(start, end=5):
    for dan in range(start, end + 1):
        print(str(dan) + '단 출력')
        for i in range(1, 10):
            print(f"{dan}*{i}={dan*i}", end=' ')
        print()

ShowGugudan(2, 3)  # 2단과 3단 출력
ShowGugudan(3)  # 3단부터 5단까지 출력

클로저와 변수의 생존 범위

클로저

내부 함수가 외부 함수의 변수를 참조할 수 있는 함수

📑 클로저 함수 예제

def outer():
    count = 0
    def inner():
        nonlocal count
        count += 1
        return count
    return inner

add1 = outer()
print(add1())  # 출력: 1
print(add1())  # 출력: 2

add2 = outer()
print(add2())  # 출력: 1

변수의 생존 범위

Python에서는 전역 변수와 지역 변수를 사용할 수 있다.

📑 변수의 생존 범위 예제

x = 1  # 전역 변수

def func():
    x = 2  # 지역 변수
    print(x)  # 출력: 2

func()
print(x)  # 전역 변수 출력: 1

익명 함수(람다 함수)

이름이 없는 한 줄짜리 함수로, 간단한 연산을 한 줄로 표현할 수 있다.

📑 익명 함수(람다 함수) 예제

# 람다 함수 정의와 사용
print((lambda x, y: x + y)(3, 4))  # 출력: 7

# 가변 인수와 람다 함수
kbs = lambda a, su=10: a + su
print(kbs(5))  # 출력: 15
print(kbs(5, 6))  # 출력: 11

sbs = lambda a, *tu, **di: print(a, tu, di)
sbs(1, 2, 3, m=4, n=5)  # 출력: 1 (2, 3) {'m': 4, 'n': 5}

함수형 프로그래밍

filter 함수

filter 함수는 주어진 조건에 맞는 요소만 선택한다.

📑 filter 함수 예제

print(list(filter(lambda a: a < 5, range(10))))  # 출력: [0, 1, 2, 3, 4]
print(list(filter(lambda a: a % 2, range(10))))  # 출력: [1, 3, 5, 7, 9]

재귀 함수

자기 자신을 호출하는 함수

📑 재귀 함수 예제

def fsum(n):
    if n == 1: return 1
    return n + fsum(n - 1)

print(fsum(10))  # 출력: 55

def CountDown(n):
    if n == 0:
        print('완료')
    else:
        print(n, end=' ')
        CountDown(n - 1)

CountDown(5)  # 출력: 5 4 3 2 1 완료

데코레이터

데코레이터는 다른 함수를 감싸는 함수

📑 데코레이터 함수 예제

def Deco1(f):
    return lambda: f() + 5

def Deco2(f):
    def Print_f():
        print(f())
    return Print_f

def Func():
    return 3

f = Deco2(Deco1(Func))
f()  # 출력: 8

모듈

모듈은 코드의 재사용성을 높이고, 코드를 깔끔하게 관리할 수 있다.

📑 모듈 예제

import sys
print('현재 작업 영역의 경로 확인:', sys.path)

import math
print(math.pi)  # 출력: 3.141592653589793

import os
print(os.getcwd())  # 현재 작업 경로 확인
print(os.listdir('/'))  # 루트 경로의 내용 출력

import random
print(random.random())  # 0과 1 사이의 난수 발생
print(random.randrange(1, 10))  # 1과 10 사이의 난수 발생

0개의 댓글