함수 정의 방법
함수는 다음과 같이 쓸 수 있다.
def first_func(w):
print("Hello, ", w)
함수 호출 방법
위에 정의한 함수를 호출하고 싶을때는 어떻게 할까?
먼저, fist_func에는 파라미터(매개변수) w가 필요하다.
만약 파라미터가 없이 호출을 한다면 타입 에러가 난다. TypeError: first_func() missing 1 required positional argument: 'w'
아래 예제에서는 word를 미리 변수로 할당해주고 매개변수로 사용해주었다.
# 예제1
def first_func(w):
print("Hello, ", w)
# Hello, Goodboy
word = "Goodboy"
# 함수 호출
first_func(word)
# 예제2
def return_function(w):
value = "Hello, " + str(w)
return value
x = return_function('Goodboy2')
print(x)
# Hello, Goodboy2
또 !
first_func() <- 괄호를 꼭 넣어줘야한다.
괄호가 없는 first_func은 변수일 뿐이다.
실제 출력 시 id값을 반환하는 것을 확인 할 수 있다.
print(first_func)
>>> <function first_func at 0x000001C0DD0F3F40>
다중 반환
파이썬의 함수는 다중 반환이 가능하다,
def func_mul(x1):
y1 = x1 * 10
y2 = x1 * 20
y3 = x1 * 30
return y1, y2, y2
x, y, z = func_mul(10)
위 예제와 같이 y1, y2, y3을 반환한다.
이렇게 보면 3개의 다른 값으로 보이지만 사실은 하나의 튜플이다.
즉, function이라는 함수는 하나의 튜플을 리턴한 것이다.
print(func_mul(10))
print(type(func_mul(10)))
>>> (100, 200, 200)
>>> <class 'tuple'>
그럼 반환값을 튜플이 아닌 리스트나 딕셔너리 형태로도 가능할까?
" 가능하다! "
반환값을 [ ] 로 묶어주면 리스트가 된다.
def func_mul3(x1):
y1 = x1 * 10
y2 = x1 * 20
y3 = x1 * 30
return [y1, y2, y2]
q = func_mul3(20)
print(type(q), q)
>>> <class 'list'> [200, 400, 400]
딕셔너리 형태도 아래와 같이 반환할 수 있다.
def func_mul4(x1):
y1 = x1 * 10
y2 = x1 * 20
y3 = x1 * 30
return {'y1': y1, 'y2': y2, 'y3': y3}
q = func_mul4(20)
print(type(q), q)
>>> <class 'dict'> {'y1': 200, 'y2': 400, 'y3': 600}
함수의 매개변수 *args & **kwargs
*args :
매개변수명은 바꿔써도 상관없다. (*something, *asedf 등 자유롭게 사용할 수 있다)
*args 는 *arguments의 줄임말이다.
여러개의 인자(파라미터)를 받을 때 쓴다. (*args는 튜플이 형태이다)
# *args (언팩킹)
def args_func(*args): # 매개변수 명은 자유
for i, v in enumerate(args):
print('Result : {}'.format(i), v)
print('--------')
args_func('Lee')
args_func('Lee', 'Park')
args_func('Lee', 'Park', 'Kim')
>>> Result : 0 Lee
>>> --------
>>> Result : 0 Lee
>>> Result : 1 Park
>>> --------
>>> Result : 0 Lee
>>> Result : 1 Park
>>> Result : 2 Kim
>>> --------
**kwargs :
keyword arguments의 줄임말로 키워드를 제공한다.
딕셔너리의 형태로 함수 내부에 전달된다.
def kwargs_func(**kwargs):
for v in kwargs.keys():
print('Result : {}'.format(v), kwargs[v])
print('---------')
kwargs_func(name1='Lee')
kwargs_func(name1='Lee', name2='Kim')
kwargs_func(name1='Lee', name2='Kim', name3='cho')
>>> Result : name1 Lee
>>> ---------
>>> Result : name1 Lee
>>> Result : name2 Kim
>>> ---------
>>> Result : name1 Lee
>>> Result : name2 Kim
>>> Result : name3 cho
>>> ---------
혼합 사용도 가능하다.
def example(args_1, args2, *args, **kwargs):
print(args_1, args2, args, kwargs)
example(10, 20, 'Lee', 'Kim', 'Park', 'Cho', age1=10, age2=20, age3=30)
print('---------')
>>> 10 20 ('Lee', 'Kim', 'Park', 'Cho') {'age1': 10, 'age2': 20, 'age3': 30}
>>> ---------
중첩 합수
함수 안에 또 다른 함수가 있는 형태
def nested_func(num):
def func_in_func(num):
print(num)
print("In Func")
func_in_func(num + 100)
nested_func(100)
>>> In Func
>>> 200
# 함수 호출 불가 (외부에서 내부 함수 호출 불가)
# func_in_func()
람다식
람다는 메모리 절약, 가독성 향상, 코드의 간결화와 같은 장점이 있다.
람다식을 남용하면 오히려 코드를 이해하기 어려울 수 있다. 따라서 람다식을 사용할 경우 주석을 다는 것이 좋다.
일반적으로 우리가 사용하는 함수는 객체를 생성하고 -> 리소스(메모리) 할당을 하는 반면
람다식은 즉시 함수를 실행(Heap초기화) -> 메모리 초기화를 히기 때문에 불필요한 루프문을 삭제 할 수 있다.
람다에 대해 부정적인 의견을 피력하는 사람들도 많아 조금 더 깊은 학습이 필요할 것 같다.
그럼 람다는 어떻게 사용할까?
아래 함수는 모두 두 파라미터를 받아 값을 곱하여 반환하는 함수이다.
람다는 아래와 같이 lamda (인자):(반환 값) 의 형태이다.
def mul_func(a, b):
return a * b
lambda a, b: a * b
# 일반 함수 -> 변수 할당
def mul_func(a, b):
return a * b
mul_fun_var = mul_func
print(mul_fun_var(20, 50))
>>> 1000
# 람다 함수 -> 할당
lambda_mul_func = lambda a, b: a * b
print(lambda_mul_func(50, 50))
>>> 2500
def fun_final(a, b, func):
print(a * b * func(100, 100))
fun_final(10, 20, lambda_mul_func)
>>> 2000000
해당 글은 인프런의 [프로그래밍 시작하기 : 파이썬 입문-Inflearn Original ] 강의를 듣고 정리한 개인적인 학습 노트 입니다.