단도직입 파이썬(Python) – 함수 function

반복되는 코드들을 계속해서 작성해야 할 때 함수를 정의해 두고 필요할 때마다 불러서 사용할 수 있는 명령입니다. 예를 들어 커피 자동판매기와 음료수 자동판매기를 만들어야 한다고 가정할 때, 자동판매기의 기본 구조를 함수화 시켜놓는다면 커피가 되었던, 음료수가 되었던, 과자가 되었던 자동판매기를 만드는 게 상당히 간단해질 수 있습니다.
이러한 함수를 이용하여 여러 종류의 자동판매기를 만들었다면, 동전의 크기가 변경되거나 동전에서 지폐로 화폐가 변경되었을 경우 함수의 수정만으로 여러 종류의 자동판매기를 수정하는 효과를 볼 수 있습니다.
예를 들어 a + b를 매번 수행해야 할 때, add라는 임의의 함수를 만들어 사용합니다.
def add (a, b):
return a + b
print(add(1,2))
add란 함수에 매개변수(parameter) a와 b를 입력받아 add에 a+b의 값을 return 시켜 줍니다. print(add(1,2))에서 1과 2는 인수(argument)라 하며 입력값이 됩니다.
함수를 잘 사용하면 코드 전체가 간결하게 보이고 프로그램 전체 흐름을 파악하기가 수월해집니다. 이런 함수들이 모여져 있는 형태를 라이브러리(library) 하며, 파이썬의 경우 코딩이 초보이신 분들도 다양한 분야의 라이브러리를 비교적 쉽게 활용하여 수준 높은 코딩이 가능합니다.
라이브러리 종류
|
설명
|
Numpy
|
고차원의 수학적 기능을 제공하는 오픈 소스
|
Pandas
|
금융데이터 처리용 라이브러리
|
Scikit-learn(sklearn)
|
머신러닝 라이브러리로 딥러닝을 제외한 대부분의 머신러닝 알고리즘 구현 가능
|
Statsmodels
|
통계 관련 라이브러리
|
TensorFlow
|
구글에서 제공하였으며 딥러닝 알고리즘이 구현 가능한 라이브러리
|
이외에도 무수히 많은 라이브러리들이 존재하며, 분야를 막론하고 어떠한 종류의 코딩을 하게 되더라도 이미 잘 짜인 라이브러리가 존재할 가능성이 높습니다. 이렇게 잘 짜인 라이브러리를 이용하여 프로그래밍을 진행한다면 기대하는 수준 이상의 결과물을 만들 수도 있습니다.
매개변수가 없는 함수도 정의할 수 있습니다.
def say():
return ‘hi’
a = say()
print (a)
a에 say 함수의 return 값 ‘hi’ 입력되며, print(a)는 ‘hi’를 출력하게 됩니다.
rerurn이 없는 함수도 정의할 수 있습니다.
def add(a, b):
print(‘%d, %d의 합은 %d입니다.’,%(a, b, a+b))
print(add(1,2))
을 실행하면 아래와 같이 출력됩니다.
1, 2의 합은 3입니다.
None
add란 함수에서 return 되는 값이 없기 때문에 None이 출력됩니다. None = False 임을 다시 한번 기억해 둡니다. 함수에서 결괏값은 오로지 return으로만 돌려받을 수 있습니다.
입력값도 출력값도 없는 함수도 정의할 수 있습니다.
def say():
print(‘hi’)
say()
을 실행하면 hi 을 출력합니다.
매개변수를 지정하여 함수를 불러올 수 있습니다.
def minus(a, b):
return a – b
print(minus(3,5))
print(minus(b=3, a=5))
을 실행하면
-2
2
가 출력됩니다.
입력값의 개수에 제한을 두고 싶지 않을 때 매개변수 앞에 *를 붙여줍니다.

매개변수에 *를 붙이게 되면 인수 값 전체를 튜플로 만들어 줍니다.

매개변수 choice에 add가 입력되면 인수 값 모두 더하게 되고, mul가 입력되면 인수 값 모두 곱하게 된다. 그리고 결괏값 result를 return!!
매개변수에 **를 붙이게 되면 인수 값을 딕셔너리(key=value)로 저장합니다.

만약 return 되는 값이 두 개이면 어떻게 될까요?
def add_mul(a, b):
return a+b, a*b
result = add_mul(2,3)
print(result)
(5, 6)을 튜플로 묶어 출력합니다. 함수는 항상 하나의 값으로 return 시켜줍니다. result1, result2 = add_mul(2, 3)이라 하면 result1 = 5가 되고, result2 = 6이 됩니다.
def add_mul(a, b):
return a+b
return a*b
라고 하면 return a+b를 수행하고, return a*b은 수행하지 않습니다. 결괏값은 5가 됩니다. return이 되면 값을 되돌려 주고 함수에서 빠져나간다는 것을 알 수 있습니다.
for 또는 while 문에서 반복 루틴을 빠져나갈 때 break를 사용한 것과 같이 return을 사용하여 함수를 빠져나오게도 할 수 있습니다.

매개변수에 초깃값을 설정하여 함수를 정의할 수 있다. man=True를 초기설정하였으므로 id(‘철수’,30) 과 id(‘철수’,30, True)는 같은 결괏값을 출력합니다. 여기서 주의해야 할 점은 초깃값이 설정된 매개변수 뒤에는 초깃값 설정이 안된 매개변수가 사용될 수 없습니다.
함수를 사용함에 있어 헷갈려 하는 부분이 함수 내외부에서 사용하는 변수 명의 혼용입니다.

위에서와 같이 a가 정의되지 않았다는 에러가 발생됩니다. 함수 안에서 매개변수 a와 함수 밖에서의 a는 전혀 다른 객체입니다. 함수 안에서 return a를 하고 함수 밖에서 a=test(1), print(a)라고 하면 에러는 사라지며 2가 출력됩니다.
번외로 global 명령어를 사용하여 함수 내외부에서 동일한 변수명을 사용할 수 있으나 권장하지 않는 방법입니다.
a=1
def test():
global a
a += 1
test()
print(a)
에러 없이 2를 출력하게 되지만 권장하지 않는 코딩 방법입니다.^^ 더 쉬워 보일 수 있으나 구조가 더 복잡해질 여지가 많습니다.
def와 동일하지만 함수를 한 줄로 나타낼 때 사용하는 람다(lambda) 예약 명령어를 알아봅니다.
lambda 매개변수 1, 매개변수 2… : 표현식
add = lambda a, b : a+b
result = add(1,2)
print (result)
return 없이 3을 돌려주며 출력 됩니다. (def보다 간단하게 함수를 정의할 수 있겠군요!!)
지금까지의 파이썬의 문법이나 구조가 처음에는 이해하기 쉽지 않은 내용들입니다. 차근차근 시간을 두고 복습하다 보면 익숙해지는 날이 오겠죠! 앞서 언급된 Tensor Flow 관련 사이트를 링크해 봅니다. 재미있는 내용들이 많이 있습니다.
네이버 쇼핑 제품 카테고리 자동 분류도 tensor flow의 도움을 받고 있네요!
TensorFlow
모두를 위한 엔드 투 엔드 오픈소스 머신러닝 플랫폼입니다. 도구, 라이브러리, 커뮤니티 리소스로 구성된 TensorFlow의 유연한 생태계를 만나 보세요.
www.tensorflow.org