목록파이썬 (29)
개발자 블로그

함수가 호출되어 저장되어 사용되는 곳이 스택 메모리 영역이다. 재귀함수는 함수가 호출 되면서 함수 자기 자신을 또 다시 호출하는 방식으로 재귀함수 호출 시 스택 메모리에 호출 된 함수들이 계속 쌓이게 된다. 스택은 LIFO(선입선출) 구조이기 때문에 가장 마지막에 호출된 함수 factorial(1)를 먼저 완료하고, 값을 아래로 전달하여 최초로 호출된 함수 factorial(3)가 최종 값을 계산한다. 따라서, 재귀함수를 호출할 때 스택 메모리 공간이 초과되는 스택 오버플로우가 발생되는 오류를 주의하며, 과도한 스택 메모리가 사용되지 않도록 조심하며 사용해야한다.

함수를 정의하고, 파라미터의 기본값을 정의를 하는 경우가 많다. 하지만, 사용 시 주의 사항이 있다. mutable 한 객체를 함수의 디폴트 파라미터로 사용하지 말라는 것이다. 예제를 통해 살펴보자! def add_sharp(s = []): s.append('#') return s s = [1, 2, 3] print(add_sharp(s)) # [1, 2, 3, '#'] print(add_sharp()) # ['#'] print(add_sharp()) # ['#'] print(add_sharp()) # ['#'] 우리가 예상한 결과값은 주석 처리를 한 값이다. 하지만, 실제 결과값은 그렇지 않다. 파이썬에서 함수의 디폴트 인자들은 __defaults__ 또는 __kwdefaults__ 어트리뷰트의 저장된..
파이썬 메모리 구조 Text 영역: 코드 영역이라고 하며 실행할 프로그램의 코드가 저장되는 영역이라고 한다. CPU는 텍스트 영역에 저장 된 명령어를 하나 씩 처리한다. Data 영역: 전역 변수와 정적 변수 즉, globals()에 등록된 변수를 저장하는 영역이며, 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다. Stack 영역: 지역 변수(함수 내부 변수)와 매개변수 즉, locals()에 등록된 변수를 저장하는 공간이다. 그러므로 당연히 함수가 실행이 될 때 함께 할당이 되고 함수가 종료되면 소멸된다. Heap 영역: 사용자의 동적 할당으로 생성되는 영역이며, 사용자가 공간의 크기를 직접 관리할 수 있다고 한다. 해당 영역의 크기는 프로그램이 실행되는 도중인 런타임 동안 사용자가 직접..

전역 변수는 주로 변하지 않는 고정 값에 사용 지역 변수는 사용 이유: 지역 변수는 함수 내에 로직 해결에 국한, 소멸주기: 함수 실행 해제 시 내가 선언한 변수의 스코프는 적절한지 알고 사용하자. 한번만 선언해도 참조하여 쓸 수 있었는데 여러 곳에서 산발적으로 선언하여 메모리를 불필요하게 사용하진 않았는지 이러한 성능에 대한 고민을 할 필요가 있다. Global 전역 변수를 지역 변수 스코프에서 수정을 하려고 하면 UnboundlocalError를 만난다. 그럴 때 해당 변수를 global로 해당 변수를 지역 내로 불러와 사용할 수 있다. 하지만, 전역 변수를 지역 내에서 수정 되는 것은 지양해야한다. 코드의 수가 몇만줄 또는 여러 사람들과 협업을 해야할 시 다소 혼잡성을 야기할 수 있다. Nonloc..
장고의 프로젝트를 하며 메소드를 커스텀 할 일이 많았다. 기존의 예를 들어 시리얼라이즈의 update 함수를 커스텀 할 때, 기존의 인스턴스를 받아 사용자로 부터 받은 값들을 변경 해주어야하는 함수를 만드는 과정에서 아래와 같은 함수를 알면 좀 이해의 도움이 된다. 그리고 이 외에도 객체의 속성값에 직접 접근하여 값을 수정 및 반환할 수 있지만, 메소드를 사용하여 어트리뷰트의 접근하는 이유는 객체의 본질을 깨지 않게 하기 위함으로 객체가 쉽게 변형이 되지 않게 하기 위함이다. 1. getattr(object, attribute_name [, default]) 매개변수로는 객체와 속성 값의 이름, default를 설정할 수 있고, 해당 어트리뷰트의 value를 가져오는 함수이다. 해당 필드가 없다면 디폴트..
eval 함수란 ? String type의 expressions의 실행 결과를 반환하는 함수 기업 코테를 보다 '34+41-213' 과 같은 부분이 있었다. 정규표현식을 활용해서 숫자와 연산자를 나눈 다음...인덱스를 비교해서 연산을 처리하면... 하지만 이런 생각을 쉽게 구현해줄 수 있는 함수이다. 공식문서 링크 해당 링크를 통해 사용할 때 참고하도록 하자!

개발을 하다보면 import를 사용할 일이 정말 많다. 해당 파일에서 다른 파일에 있는 객체를 가져와 사용하고 싶을 때, 물론 사용할 객체를 한 파일에 있으면 import를 사용할 일은 없다. 하지만 서비스와 비즈니스 모듈을 나누고 또 테스트를 사용하고 등등 여러가지 이유로 우리는 여러 파일을 나누고 불러와 사용하는 일이 빈번하다. 그럴 때 의도하지 않는 것도 실행이 될 수도 있다. 해당 파일에 필요한 것만 가져와 사용하고 싶은데... 그럴 때 __name__ 이란 변수의 성질을 잘 알고 사용한다면 우리는 이러한 불편함을 해결할 수 있다. __name__ 란? __name__은 파이썬 파일을 실행하면 자동으로 생성이 되는 변수이다. 그렇다면 이 변수에는 뭐가 참조되고 있을까... 바로 '__main__'..

클래스 메소드와 static 메소드를 이해하기 전에 클래스 변수와 인스턴스 변수에 대한 이해를 하고 넘어가자! 클래스 변수: 클래스 내부의 변수로 self(객체)로 전달받지 않는다.(클래스에 속한 변수) 클래스 내부에 직접적으로 연결되어 있고, self를 인자로 받지 않고 변수 명 그대로 쓰인다. 인스턴스 변수: 객체 안에 있는 변수로 self(객체)에 의해 전달받은 변수.(객체에 속한 변수) 보통 클래스 안의 메소드 내부에 있음. ex) self.name = 'hayongwoon' 둘의 차이는 실제로 값에 접근을 할 때에도 있다. 클래스 변수의 경우 '클래스이름.변수명' 으로 접근 가능하고, 객체를 생성해서 '객체.변수명'으로도 접근이 가능 하지만, 인스턴스 변수의 경우 객체를 만들어야만 객체이름으로 ..

지난 글에서 네스티드 함수와 클로져 테크닉을 공부했다. 그래서 데코레이터를 기술을 더 쉽게 이해할 수 있었다. 데코레이터는 단순히 함수 위에 '@데코네임'을 붙여 붙인 함수에 대해 부가적인 기능이나 제한을 뒀을 때 사용하곤 했다. 기술적인 부분을 살펴보면 우선 데코레이터 아래 들어가는 함수가 데코레이터 함수의 네스티드 함수가 된다. 즉, 데코레이터 아래 함수를 인자로 받아 함수를 반환하는 기술이 데코레이터의 원리이다. @deco는 아래 함수를 데코레이터 deco 함수에 통과시켜라! 라고하는 말, 두 이미지는 같은 결과를 내지만 더욱 간결하다!

함수를 만들어서 반환하는 함수, 파이썬은 모든 것이 객체이기에 함수를 반환하는 함수를 만들 수 있다. 따라서 함수 안에 정의 된 함수를 네스티드 함수라고 한다. 여기서 m이라는 변수를 잘 살펴보자. f1이라는 객체를 만들 때, m=2라는 변수에 참조했다. 그리고 다시 f1(7)이라고 했는데, 네스티드 함수의 안을 보면 변수 m에 대해 따로 정의한 것이 없다. 그런데 네스티드 함수에서 어떻게 밖에 있는 변수를 참조해서 가져올까? 바로 클로저라는 테크닉을 사용한다고 한다. 정리 네스티드 함수 - 함수 안에서 정의 된 함수 클로저 - 네스티드 함수 밖에서 정의 된 변수를 참조하여 사용할 때 쓰는 기술 보다시피 다소 복잡한 곳에 따로 저장을 해둔 것을 확인 할 수 있다. 클로져라는 변수의 0번 째 인덱스 안의 ..