본문 바로가기
언어/Python

[Python 기본 공부정리] 6. 함수(function)

by 민-Zero 2019. 12. 24.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다. 

틀린 부분에 대한 지적은 감사합니다.

1. 함수(function)

함수란 어떠한 입력값이 주어지면 일련의 과정을 통해 출력 값을 내주는 하나의 과정을 반복해서 사용하기 위해 만든 것이다. 우리가 깊게 생각하지 않고 사용하던 print(), range()등이 어떤 입력값이 주어지면 해당 함수에 작성된 기능을 호출할 때마다 동작했던 함수이다. 

프로그래밍을 진행하다 보면 동일한 과정을 적용되는 데이터만 변경해 진행해야 하는 경우가 생긴다. 이때 함수가 존재하지 않는다면 동일과정을 계속해서 작성해야 하는데 그렇게 되면 불필요하게 코드만 커져 가독성이 떨어지고 작업의 효율이 줄어들게 된다. 따라서 이 반복적으로 동작해야 하는 기능을 하나로 묶어 필요할 때 사용할 수 있도록 도와주는 것이 함수의 역할이다. 또한 함수를 통해 결괏값을 얻어내게 되면 프로그램이 동작하는 과정이 한눈에 쉽게 들어오기 때문에 트러블슈팅에도 용이하다. 

즉, 코드의 불필요한 중복을 줄이고 재사용성을 늘려주며 프로그램의 흐름을 파악해 에러를 줄이는 대에 도움이 된다.

 

2. 함수 선언

문법)

def 함수명(매개변수1, 매개변수2, ..):

    실행 코드

    ....

    return 반환값

def는 함수를 생성할 때 사용하는 예약어 이므로 변경할 수 없다. 사용자가 직접 정의한 함수명을 사용하여 함수를 호출할 수 있고 매개변수를 통해 함수로 전달되는 값을 받아들인다. 함수가 호출되면 원하는 기능을 구현한 실행 코드가 동작하고 동작을 마치면 return을 통해 호출한 곳으로 반환할 값이 있다면 돌려주고 반환값이 없는 경우에는 None값을 반환한다.

입력받은 두 수의 곱을 반환하는 함수 mul을 생성한 모습이다. 함수 호출 시 반환값이 존재하는 함수이므로 호출 자체에서 값을 돌려주는 것을 확인할 수 있고 변수에 반환값을 저장하는 것 또한 가능하다.

함수를 사용할 때 자주 헷갈리는 용어로 매개변수(parameter)와 인수(arguments)가 존재한다. 매개변수는 함수에 입력되는 값을 받는 변수를 의미하고 인수는 함수를 호출할 때 함수로 전달되는 값을 의미한다. 위의 예시에서는 x, y가 매개변수 10, 3이 인수이다. 두 용어를 혼동하지 않도록 주의하자.

 

또한 함수를 사용하게 되면 return을 통해 리턴값을 돌려주는 일이 굉장히 빈번하다. 이때 주의해야 할 점은 함수의 리턴값은 오직 1개라는 것이다.

return에 인수로 들어온 값의 곱과 나누기의 결과를 각각 반환하고 그 값을 result라는 하나의 변수에 받게 되면 오류가 아닌 튜플로 두 개의 값이 하나로 묶여 들어오게 되는 것을 확인할 수 있다. 따라서 결괏값이 2개인 것처럼 튜플 안의 각각의 요소를 받기 위해 변수 2개를 사용하여 받는다.

이 경우 때문에 리턴값이 여러 개라고 착각하기 쉬운데 리턴 값을 여러 개로 줄 경우 튜플형 데이터 1개로 묶여 반환되는 것이며 그 각각의 리턴 값을 따로 저장하기 위해 여러 변수를 통해 리턴값을 받는 것이지 리턴 값이 여러 개 인 것은 아니다.

 

 

2. 다양한 함수의 형태

매개변수, 리턴값이 모두 존재하는 함수뿐만 아니라 다양한 형태의 함수도 존재한다.

 

①매개변수가 존재하지 않아 입력값이 없는 함수

인수로 전달된 값을 받을 매개변수가 없기 때문에 호출에서 따로 값을 넘겨주지 않아도 동작한다.

 

리턴값이 없는 함수

리턴값이 없는 함수 이기 때문에 함수 호출만으로 원하는 기능이 동작하며 따로 값을 받을 필요가 없다.

 

리턴값, 입력값 둘 다 없는 함수

매개변수도 return도 존재하지 않아 입력값, 결과값 모두 존재하지 않는 함수이다.

 

인수에서 매개변수를 지정한 함수

함수에 인수로 값을 전달할 경우 함수에 정의된 매개변수의 순서대로 값이 들어가게 된다. 각 매개변수에 들어갈 값을 순서에 상관없이 인수에서 결정할 수도 있다.

매개변수명을 인수 자체에서 사용하여 전달할 경우 먼저 들어가는 22라는 값이 순서상 뒤에 선언된 y변수에 들어가고 마지막에 들어가는 11이라는 값이 순서상 먼저 선언된 x변수에 들어가는 것을 확인할 수 있다.

 

1개의 매개변수로 여러 개의 입력값을 받는 함수

어떤 기능을 구현하는데 입력값으로 몇 개의 인수가 들어올지 알 수 없는 경우 또는 다양한 개수의 입력값이 존재하는 동일한 기능의 함수를 구현해야 해서 일일이 여러 함수를 작성해야 한다면 굉장히 번거로울 것이다. 따라서 파이썬에서 효율적인 일처리를 위해 한번에 여러 개의 입력값을 받을 수 있는 방법이 존재한다.

문법)

def 함수명(*매개변수명):

    실행코드

    ....

    return 반환값

의 형태로 작성할 수 있다.

이처럼 매개변수명 앞에 *를 붙여 사용하게 되면 입력되는 모든 값들을 모아 튜플로 만들어 주게 된다.

 

인수로 들어온 모든 값들의 합을 구해주는 함수를 만들어야 한다면 일일이 변수의 개수마다 함수를 제작하는 것이 아니라 이를 응용하여 몇 개의 인수가 들어와도 상관없이 합을 구해줄 수 있는 함수를 작성할 수 있다. 

 

물론 1개의 인수만 가지는 매개변수와 같이 혼용해서 사용해도 된다.

 

입력값을 딕셔너리 형태로 저장하는 함수

해당 방법을 사용할 경우 여러 개의 입력값들이 한 번에 변수명이 key값으로 대입하려는 값이 value로 나뉘어 딕셔너리로 만들어지게 된다.

여러 입력값을 한 번에 받아주는 *에 *을 하나 더 붙여 총 2개를 사용하여 **매개변수명으로 함수를 선언 및 정의할 경우 인수에서 변수명과 데이터로 넘길 시 딕셔너리 형태의 key와 value로 저장되게 된다. 

 

디폴트(default) 매개변수

디폴트 매개변수는 인수 전달방법의 하나로 매개변수에 초기값을 설정하여 매개변수가 존재하지만 입력값을 받지 않을 수 있도록 하는 방법이다.

일반적인 함수의 경우 정의한 매개변수만큼의 인수가 들어오지 않을 경우 인수에 대한 에러를 발생시킨다.

하지만 함수정의 자체에서 디폴트 매개변수를 설정할 경우 인수에 대한 에러가 발생하지 않고

필요시에 초기값으로 설정한 값 대신 원하는 값을 이용하는 것도 가능하다.

 

하지만 초기값이 존재한다고 하여 인수를 건너뛰고 전달하는 것은 불가능하며

디폴트 매개변수를 선언할 경우 맨 마지막 매개변수부터 차례로 설정해야 하고 그렇지 않을 경우 에러를 발생시킨다.

 

3. 람다(lambda)식

람다는 런타임에 생성되는 익명함수를 지칭하며 def와 다른 함수를 생성하는 예약어이다. 익명함수란 일반적인 함수와 다르게 함수의 이름을 정하지 않고도 함수를 정의할 수 있는 함수이다. 람다식은 한번 쓰고 버려지는 함수로 어딘가에 정의하고 사용하는 것이 아니라 필요 위치에서 잠깐 사용되므로 주로 함수를 한 줄로 간결하게 사용할 때 사용한다.

문법)

lambda 매개변수1, 매개변수2, ... : 매개변수를 이용한 기능 구현

 

매개변수에 입력받은 값을 출력해주는 람다 함수이다. 함수를 이처럼 변수에 할당하여 간단하게 사용할 수 있다.

또한 함수 안의 반환 값을 함수로 표현할 수 있으며 func()(10, 11)의 (10, 11) 부분을 보면 알 수 있는 것처럼 따로 변수를 할당해주지 않아도 사용할 수 있다. 

 

4. 지역변수(local variable), 전역변수(global variable)

함수를 사용해보면 함수 내부에서 사용하던 매개변수를 함수 외부에서 사용할 수 없는 것을 확인할 수 있다.

분명히 함수 내부에서 result라는 변수에 매개변수에 입력받은 값을 더해 저장하였는데 함수 외부에서 result변수의 값을 확인하려 하면 정의되지 않은 변수라고 에러가 발생하게 된다.

 

이유는 변수가 정의된 위치 때문이다. 변수는 namespace라는 공간에 정의되어 프로그램 전체에서 사용되는 변수인지 일정한 공간에서 사용되는 변수인지를 구분 짓게 된다. 구분되는 변수는 지역변수와 전역 변수라고 불린다.

지역변수(local variable) : 일정 지역(함수 내부)에서만 정의되는 변수이며 정의된 지역을 벗어나게 되면 변수가 정의되어 있지 않다.

전역변수(global variable) : 우리가 일반적으로 정의하던 변수이며 프로그램 내부 어디서든 사용할 수 있는 변수이다. 함수 내부 등에서 값의 변경은 불가능 하지만 호출하여 사용은 가능하다.

 

변수가 정의되는 공간에 따라 분리되어 있으므로 위와 같은 경우에 동일 변수명을 사용한 에러가 발생하지 않고 함수 내부에서 정의된 result와 외부의 result는 전혀 다른 변수로 구분되어 사용 가능하게 된다.

 

파이썬에서 함수 내부에서 전역변수를 사용할수 있도록 해주는 방법으로 global이라는 명령어를 제공한다.

함수 내부에서 전역변수를 불러와 사용할 수 있기 때문에 return을 따로 사용하지 않아도 저절로 전역 변수에 함수에 구현한 기능의 결과가 저장되게 된다. 언뜻 보면 굉장히 유용한 방법이라고 생각할 수 있지만 global 명령어는 함수를 통해 다른 데이터를 건드릴수 있는 빌미를 제공하며 함수의 자연스러운 흐름을 바꾸기 때문에 안전하지 않은 명령어 이므로 최대한 사용을 자제해야 한다.

댓글