언어/파이썬

파이썬 어디까지 파봐썬9강(2)_변수의범위&재귀호출(알고리즘반복)

디지털랫드 2024. 2. 24. 20:16

2. 변수의 범위(variable scope)

파이썬에서는 변수의 선언 위치에 따라 변수가 영향을 미치는 범위가 달라집니다.
변수의 범위에 따라 지역 변수 전역 변수로 나눠집니다.

1) 지역 변수(local variable)


함수는 동작에 필요한 변수를 얼마든지 사용할 수 있는데, 함수 내부에서 선언하는 변수를 지역 변수 라고 합니다.

앞서 만든 함수 sum_nums에서 누적 합을 저장하기 위해 sum이라는 변수를 사용했었습니다.
 sum변수는 함수 내에서 선언했기 때문에 지역 변수입니다.

 
 
코드 실행

지역 변수는 함수 안에서만 사용될 뿐 밖으로는 알려지지 않습니다. 다음 예시로 확인해보겠습니다.

 
 
코드 실행
망고
 
 

mango함수 안에서 temp 지역 변수에 '망고' 를 대입하고 출력했습니다.
함수를 호출하면 mango은 내부적으로 temp 변수를 만들고 사용한 다음에 함수가 종료되면 사라집니다.
그렇기 때문에 함수 밖에서 temp 변수를 출력하려고하면 존재하지 않는다는 에러가 뜨게 되는 것입니다.

지역 변수를 사용하는 이유는 함수에 필요한 모든 것을 내부에 포함시켜 독립성을 향상 시키기 위함입니다.
또 지역 변수는 함수 동작에 필요한 모든 것을 내부에 완벽하게 소유할 수 있도록 하여 재활용성이 향상됩니다.

2) 전역 변수(global variable)


지역 변수와 반대로 함수 바깥에서 선언하는 변수를 전역 변수 라고 합니다.
전역 변수는 지역 변수와 달리 어디에서나 참조 할 수 있습니다.
할인율이 정해지면 할인 이후 가격을 바로 출력 해주는 함수를 만들어서 보겠습니다.

 
실행 완료
오늘 할인율은 15.0 % 입니다.
 
 
코드 실행
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_13/2272607491.py in <module>
----> 1 cal_price(10000)

NameError: name 'cal_price' is not defined

여기서 sale_rate이 전역 변수 입니다. 그렇기 때문에 두 개 함수에서 모두 참조할 수 있었습니다.
간단하게 sale_rate를 바꾸고 두 함수의 결과를 확인해보겠습니다.

 
코드 실행
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_13/1655921043.py in <module>
      1 sale_rate = 0.3
      2 
----> 3 notice()
      4 cal_price(10000)

NameError: name 'notice' is not defined

전역 변수가 변함에 따라 함수의 결과값도 변하게 됩니다.

 

 

3. 함수에서 재귀 호출 사용하기

1) 재귀 호출이란?


함수 안에서 함수 자기자신을 호출하는 방식을 재귀호출(recursive call)이라고 합니다.
자주 쓰이지는 않지만 추후에 알고리즘을 구현할 때 매우 유용합니다. (알고리즘에 따라서 반복문으로 구현한 코드보다 재귀호출로 구현한 코드가 직관적이고 이해하기 쉬운 경우가 많습니다.)

재귀호출 코드는 간단해 보이지만 초보자들은 한 번에 이해 되지 않을 수 있습니다.
그러니 '한 번에 이해할거야!'라는 생각보다 '또 볼거고 복습도 할거니까 힘 풀고 봐야지' 하는 생각으로 따라와주세요.

먼저 간단한 재귀호출을 만들어 보겠습니다.

 
 
실행 완료
 

처음에는 반복문에서 배웠던 무한루프처럼 계속되려나 싶지만 어느 순간에 에러가 발생합니다.
왜냐하면 파이썬에서 최대 재귀깊이가 1,000으로 정해져 있어서 그렇습니다.

그러니 재귀 호출이 1,000까지 가지 않도록 종료 조건을 반드시 만들어주어야 합니다.
위의 hello 함수에 종료 조건을 포함하도록 수정해보겠습니다.

 
 
실행 완료
Hello, world! 3
Hello, world! 2
Hello, world! 1

매개변수를 추가하고 매개변수에 조건문을 걸어 종료 조건을 만들어줬습니다.