Data/Python

[Python] 파이썬 함수 - def, lambda

재은초 2023. 6. 17. 21:21
반응형

함수란?

  • 반복적으로 사용되는 부분을 하나로 묶어서, 어떤 입력값을 주었을 때 어떤 결과값을 돌려줄 수 있는 함수로 작성하는 것을 말한다.
  • 참고로 매개변수(parameter)는 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수이고, 인수(arguments)는 함수 호출시 전달하는 입력 값이다.
def 함수명(입력인수):            
    <수행할 문장1>               # def는 함수를 만들 때 사용하는 예약어
    <수행할 문장2>               # 함수명은 함수를 만드는 사람이 임의 설정 가능
    ...
def add(a, b):      # a, b가 매개변수
    return a+b

print(add(3, 4))    # 3, 4가 인수

 

입력값과 결과값에 따른 함수 형태

  • 입력값과 결과값이 있는 일반적인 함수
>>> def sum(a, b):           # 1. 함수 만들기
>>>    return a + b          # 입력값 2개(a, b), 결과값은 입력값 2개를 더한 것
                             # return은 함수의 결과값을 돌려주는 명령어
                             
>>> a = 1                    # 2. 함수 사용
>>> b = 2                    # 함수에 a와 b를 입력값으로 넣어줌
>>> c = sum(a, b)            # 변수 c에 add 함수의 결과값을 대입
>>> print(c)
3
  • 입력값이 없는 함수
# 입력값이 없는 함수 예시
>>> def say():             # 매개변수 부분이 비어 있는 say라는 이름의 함수
>>>     return 'Hi'        # 입력값은 없지만 결과값으로 Hi라는 문자열을 돌려줌

>>> a = say()              # 위의 함수를 쓰기 위해서는,
>>> print(a)               # say()처럼 괄호 안에 아무런 값도 넣지 않아야 함
Hi
  • 결과값이 없는 함수: print문은 함수의 구성 요소 중 하나로, 결과값은 오직 return 명령어로만 돌려받을 수 있다.
>>> def add(a, b):    
...     print("%d, %d의 합은 %d입니다." % (a, b, a+b))
>>> add(3, 4)                    
3, 4의 합은 7입니다.

>>> a = add(3, 4)
>>> print(a)
None                        # None이란 거짓을 나타내는 자료형
                            # 결과값이 없는 함수는 리턴값으로 변수에 None을 돌려줌
                            # 하지만 이는 결과값은 아니다
  • 입력값도 결과값도 없는 함수
>>> def say():          # 입력 인수를 받는 매개변수도 없고
...     print('Hi')     # return문도 없으니 입력값도 결과값도 없는 함수
... 

>>> say()               # 이 함수를 사용하는 방법은 단 한 가지 - 함수명만 입력
Hi
  • 입력값이 몇 개가 될지 모를 때: 매개변수명 앞에 *을 붙이면 입력값들을 전부 모아서 튜플로 만들어 준다.
# 입력값 모를때 기본 구조
def 함수이름(*매개변수):            
    <수행할 문장>                 
    ...

① *args(인수) : 입력값이 여러개인 인수가 주어지면 그를 토대로 함수 작동

# 입력값이 여러개일 때, 매개변수 1개 함수
>>> def add_many(*args):                  # argument 약자
...     result = 0                        
...     for i in args:       
...         result = result + i 
...     return result 
... 

>>> result = add_many(1,2,3)               # 함수 사용
>>> print(result)
6
>>> result = add_many(1,2,3,4,5,6,7,8,9,10)
>>> print(result)
55

# 입력값이 여러개일 때, 매개변수 2개 함수
>>> def add_mul(choice, *args):            # 함수 설정
...     if choice == "add": 
...         result = 0 
...         for i in args: 
...             result = result + i 
...     elif choice == "mul": 
...         result = 1 
...         for i in args: 
...             result = result * i 
...     return result 
... 
>>> result = add_mul('add', 1,2,3,4,5)      # 함수 사용
>>> print(result)
15
>>> result = add_mul('mul', 1,2,3,4,5)
>>> print(result)
120

② **kwargs(키워드 파라미터) : 이름 앞에 **을 붙이면 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 결괏값이 그 딕셔너리에 저장된다.

# 키워드 파라미터 (kwargs) 예시
>>> def print_kwargs(**kwargs):         # keyworkd arguments 약자
...     print(kwargs)

>>> print_kwargs(a=1)                   # 함수 사용
{'a': 1}
>>> print_kwargs(name='foo', age=3)
{'age': 3, 'name': 'foo'}               # 입력이 모두 딕셔너리로 만들어져서 출력


매개변수에 따른 함수 표현법

  • 매개변수 지정하여 호출하기
>>> def add(a, b):
...     return a+b

>>> result = add(a=3, b=7)       # a에 3, b에 7 전달
>>> print(result)
10

>>> result = add(b=5, a=3)       # b에 5, a에 3 전달 - 순서에 상관없음
>>> print(result)
8

 

함수의 결과값은 언제나 하나다

  • 함수 결과값이 2개일때는 튜플값 하나(a, b)로 돌려준다.
# 함수 결과값이 2개일때, 튜플로 반환
>>> def add_and_mul(a,b):        # 함수 생성
...     return a+b, a*b

>>> result = add_and_mul(3,4)    # 함수 호출
>>> result
(7, 12)                          # 튜플값 하나(a+b, a*b)로 돌려줌

# 만약 하나의 튜플값을 각각의 결과값으로 받고 싶을때
>>> result1, result2 = add_and_mul(3, 4)
>>> result1
7
>>> result2
12
  • 함수 내에 return문구가 많더라도, 함수는 return문을 만나는 순간 결과값을 돌려준 다음 함수를 빠져나가므로 첫번째 return값만 호출된다.
# return문을 2번 사용하면
>>> def add_and_mul(a,b): 
...     return a+b 
...     return a*b 
>>> result = add_and_mul(2, 3)
>>> print(result)                  # 두번째 return문 a*b는 실행되지 않음
5                                  # 결과값은 5 하나뿐

# return을 쓰면 함수에서 즉시 빠져나갈 수 있음
>>> def say_nick(nick): 
...     if nick == "바보": 
...         return 
...     print("나의 별명은 %s 입니다." % nick)
>>> say_nick('야호')
나의 별명은 야호입니다.
>>> say_nick('바보')                 # 바보 출력하지 않음
>>>



매개변수 초깃값 미리 설정하기

  • 함수의 매개변수에 전달되는 값이 항상 변하는 것이 아닐 경우에는 함수 초깃값을 미리 설정해 두면 유용
  • 초기화시키고 싶은 매개변수들을 항상 뒤쪽에 위치시켜야 함 (ex. 매개변수로 (name, old, man=True)는 되지만 (name, man=True, old)는 안 됨)
# 매개변수가 3개일 때,
>>> def say_myself(name, old, man=True):    # say_myself 함수는 3개 받아서
>>>    print("나의 이름은 %s 입니다." % name) 
>>>    print("나이는 %d살입니다." % old) 
>>>    if man:                              # man이 True면 남자
>>>        print("남자입니다.")
>>>    else:                                # False면 여자 출력
>>>        print("여자입니다.")

>>> say_myself("박응용", 27)            
나의 이름은 박응용입니다.
나이는 27살입니다.
남자입니다.



함수 안에서 선언된 변수의 효력 범위

  • 함수 안에서 선언된 매개변수는 함수 안에서만 사용될 뿐 함수 밖에서는 사용되지 않는다.
>>> a = 1
>>> def vartest(a):          # 매개변수 a의 값에 1을 더했으니
>>>    a = a +1              # 2가 출력되어야 할 것 같지만 결과값은 1이 나옴
>>> vartest(a)               # 입력받은 a는 함수 안에서만 사용
>>>                          # 아무것도 안 나옴
>>> print(a)                 # 함수 밖의 변수 a와 다름
1

# 함수 에러
>>> def vartest(a):
>>>    a = a + 1
>>> vartest(3)               # vartest라는 함수 내에서 a는 4가 됨
4
>>> print(a)                 # print(a)에서 사용된 a는 찾을수 없어 에러
NameError: name 'a' is not defined



함수 안에서 함수 밖의 변수를 변경하는 방법

① return 사용: 함수 내에서 결과값을 return으로 받고, 이를 변수로 받아서 출력.

>>> a = 1 
>>> def vartest(a):              # 함수 vartest(a)의 a는 단순 임의의 변수명
>>>     a = a +1 
>>>     return a
>>> a = vartest(a)               # 여기서 vartest(a)은 vartest(1)과 동일
>>> print(a)                     
2

② global 명령어 사용: 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻. 하지만 외부 변수에 종속적인 함수는 그다지 좋은 함수가 아니므로 비추천.

>>> a = 1 
>>> def vartest(): 
>>>     global a                 # 함수안에서 함수밖의 a 변수를 직접 사용
>>>     a = a+1                  

>>> vartest() 
>>> print(a)
2


Lambda 함수

  • 'lambda 변수: return 내용' 형식의 단일문으로 표현되는 함수
  • 익명의 함수로 이름이 없는 구현체만 존재하는 간단한 함수를 의미
  • 코드 상에서 한번만 사용되는 기능이 있을 때, 굳이 긴 함수로 만들지 않고 1회성으로 만들어서 쓸 때 사용.
# 함수 def 함수이름(변수)
def add(x, y):
    return x + y

# 함수 lambda 변수: return 내용
add2 = lambda x, y: x + y
add2(10, 20)
# 람바다 예시
>>> add = lambda a, b: a+b     # 2개의 인수를 받아 서로 더한 값을 리턴
>>> result = add(3, 4)
>>> print(result)
7

# 위와 동일한 def 함수
>>> def add(a, b):
...     return a+b
>>> result = add(3, 4)
>>> print(result)
7

 

Reference

반응형