Coding Diary.

(파이썬) def 함수 정의하고 호출하기, 변수 범위 본문

Coding/Python

(파이썬) def 함수 정의하고 호출하기, 변수 범위

life-of-nomad 2024. 6. 11. 10:06
728x90
반응형

 

함수를 사용하려면 먼저 함수가 어떤 역할을 하는지, 어떤 입력값이 필요할 수 있는지를 정의해야 합니다. 함수 안에 있는 코드는 우리가 그 함수를 호출하거나 사용할 때만 실행됩니다. 이번 글에서는 함수를 def로 정의하고 호출하는 방법에 대해 알아보겠습니다.

 

1. 함수 정의하기

  • 먼저, 예시로 실린더의 부피를 계산하는 함수를 만들어보겠습니다. 
def cylinder_volume(height, radius):
    pi = 3.14159
    return height * pi * radious ** 2
  • cylinder_volume 함수를 정의한 후에 아래와 같이 그 함수를 호출할 수 있습니다.
cylinder_volume(10, 3)

1) 함수 header

  • 위 구문을 자세히 살펴보겠습니다.
  • 함수 헤더는 항상 키워드 def로 시작하고 이것이 함수 정의(function definition)임을 나타냅니다.
  • 그 다음에는 함수 이름이 나옵니다. 여기서는 cylinder_volume입니다.
  • 이름 바로 뒤에는 괄호가 나오고, 그 안에는 쉼표로 구분한 인수가 있을 수 있습니다. 여기서는 (height, radious)입니다.
  • 인수 또는 매개변수는 함수를 호출할 때 넣는 값이며 그 인수들을 함수 본문에서 사용합니다.
  • 함수가 인수를 받지 않으면 괄호 안을 비워둡니다. 
  • 헤더는 항상 : 로 끝납니다.

2) 함수 body

  • 함수의 바디는 헤더 줄 뒤에서 들여쓰기를 한 코드입니다. 여기서는 pi를 정의하고 부피를 return 하는 두 줄입니다.
  • 바디 안에서 인수 변수를 참조하고 새로운 변수를 정의할 수 있습니다. 
  • 그 변수들은 들여쓰기를 한 줄 안에서만 사용할 수 있습니다.
  • 바디에는 함수의 출력값을 그 함수를 호출한 구문에게 반환하는 return 문이 포함되어 있습니다.
  • return 문은 키워드 return 뒤에 계산을 통해 그 함수의 출력값을 받는 식을 써서 작성합니다.
  • return 문이 없을 경우에는 함수가 그냥 None을 리턴합니다.

 

2. 함수에서 print와 return의 차이점

  • print는 콘솔에 출력을 제공하는 반면, return은 값을 저장하며 나중에 작업하고 코딩할 수 있는 값을 제공합니다.
  • 아래의 예시를 보겠습니다.
def add_ten(num):
    print(num + 10)
    
def add_ten(num):
    return(num + 10)

 

  • 위의 두 함수를 print 해보겠습니다.
return_value_1 = show_plus_ten(5)
print('This function returned: {}'.format(return_value_1)

>>> 15
    This function returned: None
return_value_2 = add_ten(5)
print('This function returned: {}'.format(return_value_2))

>>> This function returned: 15

 

3. 기본 인수(default)

  • 함수에 기본 인수를 추가해서 함수 호출에서 지정하지 않은 매개변수의 기본값을 설정할 수 있습니다.
def cylinder_volume(height, radius=5):
    pi = 3.14159
    return height * pi * radius ** 2
  • 이런 식으로 radius의 디폴트 값을 5로 설정합니다.
print(cylinder_volume(10, 5))
print(cylinder_volumne(10))

>>> 782.8975
    782.8975

 

  • 따라서 위의 두 값은 같습니다.
  • 또한, 위 코드에서 위치를 이용하여 인수에 값을 전달하고 있습니다. 
  • 값은 위치를 이용하거나, 이름을 이용하여 전달할 수 있습니다. 
  • 따라서 아래의 함수 호출들은 모두 같은 식으로 평가됩니다.
cylinder_volume(10. 7)
cylinder_volume(height=10, radius=7)
  • 또한, readable_timedelta 함수를 만들어서 10일이 몇 주 몇 일인지 알아보는 함수를 만들어 보겠습니다.
def readable_timedelta(days):
    weeks = days // 7
    remainder = days % 7
    return "{} week(s) and {} day(s).".format(weeks, remainder)
    
print(readable_timedelta(10))
>>> 1 week(s) and 3 day(s).

 

4. 변수 범위(variable scope)

  • 변수 범위 : 프로그램에서 변수를 참조하거나 사용할 수 있는 부분을 나타냅니다.
  • 함수에서 변수를 사용할 때는 반드시 범위를 고려해야 합니다.
  • 함수 내에서 변수를 만들었다면, 그 변수는 해당 함수 내에서만 사용할 수 있습니다.
  • 그 함수 외부에서는 그 변수에 액세스할 수 없습니다. 
def some_function():
    word = "hello"
    
print(word)
# 오류가 납니다.
  • word 변수는 각 함수에만 한정된 로컬 범위를 갖습니다. 즉 다른 함수에서도 변수에 word를 사용할 수 있습니다.
def some_function():
    word = "hello"
    
def another_function():
    word = "goodbye"
  • 반면, 함수 외부에서 정의한 변수는 함수 안에서도 액세스할 수 있습니다. 
  • 아래의 코드에서  word 는 전역 범위를 갖습니다.
word = "hello"

def some_function():
    print(word)
  • 하지만 전역 범수의 값은 함수 안에서 변경할 수 없습니다. 
  • 만약, 함수 안에서 그 변수의 값을 변경하려면 그 변수를 인수로써 함수에 전달해야 합니다.
egg_count = 0

def buy_eggs():
    egg_count += 12  # purchase a dozen eggs
    
buy_eggs()
  • 위의 예에서 첫 줄에 있는 변수 egg_count가 전역 범위를 갖기 때문에 이 코드는 UnboundLocalError를 냅니다.
  • 변수가 인수로서 함수에 전달되지 않았으므로 함수는 참조되고 있는 egg_count를 전역 변수로 간주합니다.
  • 아래와 같이 하면 오류가 해결됩니다.
egg_count = 0

def buy_eggs(count):
    return count + 12 
    
egg_count = buy_eggs(egg_count)
728x90
반응형