컴퓨터 사이언스 부트캠프 with 파이썬

5장 함수

1. 자료구조

1.1 자료 구조 미리 엿보기

함수의 작동 원리를 이해하려면 스택의 개념을 반드시 알아야한다. 스택은 접시쌓기와 같은데, 데이터를 저장할때 접시처럼 차곡차곡 쌓아 올리고, 꺼낼때 맨위부터 차례차레 내린다. 즉 마지막에 들어온 데이터가 가장 먼저나간다.

1.2 전역 변수와 지역 변수

전역 변수(global variable) - 전체 영역에서 접근 할 수 있는 변수이다.

지역변수(local variable) - 특정 지역에서만 접근 할 수 있는 변수이다.

파이썬에서는 global함수를 통해서 함수안에서도 전역변수 변경이 가능하다.

nonlocal함수를 사용하면 외부함수의 값도 내부함수에서 변경이 가능하다.

2. 인자 전달 방식에 따른 뷴류

함수는 인자(argument) 전달 방식에 따라 크게 값에의한 전달(call by value)과 참조에 의한 전달(call by reference)로 나누어진다.

2.1 값에 의한 전달 (call by value)

파이썬은 값에 의한 전달 방법을 사용하지 않기 때문에 C++코드를 통해 이해 하여야한다. 값에 의한 전달이란 한 함수에서 설정한 변수를 다른 함수에서 호출할때, 그 함수자체를 가져오는게 아니라, 변수 자체를 복사해와서 값을 이용한다. 따라서 각 함수에서 설정하거나 변경한 변수의 값은 특별한 설정(참조에 의한 전달방법)이 없는한 서로 영향을 주지 않는다.

2.2 참조에 의한 전달(call by reference)

참조에 의한 전달은 인자를 전달할 때 값을 전달하는게 아니라 참조(주소)를 전달한다. C++에서는 포인터를 이용한다 (*와 &) *은 해당 주소에 있는 값을 표시하는 포인터이며, &는 해당 주소값 그 자체를 표시하는 포인터이다. 따라서 *x나 &x 는 해당 값에 대한 주소데이터를 가지고있다. 따라서 각 함수에서 설정하거나 변경한 변수의 값들은 서로 영향을 주게된다.

2.3 객체 참조에 의한 전달(call by object reference)

일반 적인 언어는 값의 의한 전달이나 참조에 의한 전달 방식을 사용하나, 파이썬은 위 두 전달 방식이 아닌 ‘객체 참조에 의한 전달’방식을 사용한다.

이는 파이썬의 가장 큰 특징중에 하나인데, 파이썬의 변수는 C언어처럼 변수라는 메모리 공간에 값을 직접 저장하지 않고, 상수 객체를 가르키는 형식으로 구현된다.

쉽게 말해 처음 변수를 임의로 지정하더라도 그 변수는 해당 값을 가지고 있는게 아닌 해당 값을 가지고 있는 주소를 지칭한다.

  • 파이썬은 레퍼런스 카운팅으로 가비지 컬렉션(힙에 저장된 안쓰는 메모리)를 정리한다. 변수나 함수가 어떠한 객체를 참조할때마다 카운트가 올라가며, 참조가 없어질때마다 카운트가 내려가 0이되면, 메모리에서 해제된다.

이러한 특성으로 인해 함수 인자로 변경 불가능 객체를 전달해 값을 변경할 수 없다. 그 이유는 함수 안에서 새 객체를 만든 다음 참조하여 바꾸려 하면 함수 호출이 끝나고 스택 프레임이 사라지면서 참조도 사라지기 때문이다. 이를 해결하는 방법은 return함수를 이용하면 된다.

3. 람다 함수

람다 함수는 이름이 없는 함수이다. 다회성으로 사용할 함수가 아니라면 람다함수로 만들어 사용하여 메모리의 효율성을 늘릴 수있다.

람다함수는 return 문이 없으며, 몸체에 반드시 식이 들어가야한다.