점프 투 파이썬 - 함수★★
Language/Python

점프 투 파이썬 - 함수★★

뉴비뉴 2019. 7. 9.

구조

def 함수명(매개변수):
    <수행할 문장1>
    <수행할 문장2>
    ...

def는 함수를 만들 때 사용하는 예약어이며, 함수 이름은 함수를 만드는 사람이 임의로 만들 수 있다.

매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수이다.

def add(a, b): 
    return a + b
# "함수의 이름은 add이고, 입력으로 2개의 값을 받으며 결과값은 2개의 입력 값을 더한 값이다"

매개변수와 인수

매개변수(parameter)와 인수(arguments)는 혼용해서 사용되는 헷갈리는 용어이므로 잘 기억해 둬야된다.

def add(a,b): # a,b는 매개변수
	return a+b
    
print(add(3,4)) # 3,4는 인수

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

입력값(a,b) ---> 함수(def) ---> 결과값(return)

일반적인 함수

입력값이 있고 결과값이 있는 함수가 일반적인 함수이다.

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

입력값이 없는 함수

>>> def say(): 
...     return 'Hi' 
... 
>>>

>>> a = say()
>>> print(a)
Hi

# 입력값이 없고, 결과값만 있는 함수는 다음과 같이 사용한다.
결괏값을 받을 변수 = 함수 이름()

결과값이 없는 함수(return이 없음)

>>> def add(a, b): 
...     print("%d, %d의 합은 %d입니다." % (a, b, a+b))
... 
>>>

>>> add(3, 4)
3, 4의 합은 7입니다.

함수 이름(매개변수1, 매개변수2, ...)

입력값도 결과값도 없는 함수

>>> def say(): 
...     print('Hi')
... 
>>>


>>> say()
Hi


함수 이름()

입력값이 몇 개가 될지 모를 때는 어떻게 해야 할까?

def 함수이름(*매개변수): # !!! *매개변수
	<수행할 문장>
>>> def add_many(*args): 
...     result = 0 
...     for i in args: 
...         result = result + i 
...     return result 
... 
>>>

*args 처럼 매개변수 이름 앞에 *을 붙이면 입력값을 전부 모아서 튜플로 만들어준다.

add_many(1,2,3) 처럼 이 함수를 쓰면 args는 (1,2,3) 이 되는 것이다.

 

[!] args 는 매개변수를 뜻하는 영어 단어 arguments 의 약자이며 관례적으로 자주 사용한다.

def add_mul(choice, *args):
    if choice == "add":
        result = 0
        for i in args:
            result += i
    elif choice == "mul":
        result = 1
        for i in args:
            result *= i
    return result

addresult = add_mul('add', 1,2,3,4,5)
mulresult = add_mul('mul', 1,2,3,4,5)
print("add", addresult)
print("mul", mulresult)

[키워드 파라미터 kwargs]

이번에는 키워드 파라미터에 대해 알아보자. 키워드 파라미터를 사용할 때는 매개변수 앞에 별 두 개(**)를 붙인다.

>>> def print_kwargs(**kwargs):
	print(kwargs)
    
>>> print_kwargs(a=1)
{'a': 1}
>>> print_kwargs(name='foo', age=3)
{'age':3,'name':'foo'}

#########################################

def signup(**info):
    print(info)

signup(name='LCS',age=23,email='2044smile@naver.com')
{'name': 'LCS', 'age': 23, 'email': '2044smile@naver.com'}

이런식으로 회원정보를 받고 정리하는 걸로도 사용할 수 있을 듯 싶다.

입력 값 a=1 또는 name='foo', age=3이 모두 딕셔너리로 만들어져서 출력된다는 것을 확인 할 수 있다.

즉 **kwargs 처럼 매개변수 이름 앞에 **을 붙이면 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 결과값이 그 딕셔너리에 저장된다.

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

def add_and_mul(a,b): # 2개의 입력 인수를 받아 더한 값과 곱한 값을 돌려주는 함수이다.
	return a+b, a*b
    
>>> result = add_and_mul(3,4) ?!

위와 같이 retrun 에 a+b, a*b의 연산이 들어가있는데 받는 변수는 result 하나만 쓰였으면 어떻게될까?

오류는 발생하지 않는다. 그 이유는 함수의 결과값은 2개가 아니라 언제나 1개라는 데 있다. a+b 와 a*b는 튜플값 하나인 (a+b, a*b)로 돌려준다. 따라서 result 변수는 다음과 같은 값을 갖게 된다.

result = (7, 12)

# 만약 이 하나의 튜플 값을 2개의 결과값처럼 받고 싶다면 다음과 같이 함수를 호출하면 된다.

result1, result2 = add_and_mul(3, 4)
# 이렇게 호출하면 result1, result2 = (7, 12)가 되어 result1 은 7이 되고, result2는 12가 된다.

? return 문을 2개를 사용한다면?
>>> def add_and_mul(a,b): 
...     return a+b 
...     return a*b 
... 
>>>
[!] 결과값은 5 하나뿐이다. 두 번째 return문은 실행되지 않았다는 뜻이다.
[!] 즉 함수는 return 문을 만나는 순간 결과값을 돌려준 다음 함수를 빠져나가게 된다.

[return의 또 다른 쓰임새]

특별한 상황일 때 함수를 빠져나가고 싶다면 return을 단독으로 써서 함수를 즉시 빠져나갈 수 있다.

>>> def say_nick(nick): 
...     if nick == "바보": # "nick에 바보가 입력되었으면 return 되어 아무런 값이 안나온다.
...         return 
...     print("나의 별명은 %s 입니다." % nick) # 바보를 제외한 다른 별명이 입력되었으면 실행
... 
>>>

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

def say_myself(name, old, man=True): # man=True 매개변수에 미리 값을 넣어준 것이다.
    print("나의 이름은 %s 입니다." % name)
    print("나이는 %d살입니다." % old)
    if man:
        print("남자")
    else:
        print("여자")


함수의 매개변수에 들어갈 값이 항상 변하는 것이 아닐 경우에는 이렇게 함수의 초깃값을 설정해두면 유용하다.
say_myself('LCS',23,True)
say_myself('LCS',23) # man=True가 초기값으로 설정되어 있어 입력하지 않아도 남자입니다가 출력!
# False 로 변경 시 여자입니다 출력

함수의 매개변수에 초깃값을 설정할 때 주의해야 할 것이 하나 있다.

def say_myself(name, man=True, old): # man=True가 가운데에 온다면?

오류가 발생한다. 

왜냐하면
say_myself("LCS", 27) 와 같이 함수를 호출한다면 name에는 "LCS"가 들어가지만 27을 man 변수와 old 변수 중
어느곳에 대입해야 할지 알 수 없게된다.
SyntaxError: non-default argument follows default argument

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

# vartest.py
a = 1
def vartest(a):
    a = a +1

vartest(a)
print(a)

결과값은 1이 나온다. 그 이유는 함수 안에서 새로 만든 매개변수는 함수 안에서만 사용하는 "함수만의 변수"

이기 때문이다. 즉 def vartest(a) 에서 입력 값을 전달받는 매개변수 a 는 함수 안에서만 사용하는 변수이지 함수 밖의 변수 a가 아니라는 뜻이다. 함수 안에서 사용하는 매개변수는 함수 밖의 변수 이름과는 전혀 상관이 없다는 뜻이다.

# vartest_error.py
def vartest(a):
    a = a + 1

vartest(3)
print(a)

vartest(3)을 수행하면 vartest함수 안에서 a는 4가 되지만 함수를 호출하고 난 뒤에 print(a) 문장은 오류가 발생하게 된다. 그 이유는 print(a)에서 입력받아야 하는 a 변수를 어디에서도 찾을 수가 없기 때문이다.

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

1. return 사용하기

a = 1
def vartest(a):
    a = a+1
    return a

a = vartest(a)
print(a)

2. Global 명령어 사용하기

a = 1 
def vartest(): 
    global a # 함수 밖의 a 변수를 직접 사용하겠다는 뜻이다.
    a = a+1

vartest() 
print(a)
하지만 프로그래밍을 할 때 global 명령어는 사용하지 않는 것이 좋다.
왜냐하면 함수는 독립적으로 존재하는 것이 좋기 때문이다.

lambda

함수를 생성할 대 사용하는 예약어로 def와 동일한 역할을 한다. 보통 함수를 한 줄로 간결하게 만들 때 사용한다.

lambda 매개변수1, 매개변수2, ... : 매개변수를 이용한 표현식

>>> add = lambda a, b: a+b
>>> result = add(3, 4)
>>> print(result)
7

add는 두 개의 인수를 받아 더한 값을 돌려주는 lambda 함수이다
아래 예제는 def로 똑같이 구현한 것이다.

>>> def add(a, b):
...     return a+b
...
>>> result = add(3, 4)
>>> print(result)
7

댓글

💲 추천 글