파이썬 기초 핵심#10 함수 및 람다

정은경·2020년 3월 5일
1

함수 정의 및 람다(lambda) 사용

  • 함수 선언
  • 함수 다양한 사용
  • 다양한 반환 값
  • args, kwargs
*args, **kwargs
  • 람다함수

함수를 사용하는 이유?

  • 중복/반복되는 프로그래밍을 피하기 위해서
  • 함수 하나에 하나의 기능을 만들어야 그 함수의 재사용성이 높아짐

1. 함수의 정의 방법

def 함수명(parameter):
    로직코드

함수명(파라미터)
# 함수실행은 함수를 먼저 정의하고 나서 호출할 것!
>>> ## 리턴이 없는 함수
>>> def hello(world):
...     print("Hello ", world)
... 
>>> hello("Python!")
Hello  Python!
>>> 
>>> ## 리턴이 하나인 함수
>>> def hello_return(world):
...     val = "Hello" + str(world)
...     return val
... 
>>> hello_return("Python!")
'HelloPython!'
>>> 
>>> ## 다중리턴
>>> def func_mul(x):
...     y1 = x * 1
...     y2 = x * 2
...     y3 = x * 3
...     return y1, y2, y3
... 
>>> 
>>> val1, val2, val3 = func_mul(10)
>>> print(val1, val2, val3)
10 20 30
>>> 
>>> ## 다중리턴인데 리스트로 리턴하기
>>> def func_mul2(x):
...     y1 = x * 1
...     y2 = x * 2
...     y3 = x * 3
...     return [y1,y2,y3]
... 
>>> lt = func_mul2(100)
>>> print(lt)
[100, 200, 300]
>>> 

2. 가변인자 (args, kwargs)

args => 별표하나는! 매개변수를 튜플로 받음!

*args
>>> def args_func(*args):
...     print(args)
... 
>>> 
>>> args_func('a','b')
('a', 'b')
>>> args_func('a','b','c')
('a', 'b', 'c')
>>> 
>>> def args_func2(*args):
...     print(type(args))
... 
>>> args_func2('a')
<class 'tuple'>
>>> args_func2('a','b')
<class 'tuple'>
>>> 
>>> def args_func3(*args):
...     for i,v in enumerate(args):
...         print(i,v)
... 
>>> args_func3('a','b','c')
0 a
1 b
2 c
>>> 

kwargs => 별표 두개는! 매개변수를 딕셔너리로 받음

**kwargs
>>> def kwargs_func(**kwargs):
...     print(kwargs)
... 
>>> kwargs_func(name1='kim',name2='park')
{'name1': 'kim', 'name2': 'park'}
>>> 
>>> 
>>> def kwargs_func2(**kwargs):
...     print(kwargs)
... 
>>> kwargs_func2(name1='kim')
{'name1': 'kim'}
>>> 
>>> 
>>> def kwargs_func3(**kwargs):
...     for k,v in kwargs.items():
...         print(k,v)
... 
>>> kwargs_func3(name1='a', name2='b')
name1 a
name2 b
>>> 
>>> 

args와 kwargs 둘다 사용하기

>>> def example_mul(arg1, arg2, *args, **kwargs):
...     print(arg1, arg2, args, kwargs)
... 
>>> example_mul(10,20)
10 20 () {}
>>> 
>>> example_mul(10,20, 'park', 'kim', age1=24, age2=35)
10 20 ('park', 'kim') {'age1': 24, 'age2': 35}
>>> 

중첩함수(클로저)

  • 함수 안에 함수가 있는 것!
  • 장점:
    • 변수의 선언을 줄일 수 있음
    • 메모리 관리를 효율적으로 할 수 있음
    • 참고: 데코레이터
>>> def nested_func(num):
...     def func_in_func(num):
...         print(num)
...     print("in func")
...     func_in_func(num + 10000)
... 
>>> nested_func(10000)
in func
20000
>>> 
>>> 
>>> def nested_func2(num):
...     def func_in_func(num):
...         print("fun_in_func", num)
...     print("in func")
...     func_in_func(num + 10000)
... 
>>> nested_func2(10000)
in func
fun_in_func 20000
>>> 
>>> 

힌트 (hint)

def func_mul3(x : int) -> list

  • 입력 x는 int이고 return은 list임을 코드상에서 명시적으로 알려주는 용도
  • 입력의 명시한바와 같이 int가 아니거나 출력이 list가 아니더라도 에러가 발생하지는 않음
>>> def func_mul3(x : int) -> list : # 입력 x는 int이고 return은 list임을 알려주는 용도
...     y1 = x * 100
...     y2 = x * 200
...     y3 = x * 300
...     return [y1,y2,y3]
... 
>>> 
>>> func_mul3(5.0)
[500.0, 1000.0, 1500.0]
>>> 
>>> func_mul3(5)
[500, 1000, 1500]
>>> 
>>> 
>>> def func_mul3(x : int) -> list :
...     y1 = x * 100
...     return y1
... 
>>> 
>>> func_mul3(5.0)
500.0
>>> type(func_mul3(5.0))
<class 'float'>
>>> 
>>> func_mul3(5)
500
>>> type(func_mul3(5))
<class 'int'>
>>> 

람다식

  • 메모리 절약, 가독성 향상, 코드 간결
  • 함수는 객체 생성 -> 리소스(메모리) 할당
  • 람다는 즉시 생성(heap 초기화) -> 메모리 초기화
  • 주의:
    • 람다식으로 썼다고 해서 무조건적으로 가독성이 좋아지는 것은 아님
    • 함수를 써야할 때는 함수를 써야함
    • 보통 람다를 익명함수에 사용함
>>> def mul_10(num : int) -> int:
...     return num * 10
... 
>>> 
>>> var_func = mul_10
>>> print(var_func)
<function mul_10 at 0x10b176320>
>>> 
>>> print(type(var_func))
<class 'function'>
>>> 
>>> print(var_func(10))
100
>>> 
>>> # 람다
>>> lambda_mul_10 = lambda num: num * 10
>>> 
>>> print(lambda_mul_10(10))
100
>>> 
>>> def func_final(x,y,func):
...     print(x * y * func(10))
... 
>>> func_final(10,10,lambda_mul_10)
10000
>>> 
>>> 
>>> func_final(10,10,lambda x : x * 1000)
1000000
>>> 
profile
#의식의흐름 #순간순간 #생각의스냅샷

0개의 댓글