function
def function_name(params):
<Code>
def add(a,b):
return a+b
def func_multi(x):
x1 = x * 10
x2 = x * 20
x3 = x * 30
return x1, x2, x3
파이썬은 다중반환을 쉽게 가능하다! 다중 반환을 하였으니 받을 때도 다중으로 받자.
x, y, z = func_multi(10)
def func_multi(x):
x1 = x * 10
x2 = x * 20
x3 = x * 30
return (x1, x2, x3) # 패킹
# 튜플로 리턴 [x1, x2, x3] , 리스트, 딕셔너리도 가능해
result = func_multi(10)
print(type(result), result) # <class 'tuple'> (100, 200, 300)
x, y, z = func_multi(10) # 언팩킹
print(type(x), x) # <class 'int'> 100
def un_func(*args):
for i,v in enumerate(args):
print(i,v) # index와 value
print(un_func('a','b','c'))
# print 결과
(0, 'a')
(1, 'b')
(2, 'c')
*args 는 여러개의 원소를 튜플로 받는다는 뜻이다. 예를들어
un_func(1,2,3,4,5)
라면 args 는 (1,2,3,4,5) 이고
un_func([1,2,3])
라면 args는 ([1,2,3],) 이다.
enumerate 함수는 순서가 있는 자료형(리스트, 튜플, 문자열) 을 받아 이터레이터를 리턴하고 enuerate 이터레이터를 순회 할 때 i 값은 인덱스, v는 value이다.
def un_func_dict(**args):
for v in args:
print(v, args[v])
un_func_dict(name='donguk', age=999)
# ('name', 'donguk')
# ('age', 999)
함수의 인자로 **args와 같이 별 두개를 받는다면 인자를 받아서 딕셔너리 형태로 팩킹 하겠다는 의미이다.
un_func_dict(name='dong',age=1)
와 같이 함수를 실행 한다면, args의 값은 {‘name’ : ‘dong, ‘age’: 1 } 이다
un_func_dic([1,2,3]) # Type Error
위와 같이 key, value 형태의 인자로 값을 전달하지 않는다면 error가 뜬다.
def total_start(arg1, arg2, *args, **kwargs):
print(arg1, arg2, args, kwargs)
print(10, 20, [10, 30 , 50 , 60, 10], 'kim', name='dong', age=25)
#(10, 20, ([10, 30,50, 60, 10], 'kim'), {'name':'dong', 'age' : 25})
파이썬 인터프리터가 똑똑하게 앞에 선언한 인자들은 따로 출력해주고, 딕셔너리가 아닌 나머지 자료형은 튜플로, 딕셔너리는 딕셔너리로 묶어준다.
def nested_fun(num):
def fun_in_func(num):
print(num)
print('in func')
func_in_func(num+100)
print(nested_func(100)) # in func 200
print(func_in_func(100)) # error => nested_func이 실행될 때 메모리에 올라감
위와 관련된 개념! 클로저
클로저란 내부함수가 외부함수의 지역변수에 접근 할 수 있고, 외부함수는 외부함수의 지역변수를 사용하는 내부함수가 소멸될 때까지 소멸되지 않는 특성을 의미한다.
def multi_fun(x,y):
return x*y
위 함수를 람다식으로 표현 한다면,
lambda x,y:x*y
이렇게 표현 가능하다. 실행 할 떄에는
const lambda_multi_func = lambda x,y:x*y
print(lambda_multi_func(5,5)) # 25
변수에 저장해서 사용한다.
지연성을 갖는 map 함수를 lambda 함수를 이용해서 구현 해보자.
def map(f, iter):
for a in iter:
yield f(a)
함수 map은 함수와 이터러블을 받아서 이터러블을 순회하며 원소에 파라미터로 받은 함수를 적용시킨 값을 yield 한다.
print(next(map(lambda a:a+10, [1,3,5]))) # 11
next() 함수로 제너레이터 내부 코드를 동작시켜 yield 한 값을 받았다. 이때 전달하는 함수로 람다를 사용 하였다.