수학에서 함수는 "어떤 집합의 각 원소를 다른 집합의 유일한 원소에 대응시키는 이항 관계"를 의미한다.
즉 집합 X 의 원소 x 하나에 집합 Y 의 원소 y 하나가 대응하는 관계를 의미한다.
그렇다면 프로그램을 개발할 때의 함수란 무엇일까?
출처 : https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98
프로그램의 기능이 다양해질수록 점점 커지고 복잡해진다.
그래서 우리는 "함수 Function" 단위로 쪼개에서 코드를 짜볼 것이다.
반복적으로 사용하는 코드를 덩어리로 묶어서 함수로 만들 수 있다.
프로그램에서 함수는 레고 블록에 비유할 수 있다.
레고 블록에서는 하나의 블록을 다른 블록과 연결할 수 있으며, 이러한 조합을 통해 원하는 모양을 만들 수 있다.
파이썬에서는 def 키워드를 이용하여 함수를 정의할 수 있다.
함수가 정의되면 우리는 함수를 사용할 수 있고, 이것을 함수를 "호출" 한다고 한다.
간단한 예제를 통해서 살펴보자.
def print_hello():
print('Hello')
print('Nice to meet you')
print('What your name?')
print_hello() # 정의한 함수를 호출
def "함수명" 을 입력하면 함수를 정의할 수 있다.
위 예제에서는 print_hello() 라는 이름의 함수를 만들었고,
콜론(:) 은 그 뒤에 코드 블록이 이어서 등장한다는 것을 의미한다.
이후 등장하는 코드들은 반드시 들여쓰기를 해야한다.
print_hello() 라는 함수를 정의한 후, print_hello() 를 적어주었다.
이렇게 함수 이름을 적어주는 것을 "함수 호출 Function call" 이라고 한다.
함수를 호출하면 함수가 실행되고 다음과 같이 실행결과가 표시된다.
함수를 사용할 때 우리는 함수 외부에서 함수 안으로 데이터를 전달할 수 있다.
이 데이터를 우리는 "인자 argument" 라고 부른다.
앞선 예제를 조금 수정하여 함수를 호출하면서 인자를 전달하는 예제를 만들어보자.
def print_hello(name):
print('Hello')
print('Nice to meet you')
print('My name is', name)
print_hello('twix') # 정의한 함수를 호출
위 예제를 살펴보면 함수 이름 뒤의 소괄호 안에 name 이라는 변수가 있는 것을 확인할 수 있다.
함수를 호출할 때 괄호 안에 넣어준 'twix' 라는 문자열이
함수 내부의 name 이라는 변수에 전달되는 것이다.
함수 호출 시 전달되는 실제 값을 "인자 argument" 라고 하고,
함수 내부에서 전달받는 변수를 "매개변수 parameter" 라고 한다.
매개변수는 여러 개를 선언할 수도 있다. 즉, 함수를 호출할 때 하나가 아닌 여러 개의 값을 넘겨줄 수 있다는 것이다.
다만 함수를 호출할 때 주의할 점은, 인자의 개수와 매개변수의 개수는 일치해야 한다는 것이다.
이번엔 함수를 호출하고, 함수가 실행된 뒤에 되돌아오는 "반환 값 return value" 에 대해서 알아보자.
함수가 유용한 것은 함수가 주어진 일을 하고 우리에게 뭔가를 되돌려 보내준다는 점이다.
수학에서 함수의 정의가 그렇듯, 입력 값이 존재하면 출력값이 존재한다.
물론 모든 함수가 반환 값을 가지고 있는 것은 아니지만, 우리는 함수를 호출하고 반환 값을 받아서
이를 유용하게 사용할 수 있다.
함수가 내부의 값을 외부로 보낼 때는 return 키워드를 사용한다.
원의 반지름을 인자로 전달하면, 원의 면적을 계산해서 반환하는 함수를 작성해보자.
def calculate_area(radius):
area = 3.14 * radius**2
return area
c_area = calculate_area(5.0) # calculate_area() 함수가 계산한 값을 c_area에 저장
print('반지름이 5.0 인 원의 면적은 :', c_area)
위 코드를 살펴보면 calculate_area() 함수는 내부에서 원의 면적 값을 계산한 후 이를 반환하고 있다.
그리고 이 반환 값은 c_area 라는 변수에 저장된다.
함수가 반드시 return 문을 가져야 하는 것은 아니지만, 이와 같이 return 문을 이용하여
함수에서 어떤 일을 수행하고 특정 값을 반환시킬 수 있다.
또한 여러 개의 값을 반환하는 것도 가능하다.
다음 예제를 간단히 살펴보자.
def sort_num(n1, n2): # 2개의 값을 받아오는 함수
if n1 < n2:
return n1, n2 # n1이 더 작으면 n1, n2 순서로 반환
else:
return n2, n1 # n2가 더 작으면 n2, n1 순서로 반환
print(sort_num(110, 210)) # 110과 210을 함수의 인자로 전달하고 반환되는 값을 출력
print(sort_num(2100, 80))
sort_num() 함수는 두 개의 인자를 받은 후, 이 두 값을 비교하여 이들 값 중에서 작은 값과 큰 값을 순서대로
반환하는 함수이다. 이 때 반환되는 데이터는 "튜플 자료형"인데, 이에 대해서는 다음 장에서 다뤄보자.
위에서 알 수 있는 점은, return 문을 이용해서 하나의 데이터가 아니라 여러 개의 데이터도 반환할 수 있다는 점이다.
위 함수를 실행시킨 결과를 보면 다음과 같다.
이제 함수에 대한 기본적인 이해는 끝났으리라 생각된다.
이번에는 변수의 사용 범위에 대한 얘기를 하고자 한다.
다음 코드를 먼저 한 번 살펴보자.
def print_counter():
counter = 200
print('counter =', counter) # 함수 내부의 counter 값
counter = 100
print_counter()
print('counter =', counter) # 함수 외부의 counter 값
counter 라는 변수를 함수 외부에서 생성한 후 100이라는 값을 할당했다.
그리고 함수 내부에서 counter 라는 변수에 200이라는 값을 할당했다.
함수 내부에서 print() 를 이용해 counter 변수의 값을 출력하고,
함수 외부에서 똑같이 counter 변수의 값을 출력했다.
그렇다면 함수 외부와 내부 모두 200이 출력될까?
결과는 위와 같다.
함수 내부에서는 200이 출력되지만 함수 외부의 값은 여전히 100이다.
그 이유는 함수 안에서 생성되는 변수를 우리는 "지역변수 local variable" 이라고 하는데,
함수 내부의 counter 라는 변수와 함수 외부의 counter 라는 변수는 각각 별개의 메모리에 존재하기 때문이다.
즉, 이름만 같고 다른 변수라는 뜻이다.
함수 내부의 지역변수는 함수가 종료되면 사라진다.
따라서 counter 변수를 함수의 외부에서 출력할 경우 200이 아닌 100이 출력되는 것이다.
그렇다면 함수 내부에 새로 변수를 만들지 않고 함수 외부의 counter 변수를 불러서 사용하려면 어떻게 해야 할까?
바로 "global" 이라는 키워드를 이용하면 된다.
함수 내부에서 counter 변수를 사용하기에 앞서 global counter 와 같이 변수 앞에 global 키워드를 붙여주면
함수 외부의 전역변수 counter 를 사용하겠다는 선언이 된다.
다만 전역변수를 많이 사용할 경우 프로그램의 어느 부분에서 오류가 발생했는지 추적하기가 매우 어렵다.
따라서 전역변수의 사용은 최소로 하는 것이 바람직하다.
이번 장에서는 함수에 대해 알아보았다.
프로그램이 복잡해질수록 기능마다 함수로 따로 빼서 구현하는 것이 바람직하다.
함수는 프로그래밍에서 꼭 필요한 존재이기 때문에 더 확실히 알아야 한다는 것을 느꼈다.
앞 장들에서 코딩했던 간단한 예제들을 함수 기반으로 다시 코딩해보자.
꾸준히 연습해져서 함수에 익숙해질때까지 !
출처 : 따라하며 배우는 파이썬과 데이터 과학 - 천인국, 박동규, 강영민