Programming/Pyhton

파이썬: 함수(Function)

JunsuKim 2022. 7. 28.
728x90

함수란?

카페에서 음료를 시키는 과정을 생각해보자.

우리는 키오스크 또는 직원에게 원하는 음료를 주문할 것이다. 이는 "입력값"이 된다.

또한 주문한 음료가 준비되서 나온다면, "출력값"으로 볼 수 있다.

카페에서 이러한 일이 일어나므로 카페라는 "함수"가 있다고 생각하면 된다.

중고등학교 때도 함수에 대해 배웠을 것이다.

예를 들어 y = x + 3도 함수이다. 이를 직선 그래프로만 배웠지, 프로그래밍의 함수와 연관지을 생각은 못했을 거싱다.

하지만 이 수식도 x의 값이 입력됨에 따라 y값이 출력되는 입력값과 출력값이 있는 함수이다.

함수를 사용하는 이유

프로그래밍을 하다보면 같은 내용을 반복해서 사용해야 할 때가 있다.

이 때 반복되는 부분을 한 뭉치로 묶어 "어떠한 입력값이 주어졌을 때, 어떤 결과값을 반환한다."라는 식의 함수로 작성하는 것이 좋다.

또한 함수를 사용하면 작성한 프로그램의 흐름을 더 알아보기 쉬워진다.

쉽게 말해 역할이 분담되있다 생각하면 된다.

파이썬 함수의 구조

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

def는 함수를 선언할 때 사용하는 예약어이다. 함수명은 프로그램을 설계하는 사람이 임의로 작성하면 된다.

함수명은 모두가 알아보기 편하게 만드는 것이 좋다. 예를 들어 입력을 담당하는 함수일 때, Input이라는 함수명을 주는 것이 좋다.

함수명 뒤 괄호 안의 매개변수는 이 함수에 전달되는 값을 전달받는 매개변수이다.

 

파이썬에서는 함수를 선언하지 않고도 간단한 프로그래밍이 가능하다.

C와 Java 등의 언어에서는 main 함수를 필수로 작성해야 하지만 파이썬에서는 main 함수가 없어도 된다는 것이다.

하지만 main 함수를 작성하지 않으면, 모두 전역으로 선언되서 메모리 낭비가 일어나므로 main 함수를 선언해주는 것이 좋다.

 

함수의 예시를 보자.

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

위 함수를 해석해보면, "함수의 이름은 add이며, a, b라는 값을 전달받아 더해서 반환한다."와 같다.

 

main 함수를 작성하여 add 함수와 같이 보자.

파이썬의 main 함수는 def로 선언하지 않는다.

if __name__ == "__main__":

main 함수의 선언 방법은 위와 같다.

if __name__ == "__main__":
    a = 3
    b = 4
    print(add(a, b))
    

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

위에서는 a, b를 더해주는 과정이 한번밖에 없어서 굳이 써야하나 싶을 것이다.

하지만 더해주는 과정이 많아지면, 계속 a + b를 해주는 대신 add(a, b)만으로 해결할 수 있다.

매개변수와 인수

매개변수(parameter)와 인수(arguments)는 헷갈리기 쉽다.

def add(a, b):
    return a + b
    
print(add(3, 4))

위의 코드에서 add함수의 괄호 안에 있는 것이 매개변수이고, 출력에 사용된 add함수 안에 있는 값은 인수이다.

매개변수는 함수에 입력으로 전달된 값을 받는 변수를 의미하고,

인수는 함수를 호출할 때 전달하는 입력값을 의미한다.

매개변수 지정하여 호출하기

함수를 호출할 때 매개변수를 지정할 수도 있다.

def add(a, b):
    return a + b
    
print(add(a=3, b=4))

7

입력값이 몇 개일지 모를 때

입력값을 몇개를 넘길지 모를 때, 그 인자를 다 더해주는 함수가 있다고 하자.

이 때, 매개변수를 *매개변수 형태로 해주면 된다.

def 함수명(*매개변수):
    <수행할 문장>
    ...
def add(*args):
    result = 0

    for i in args:
        result += i

    return result


if __name__ == "__main__":
    print(add(1, 2, 3, 4, 5))
    print(add(1, 2, 3))
    
15
6

*args는 입력값을 모두 모아 튜플로 만들어준다.

따라서 add(1, 2, 3, 4, 5)를 호출하면 args는 (1, 2, 3, 4, 5)가 되고, add(1, 2, 3)을 호출하면 (1, 2, 3)이 된다.

args는 임의로 설정한 매개변수명이기 때문에, 코드를 작성하는 사람마다 원하는 대로 작성하면 된다.

함수의 결과값

함수의 결과값은 항상 하나이다.

만약 다음과 같은 함수가 있다하자.

def calculation(a, b):
    return a+b, a*b

이 함수를 호출하면 어떻게 될까?

C와 Java와 같은 언어에서는 당연히 오류가 날 것이다.

하지만 파이썬에서는 오류가 나지 않고, 하나의 튜플로 반환해준다.

따라서 반환값은 다음과 같다.

>>> calculation(3, 4)
(7, 12)

이를 각각 받고 싶다면, 다음과 같이 하면 된다.

add, multiple = calculation(3, 4)

위와 같이 하면 add 변수에는 7, multiple 변수에는 12의 값이 할당된다.

이렇게 여러개의 return값을 받을 수 있는데, return문을 여러번 사용해도 되지 않을까? 싶기도 할 것이다.

 def calculation(a, b):
     return a + b
     return a * b
     return a / b

이렇게 하면 당연히 3개의 반환값을 받지 못하고, 처음 return문 결과값만을 받을 수 있다.

return문은 만나는 순간 함수를 빠져나가기 때문에, 처음 return문 이후의 return문은 실행되지 않는 것이다.

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

함수 안에서 선언한 변수명을 함수 밖에서도 동일하게 사용할 수 없다.

a = 1

def add(a)
    a += 1
    return a
    
print(add(a))
print(a)

이러한 코드가 있을 때, 출력값은 어떻게 될까?

답은 2와 1이 출력된다.

add함수에서 매개변수 a에 1을 더한 값을 반환했으므로 처음 출력값은 2가 나온다.

하지만 두번째 출력한 a의 값은 1이 나온다.

이는 함수 안에서 a의 값이 변경되었더라도, 그 함수에만 적용이 되고, 함수의 밖에서는 적용되지 않는다는 것을 알 수 있다.

def add(a):
    a += 1
    return a
   
print(add(3))
print(a)

위 코드는 첫번째 출력값으로 4가 나올 것이다.

두번째 출력값은 어떨까?

여기서는 오류가 발생하게 된다. 출력할 a 변수가 어디에도 존재하지 않기 때문이다.

위에서도 말했듯이, 함수 안에서 선언된 변수는 함수 안에서만 사용할 수 있고, 밖에서는 사용할 수 없다.

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

여기에는 두가지 방법이 있다.

위에서는 반환한 add 함수의 값을 출력했었다. 이를 a 변수에 할당해주면 a 변수의 값이 변경된다.

def add(a):
    a += 1
    return a
   
a = add(3)
print(a)

4

물론 이렇게 해도 add 함수 안의 a 변수와 함수 밖의 a 변수는 다르다.

 

두 번째 방법은 global 명령어를 사용하는 것이다.

a = 1

def add():
    global a
    a += 1

add()
print(a)

2

global 명령어를 사용하면 함수 안에서 함수 밖의  a 변수를 직접 사용하겠다는 의미이다.

하지만 global을 자주 사용하는 것은 좋은 방법은 아니다. 함수는 독립적으로 존재하는 것이 좋기 때문에, 외부 변수에 종속적인 함수는 그다지 좋은 함수가 아니다.

lambda

lambda는 함수를 선언할 때 사용하는 예약어로 def와 같은 역할을 한다.

보통 함수를 한줄로 간결하게 만들 때 사용한다.

lambda의 구조는 다음과 같다.

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

예시를 보자.

add = lambda a, b: a + b
print(add(1, 2))

3

a, b를 매개변수로 받아 a + b의 값을 반환해주는 add 함수를 선언한 것이다.

lambda로 선언한 함수는 return문이 없어도 :뒤의 표현식이 return값이 된다.

728x90

댓글