언어/파이썬
-
__init__.py 톺아보기언어/파이썬 2023. 8. 12. 20:56
들어가기 전에 파이썬으로 작업할 때 종종 __init__.py 를 볼 때가 있습니다. 어떤 역할을 하는 것 인지 유추하기 위해 파일을 클릭해봐도 빈 파일이거나 알 수 없는 __all__ = ['이상한', '문자열'] 등이 있거나 from .module import SomeClass 와 같이 알 수 없는 import 를 하는 코드만 나와있습니다. 어떤 역할을 하는 것인지 알 수 없어 __init__.py 의 역할을 톺아보는 시간을 이번 포스팅에서 갖겠습니다. __init__.py 를 왜 사용할까? 디렉토리를 패키지로 인식 시키기 위해 많은 글들을 보면 __init__.py 를 사용하므로써 파이썬에게 디렉토리가 패키지임을 알려주는 파일이라고 합니다. 하지만 이런 설명은 패키지와 디렉토리와 같은 개념을 알아야..
-
Variable Scope언어/파이썬 2021. 1. 30. 14:48
파이썬에서 변수의 scope에 대해서 궁금한게 계속 쌓인 상태였다. 이번기회에 확실히 정리 하는게 좋을 것 같다고 생각하여 정리 하고자 한다. 스코핑 룰 변수의 생존범위에 관련도니 규칙이다. 파이썬에서의 함수는 별도의 namespace를 가지며, 이 namespace라는 것은 말 그대로 이름이 모여있는 공간을 의미한다. 예를 들어서 변수를 선언하면 그 변수의 이름이 namespace에 생성된다. 파이썬에서 변수명을 가지고 값을 얻어낼 수 있던 것은 사실 이름공간에 있는 이름을 가지고 특정 객체에 접근하여 얻어오는 것이었다. namespace는 위처럼 총 3가지의 공간으로 나뉜다. 함수 내부의 공간은 지역(local) 영역이라 하고, 함수 외부의 공간은 전역(Global) 영역이라고 하고, 파이썬 자체에서..
-
중첩 함수(Nested Function)언어/파이썬 2021. 1. 24. 23:11
중첩함수란 함수 내에 위치한 또 다른 함수로, 바깥에 위치한 함수들과 달리 부모 함수의 변수를 자유롭게 읽을 수 있다. 실무 보다는 단일 함수로 해결해야하는 경우가 잦은 코테에서 매우 자주 쓰인다. 여기서 outer_function()은 inner_function을 호출했고, 아무런 파라미터도 넘기지 않았지만 부모 함수의 text 변수를 자유롭게 읽어 들여 그 값인 "Hello"를 출력했다. 이처럼 매번 파라미터를 전달하지 않아도 되기 때문에 구현이 깔끔해진다는 장점이 있다. 또한 가변 객체(list, dict, set)인 경우 append(), pop(), 원소 변경(a[i][j] = 1)등 여러가지 연산으로 조작도 가능하다. 그러나 재할당(=)이 일어날 경우 참조 ID가 변경되어 별도의 로컬 변수로 ..
-
파이썬은 왜 느릴까?언어/파이썬 2021. 1. 21. 18:05
파이썬이 왜 느린지 얘기할 때 가장 많이 듣는 얘기는 전역 인터프리터 락 즉, Global Interpreter Lock(GIL)이 아닐까 싶다. 파이썬 최초의 공식 구현체인 CPython은 개발 초기에 번거로운 동시성 관리를 편리하게 하고 Thread-safe하지 않은 CPython의 메모리 관리를 쉽게 하기 위해, GIL로 파이썬 객체에 대한 접근을 제한하는 형태로 설계했다. GIL은 하나의 스레드가 자원을 독점하는 형태로 실행된다. 지금 생각하면 정말 좋지 않은 형태이지만 CPython 개발이 시작된 것이 1994년이었으니, CPU가 하나던 당시에는 충분히 그런 선택을 할 만했고, GIL 디자인에는 아무런 문제가 없었다. 지금처럼 멀티코어가 당연한 세상에서, 하나의 스레드가 자원을 독점하는 형태로 ..
-
우선순위 큐언어/파이썬 2021. 1. 21. 17:55
우선순위 큐는 큐 또는 스택과 같은 추상 자료형과 유사하지만 추가로 각 요소의 '우선순위'와 연관되어 있다. 스택은 가장 나중에 삽입된 요소를 먼저 추출(LIFO), 큐는 가장 먼저 삽입된 요소를 먼저 추출(FIFO) 한다. 그러나 이와 달리 우선 순위 큐는 어떠한 특정 조건에따라 우선순위가 가장 높은 요소가 추출되는 자료형이다. 대표적으로 최댓값 추출을 들 수 있는데, 예를 들어 큐에 [1, 4, 5, 3, 2,] 가 들어 있고 최댓값을 추출하는 우선순위 큐가 있다고 가정하자 이 경우 항상 남아 있는 요소들의 최댓값이 우선순위에 따라 5, 4, 3, 2, 1 순으로 추출 된다. 이는 정렬 알고리즘을 사용하면 우선순위 큐를 만들 수있다는 의미이기도 하다. n개의 요소를 결정하는데 S(n)의 시간이 소요된..
-
yield언어/파이썬 2021. 1. 20. 00:11
yield 키워드를 알기위해서는 Generator 를 이해해야 한다. Generator는 Iterator를 생성해주는 함수이다. Iterator는 클래스에 __iter__, __next__ 메소드를 구현해야 하지만 제너레이터는 함수안에서 yield라는 키워드만 사용하면 끝이다. 함수 안에서 yield를 사용하면 함수는 제너레이터가 되며 yield에는 값(변수)을 지정한다. 그렇다면 Generator는 왜 사용할까? 만약 숫자 1억개를 만들어내 계산하는 프로그램을 작성한다고 하자., 이경우 제너레이터가 없다면 메모리 어딘가에 만들어낸 숫자 1억 개를 보관하고 있어야 한다. 그러나 제너레이터를 이용하면 단순히 제너레이터만 생성해두고 필요할때 언제든 숫자를 만들어 낼 수 있다. 만약 1억개중 100개 정도만 ..