반응형

안녕하세요 Hi Create입니다.

드디어 시퀀스 자료형을 끝으로 자료형에 대한 이야기를 끝냈습니다 ㅎㅎ

내용이 굉장히 많은 부분이었지만 머신 러닝같은 분야에서 자주 쓰일 수 있으니 알아두시는 것이 좋습니다.

 

오늘부터는 파이썬에서 함수를 알아보도록 합시다.


우선 함수라는 것은 무엇일까요?

함수는 어떤 기능을 하는 것을 하나로 묶은 단위입니다.

예를 들어 for문이나 while문으로 만들었을때는 반복 수행을 하기는 하지만 임의로 제어 흐름을 바꾸거나 하지는 못합니다. 즉, 코드를 재사용하기 어려울 수 있다는 것이죠. 하지만 함수는 해당 기능을 하는 것을 재사용하기 쉽습니다.

또한, 프로그래머 자신이나 다른 팀원(예를 들어, 기획자나 디자이너 혹은 다른 프로그래머)이 해당 코드를 다시 봤을 때, 논리적인 이해(알고리즘에 대한)가 어려울 수 있습니다. 그래서 독립적으로 기능할 수 있는 부분을 분리하여 함수로 만들어두면 차후에도 이해하기 쉽겠죠.

 

이것은 수학에서도 사용되는 방법과 같습니다.

복잡한 개념이나 식을 단순한 기호로 바꿔쓰죠.

위의 이차방정식에는 2개의 x값이 나올 겁니다.

이것을 구하는 프로그램을 만들어보죠.

import math

x1 = (-b + math.sqrt(b*b - 4*a*c)) / (2.0*a)
x2 = (-b - math.sqrt(b*b - 4*a*c)) / (2.0*a)

이런 식으로 만들 수 있을 것입니다. 하지만 처음 이 코드를 봤다면 이해하기 힘들 수 있습니다.]

그럼 어떻게 간단하게, 이해하기 쉽게 만들 수 있을까요?

 

반복되는 부분을 따로 떼어놓는 것입니다.

위의 코드에서, x1과 x2에 공통된 부분을 찾아보죠.

바로 (b*b - 4*a*c)와 (2.0*a)입니다.

이것을 따로 변수로 만들어버리죠.

D = (b*b - 4*a*c), a2 = 2 * a

이런 식으로 정의하면 어떤가요? 가장 복잡한 부분의 코드를 줄여버릴 수 있겠죠?

import math

D = b*b - 4*a*c
a2 = 2 * a
sd = math.sqrt(D)
x1 = (-b + sd) / a2
x2 = (-b - sd) / a2

코드의 행 자체는 늘어났지만 이해하기는 이게 더 편하겠죠?

이런 식으로 코딩을 할때는 다른 사람이 봤을 때 이해하기 좋은 코드도 필요합니다.


1. 함수 정의하기

그렇다면 본격적으로 python에서 함수를 활용해보도록 하죠.

함수를 호출하는 가장 간단한 방법은 def입니다. 다음 코드를 봅시다

def add(a, b):
	return a+b

def 함수 이름(인수):

      문(statements)

      return 값

의 형식으로 사용합니다.

함수에서 다른 함수를 호출할 수도 있고, 반복문, 조건문 등을 쓸 수 있습니다.

위에서 만든 add함수는 다음과 같이 사용할 수 있습니다.

위처럼 다른 변수에 넣어서 실행시킬 수도 있고, 다른 식에서 바로 사용할 수도 있습니다.

함수를 만들 때는 하나 이상의 문(식 등)을 가져야 합니다.

그래서 빈 함수를 만들고 싶다면 pass를 이용하면 됩니다.

def A():
    pass

2. 함수로 리스트, 튜플 제어(1)

이번에는 함수로 리스트나 튜플을 제어하는 예제를 만들어봅시다.

다음은 간단한 회원 가입자 리스트를 만드는 함수입니다.

def add_member(memberlist, newmember):
    if newmember not in memberlist:
        memberlist.append(newmember)
    else:
        print("이미 있는 회원입니다.")
add_member(memberslist, 'Kim')

이 함수에서 인수는 memberlist와 newmember가 있습니다.

memberlist에서는 어떤 리스트에 넣을지를 결정하고 newmember에는 리스트에 넣을 이름을 넣죠.

리스트에 없는 이름이라면 저장하고 있는 이름이라면 저장하지 않습니다.

제대로 실행이 되죠. 하지만 이것은 하나하나 일일이 입력해야 하는 형태입니다.

회원 리스트나 튜플을 한 번에 넣어보죠.

이렇게 하니 리스트나 튜플로 된 멤버 리스트도 한꺼번에 넣을 수 있게 되었죠?

우선 함수 첫 부분에 있는 if문은 변수 newmembers가 리스트나 튜플이 아닐 때, 리스트로 바꿔주는 부분입니다.

그러고 나서 for문을 통해 newmembers에 들어온 요소들을 하나씩 검사하고 넣는 것입니다.

그렇다면 함수에서 다른 함수를 호출하는 것도 한 번 써보도록 하죠.

이번에는 완료 메시지를 담당하는 함수를 만들어보도록 합시다.

 

3. 함수에서 다른 함수 호출하기

다른 함수를 호출할 때도 똑같은 방법을 사용하면 됩니다.

def A(x, y):
    return x + y

def B(x, y):
    if x != 0:
        A(x,y)

이때 볼 수 있는 것이 인수를 전달하는 방법이다.

아래의 코드를 보자.

이 코드를 보면 함수가 값에 의한 호출처럼 보일 수 있지만 레퍼런스에 의한 호출입니다.

즉, 값의 주소를 참조하여 호출된다는 뜻입니다. 그래서 변수 a가 100에서 1로 바뀌어야 할 것 같지만 100으로 나오는 것입니다. return을 넣어도 결과는 같습니다.

그 이유는 아까도 말했듯이 레퍼런스 때문입니다.

레퍼런스(reference)는 참조한다는 뜻으로 함수 f를 호출하면 잠시 a가 갖고 있는 객체를 참조하게 됩니다

위 그림은 함수 f가 호출된 직후 100이라는 객체의 레퍼런스를 t가 잠시 갖게 되는 모습입니다.

이 직후에 t=1이라는 문에 의해 t가 1이라는 객체의 레퍼런스를 갖게 됩니다. 그럼 a자체는 원래의 레퍼런스인 100을 갖고 있게 됩니다. 그렇기 때문에 a값은 변화가 없는 것입니다.

 

오늘은 여기서 마치도록 하겠습니다.

함수 또한 쓰이는 곳이 많습니다. 대부분의 프로그래밍을 함수를 이용해서 하니까요...

그만큼 함수의 활용도가 높다는 것입니다. 그래서 함수는 양이 꽤 많습니다. 힘내서 끝까지 보시기를 바랄게요 ㅜㅜ

반응형

BELATED ARTICLES

more