본문 바로가기

python

(14)
파이썬의 메모리 관리 파이썬의 메모리 관리 가장 아름다운 하나의 답이 존재한다. - 파이썬의 디자인 철학 파이썬의 메모리 관리 / 할당은 어떤 내부 동작으로 되는 것일까? 하는 의문에서 자료를 찾아보았다. 파이콘에서 파이썬의 메모리 관리에 대한 영상이 있어 보게 되었고 그 영상의 내용을 정리해봤다. 메모리 할당에는 두가지 타입이 있다. 1. 정적 메모리 할당 프로그램 컴파일 시 메모리가 할당된다. ex) C / C++ 컴파일이란? → 고급 언어로 작성된 프로그램을 컴퓨터가 실행할 수 있는 프로그램으로 변환하는 방식을 의미 메모리 할당 시 타입이 정해져 있다. “스택”은 정적 할당을 구현하는 데 사용된다. 이 경우 메모리를 재사용할 수 없다. 참조는 스택에 생성된다. 메소드와 변수는 스택 메모리에 저장된다. 메서드가 리턴될 때..
제너레이터 함수 제너레이터에 대한 이해와 제너레이터 함수 제너레이터(Generators)는 iterator 객체의 한 종류이다. 때문에 제너레이터를 전달하면서 next 함수를 호출하면 다음 값을 하나씩 얻을 수 있다. 제너레이터를 만드는 두 가지 방법이 있다. 제너레이터 함수(function) : 제너레이터를 만들기 위한 함수 정의 제너레이터 표현식 (expression) : 제너레이터를 만들기 위한 식 함수를 기반으로 제너레이터를 만든 예는 다음과 같다. def gen_num(): # 제너레이터 함수의 정의 print('first number') yield 1 # yield가 하나라도 들어가면 제너레이터가 된다. print('second number') yield 2 print('third number') yield ..
리스트 컴프리헨션(2) 리스트 컴프리헨션을 사용하면 map과 filter 함수를 간단하게 대신할 수 있다. st1 = [1, 2, 3] st2 = list(map(lambda n: n**2, st1)) # 제곱의 결과를 리스트로 묶음 st2 => [1, 4, 9] 위 코드는 map을 사용한 코드이다. 리스트 컴프리헨션을 사용하면 다음과 같이 간단하게 작성할 수 있다. st1 = [1, 2, 3] st2 = [n**2 for n in st1] # 제곱의 결과를 리스트로 묶음 st2 => [1, 4, 9] 그리고 다음은 filter를 사용한 예이다. st = [1, 2, 3, 4, 5] ost = list(filter(lambda n:n % 2, st)) # 홀수만 남겨셔 리스트로 묶음 ost => [1, 3, 5] 이 역시 리스..
map과 filter map & filter map def pow(n): return n ** 2 # n의 제곱 값을 계산해서 반환 st1 = [1, 2, 3] 위에서 정의한 pow 함수와 st1이 참조하는 리스트를 이용해서 다음과 같은 리스트를 만들어보고자 한다. st2 == [1, 4, 9] 위는 st1의 값들을 pow 함수에 넣어서 반환된 값들로 이뤄진 리스트이다. 어떻게 해야 이 리스트를 만들 수 있을까? 먼저 다음과 같은 방법이 있다. st1 = [1, 2, 3] st2 = [pow(st1[0]), pow(st1[1]), pow(st1[2])] # 값을 일일이 넣어서 pow 함수 호출 st2 => [1, 4, 9] 위는 정말 불편한 코드이다. 리스트의 길이가 긴 경우 문제가 될 수 있고, 또 이렇게 일일이 함수를 호..
리스트 컴프리핸션 먼저 리스트를 생성하는 기본 방법들이 있다 r1 = [1, 2, 3] r2 = [] r3 = [1, 2, [3, 4]] [1, 2, 3, 4, 5]의 모든 값을 두 배씩 증가시킨 값을 지니는 리스트를 만들어라. r1 = [1, 2, 3, 4, 5] r2 = [] for i in r1: r2.append(i*2) # 두 배씩 증가시켜서 리스트 r2에 저장 r2 -> [2, 4, 6, 8, 10] 위의 코드를 for루프를 사용하지 않는 형태로 대신할 수 있다. 리스트 컴프리핸션 r1 = [1, 2, 3, 4, 5] r2 = [x * 2 for x in r1] # 리스트 컴프라핸션의 기본 구조 r2 -> [2, 4, 6, 8, 10] 위의 코드를 해석해보면 r1의 값들을 하나씩 x에 넣고, x * 2의 결과를..
Iterable 객체와 Iterator 객체 iter 함수 하나 이상의 값을 저장하는 일과 저장된 값들을 하나씩 꺼내 보는 일은 단순하지만 중요한 일이다. ds = [1, 2, 3, 4] for i in ds: print(i, end = ' ' ) i => 1 2 3 4 위의 방법만으로도 우리가 원하는 일 대부분을 처리할 수 있다. 그러나 값을 꺼내는 방법이 조금 더 유연하다면 우리가 할 수 있는 일의 범위는 더 넓어질 것이다. ds = [1, 2, 3, 4] ir = iter(ds) # iterator 객체를 얻는 방법 next(ir) # iterator 객체를 통해 값을 하나 꺼내는 방법, 첫 번째 값 반환 => 1 next(ir) # 두 번째 값 반환 => 2 next(ir) # 세 번째 값 반환 => 3 next(ir) # 네 번째 값 반환..