본문 바로가기

프로그래밍/Python

[요약] 파이썬(Python) - 함수와 람다 사용법

[요약] 파이썬(Python) - 함수와 람다 사용법


# 함수(function) 정의 및 람다(Lambda) 사용법

# 함수 정의 방법

# def 함수명(parameters):
#   code

# 함수 선언 위치가 중요함(반드시 사용되기 이전에 선언되어야 함)
# 예1)

def hello(world):
    print("hello", world)

hello("Python!")   # hello Python
hello(7777)        # hello 7777


# 예2)
def hello_return(world):
    val = "Hello " + str(world)

    return val


print(hello_return('Python')) # Hello Python

# 예3( 다중리턴 함수 )

def func_mul(x):
    y1 = x*100
    y2 = x*200
    y3 = x*300

    return y1, y2, y3

val1, val2, val3 = func_mul(100)

print(val1, val2, val3) # 10000 20000 30000


# 예4(데이터 타입 변환 - 리스트)
def func_mul2(x):
    y1 = x*100
    y2 = x*200
    y3 = x*300

    return [y1, y2, y3]

lt = func_mul2(100)

print(lt, type(lt))     # [10000, 20000, 30000] <class 'list'>

# 예5(데이터 타입 변환 - 튜플)
def func_mul3(x):
    y1 = x*100
    y2 = x*200
    y3 = x*300

    return (y1, y2, y3)

tp = func_mul3(100)

print(tp, type(tp))     # (10000, 20000, 30000) <class 'tuple'>
print(tp)               # (10000, 20000, 30000)


# 예6)
# *args, **kwargs

def args_func(*args):   # 튜플 형태로 파라미터를 받아들인다.    
    # print(args)
    print(type(args))   # <class 'tuple'>
    for i,v in enumerate(args):
        print(i, v)

args_func('Lee')                # ('Lee',)
args_func('Lee', 'Kim')         # ('Lee', 'Kim')
args_func('Lee', 'Kim', 'Lee')  # ('Lee', 'Kim', 'Lee')

# kwargs = 딕셔너리(Dictionary) 타입 파라미터
def kwargs_func(**kwargs):
    print(type(kwargs))         # <class 'dict'>
    for k,v in kwargs.items():
        print(k, v, end=",")

kwargs_func(name1='Lee')     # name1 Lee,
print("")
kwargs_func(name1='Lee', name2='Park', name3='Kim') # name1 Lee,name2 Park,name3 Kim,
print("")

# 전체 혼함 테스트

def example_mul(arg1, arg2, *args, **kwargs):
    print(arg1, arg2, args, kwargs)

example_mul(10, 20)         # 10 20 () {}
example_mul(10, 20, 'Lee', 'Park', ar1=24, ar2=35) # 10 20 ('Lee', 'Park') {'ar1': 24, 'ar2': 35}


# 중첩함수(클로저)

def nested_func(num):
    def func_in_func(num):
        print('>>>', num)
    
    print('in func')
    func_in_func(num + 10000)


nested_func(10000)  # >>> 20000


# 예7(힌트)

# 예4(데이터 타입 변환 - 리스트)
# 파라미터는 숫자형으로 넘겨야 하고 리턴값은 리스트이어야 한다는 힌트 지정
def func_mul4(x : int) -> list:
    y1 = x*100
    y2 = x*200
    y3 = x*300

    return [y1, y2, y3]     # [500, 1000, 1500]

print(func_mul4(5))



# 람다식 예제
# 람다식 : 메모리 절약, 가독성 향상, 코드가 간결함
# 함수는 객체 생성 -> 리소스(메모리) 할당
# 람다는 즉시 실행(Heap 초기화) --> 메모리 초기화

# 일반적 함수 -> 변수 할당
def func_mul10(num : int) -> int:
    return num * 10

var_func = func_mul10
print(var_func)             # <function func_mul10 at 0x00000162a3ed3708>
print(type(var_func))       # <class 'function'>
print(var_func(10))         # 100

# 람다정의
lamda_mul_10 = lambda num: num * 10

print('>>>', lamda_mul_10(10))      # >>> 100


# 함수 선언시 파라미터에 함수 또는 람다를 넘길 수 있다.
def func_final(x, y, func):
    print(x * y * func(10))

# 함수 파라미터에 람다를 넘겼다.
func_final(10, 10, lamda_mul_10)    # 10000
# 함수 파라미터에 람다를 직접 정의했다
func_final(10, 10, lambda x: x*1000)  # 1000000