이번 글에서는 함수에 대해 이어서 알아보도록 하겠습니다.
일단 함수의 기본적인 선언 방법부터 코드로 다시 한번 복습해보고 진행하겠습니다.
def addF(a, b):
return a + b
sum = addF(10, 20)
print(sum)
위와 같이 코드를 작성해주시면 addF라는 함수명으로 함수를 작성하여, 매개변수 a, b를 사용합니다.
이 함수는 프로그램 내의 다른 함수에서 호출할 수 있고, addF함수 내에서도 호출할 수도 있습니다.
반면, 위의 함수와는 다르게 입력값, 반환값이 없는 함수도 존재합니다.
def printHello():
print("Hello World!")
printHello()
이렇게 매개변수, 반환값이 없는 함수를 작성할 수도 있습니다.
이렇게 간단하게 복습을 끝냈으니 이제 함수의 활용방법을 자세히 알아보도록 합시다.
매개변수에 default값 설정
함수를 호출할 때 addF(10, 20)과 같이 매개변수에 대입할 값을 인수로 주어야 한다는 것은 이미 이야기했었습니다.
그런데 이때 값을 인수로 주지 않아도 미리 정해놓은 특정한 값(default)이 매개변수에 대입되도록 하는 방법이 있습니다.
길게 말할 것 없이 바로 코드로 확인해봅시다.
def addF(a, b = 10):
return a + b
print(addF(10))
print(addF(10, 20))
이렇게 default값을 설정하고 싶은 매개변수에 (= default값)을 적어주시면, 인수를 주지 않았을 때 자동으로 그 값이 대입됩니다.
위의 코드에서는 b의 default값을 10으로 설정해놓았는데, 첫 번째 출력에서 b의 인수를 주지 않은 경우
10+10이 되어 결과 20이 출력되었고, 두 번째 출력의 경우 b의 인수를 20으로 주어서 10+20이 되어 결과가 30이 출력되었습니다.
그런데 이 default를 사용할 때 주의할 점은 default를 설정할 매개변수는 맨 끝에 두어야 한다는 점입니다.
예를 들어 위의 코드를 아래와 같이 바꿔봅시다.
def addF(a = 10, b):
return a + b
print(addF(10))
print(addF(10, 20))
해당 코드를 실행하면 위와 같은 오류가 발생하게 되는데, default값을 설정해 놓은 매개변수 뒤에
default를 설정해놓지 않은 매개변수를 사용할 수 없다는 오류 메시지입니다.
따라서 default설정 시에는 반드시 default를 설정한 매개변수들이 설정하지 않은 매개변수들의 뒤에 위치하도록 해줘야 합니다.
정해지지 않은 여러 개의 입력을 받을 때
다음은 함수에 인수를 넘겨줄 때 일정한 수가 아닌 호출 때마다 자신이 원하는 만큼 인수를 주고 싶은 경우입니다.
def addF(*values):
print(type(values))
print(values)
res = 0
for i in values:
res += i
return res
print(addF(10, 20, 30, 40))
print(addF(10, 20, 30, 40, 50, 60, 70))
이렇게 정해지지 않은 수의 인수를 넘겨주고 싶을 때에는 매개변수 앞에 (*)를 붙여주시면 되는데,
그러면 이 인수들을 모두 모아서 하나의 튜플 객체로 만들어줍니다.
위의 코드로 확인할 수 있듯이 values의 type을 확인해보면 튜플이라고 나오는 것을 볼 수 있습니다.
변수의 영역
함수를 설명하면서 꼭 짚고 넘어가야 할 점이 바로 함수 내에서 사용하는 변수의 영역입니다.
예를 들어 아래와 같은 코드가 있다고 생각해봅시다.
def fun1():
var1 = 5
var1 = 10
위의 코드에서 var1이라는 변수 두 개가 있습니다. 이때 두 변수는 과연 같은 변수일까요?
결론부터 말하자면 둘은 서로 다른 변수입니다.
프로그래밍 언어에서 변수들은 각각 자신들이 속하는 영역이 존재합니다.
변수는 이 영역 안에 존재하면서 각각 자신이 속한 영역의 범위에 따라 부르는 호칭이 달라집니다.
위의 두 변수의 경우 서로 다른 함수에 속해 있으면서, 그 함수 내에서만 사용되고 '지역변수'라고 불립니다.
이 '지역변수'들은 해당 함수 실행 시 메모리 공간을 할당받고 함수 내에서만 사용할 수 있습니다.
그리고 해당 함수가 종료되면 메모리 공간에서 사라지게 됩니다.
def fun1():
var1 = 5
print(var1)
때문에 위와 같이 fun1에서 var1이라는 변수를 선언하고, 이를 다른 함수에서 사용하려고 해도 오류가 발생합니다.
이렇게 함수 안에 종속되는 변수가 있다면, 함수에 종속되지 않고 사용할 수 있는 변수도 있지 않을까요?
이 변수들은 보통 '전역변수'라고 부릅니다.
이 '전역변수'들은 선언 자체는 함수 내에서 하지만 프로그램이 실행됨과 동시에 메모리 공간을 할당받으며,
프로그램이 종료되면 메모리 공간에서 사라집니다.
또한 '전역'이라는 이름답게 하나의 함수에 종속되는 것이 아니라 프로그램 내의 어느 곳에서나 사용할 수 있습니다.
코드를 통해서 '전역변수'를 선언하는 방법을 알아봅시다.
def fun1():
global var1
var1 = 5
print(var1)
방법은 아주 간단한데, 변수 앞에 global을 붙여주기만 하면 됩니다.
그러면 이 변수는 전역변수가 되어 프로그램 내의 어느 함수에서나 접근할 수 있게 됩니다.
그런데, 이렇게 전역변수를 선언하고 보니 한 가지 의문점이 생기게 됩니다.
과연 하나의 함수 안에서 동일한 이름의 전역변수와 지역변수를 같이 사용하면 어떻게 될까요?
아래와 같은 경우를 생각해봅시다.
def fun1():
global var1
var1 = 5
var1 = 10
print(var1)
이렇게 전역변수 var1과 지역변수 var1이 있을 때 과연 출력되는 것은 어떤 변수일까요?
정답은 '지역변수'입니다. 하나의 함수 내에서 지역변수와 전역변수를 함께 사용하게 되면, 함수는 기본적으로 지역변수를 우선합니다.
때문에 지역변수와 전역변수를 사용할 때 어떤 변수가 우선되는지 주의하셔야 합니다.
물론 가장 좋은 방법은 두 변수의 이름을 서로 다르게 하는 것이겠죠.
이번 글은 이 정도로 마치도록 하겠습니다.
감사합니다.
'프로그래밍 언어 > 파이썬' 카테고리의 다른 글
파이썬 24. 클래스-1 (0) | 2020.11.11 |
---|---|
파이썬 23. 파일 입출력 (0) | 2020.11.10 |
파이썬 21. 함수-1 (0) | 2020.11.03 |
파이썬 20. 반복문-while문 (0) | 2020.11.02 |
파이썬 19. 반복문-for문 (0) | 2020.10.29 |