파이썬 기초 정리(함수)

function

1. 구조

def function_name(params):
  <Code>

2. 기본 예제

def add(a,b):
  return a+b

3. 다중 반환

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

(중요) 4. 언패킹 예제

  • 별 한개

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})

파이썬 인터프리터가 똑똑하게 앞에 선언한 인자들은 따로 출력해주고, 딕셔너리가 아닌 나머지 자료형은 튜플로, 딕셔너리는 딕셔너리로 묶어준다.

5. 중첩 함수 ( 클로저와 밀접한 관련 )

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이 실행될 때 메모리에 올라감

위와 관련된 개념! 클로저

클로저란 내부함수가 외부함수의 지역변수에 접근 할 수 있고, 외부함수는 외부함수의 지역변수를 사용하는 내부함수가 소멸될 때까지 소멸되지 않는 특성을 의미한다.

6. 람다

  • 메모리 절약, 가독성 향상, 코드 간결
  • 일반적인 함수는? 함수객체 생성 -> 리소스(메모리) 할당
  • 람다는? 즉시 실행 함수 -> Heap 영역에 저장(초기화) -> 메모리 초기화
  • 남발 시 가독성 감소
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  

변수에 저장해서 사용한다.

7. 람다 예제

지연성을 갖는 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 한 값을 받았다. 이때 전달하는 함수로 람다를 사용 하였다.


Written by@[HongDongUk]
공부한 것을 소소하게 적는 블로그.

GitHubFacebook