프로그래밍 언어/파이썬

파이썬 22. 함수-2

닉네임못짓는사람 2020. 11. 4. 14:42
반응형

이번 글에서는 함수에 대해 이어서 알아보도록 하겠습니다.

 

일단 함수의 기본적인 선언 방법부터 코드로 다시 한번 복습해보고 진행하겠습니다.

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