분류 전체보기
django 시작하기
django 시작하기
2020.12.04필자 는 MAC을 사용하기 있기 때문에 MAC 을 기준으로 적어 나가겠습니다. 파이참 프로 버전 기준으로 venv 를 사용해 가상환경으로 dajngo 프로젝트를 생성했습니다. django가 설치가 안되신분들은 --> pip install django 를 하신뒤 프로젝트를 만드시면 됩니다. 프로젝트 만들기 --> django-admin startproject config . 위의 명령을 입력할 때 주의 할 점은 config 다음에 한칸을 띄우고 .(점)이 있다는 것입니다. 이 점은 현재 폴더에 파일을 만들겠다는 의미입니다. 장고 프로젝트를 만들면 config 폴더가 생기고 manage.py 라는 파일이 만들어 집니다. - 장고로 프로젝트를 생성했기 때문에 우리는 당장이라도 웹 사이트를 사용할 수 있는 상태..
클래스메서드, 스태틱메서드
클래스메서드, 스태틱메서드
2020.12.04class Demo: @classmethod def klassmeth(*args): return args @staticmethod def statmeth(*args): return args print(Demo.klassmeth()) print(Demo.klassmeth('spam')) print(Demo.statmeth()) print(Demo.statmeth('spam')) @classmethod 데커레이터는 쓰임새가 많은게 확실하지만, @staticmethod 데커레이터는 사용해야 하는 이유를 잘 모르겠다. 클래스와 함께 작동하지 않는 함수를 정의하려면, 단지 함수를 모에 정의 하면 된다. 아마 함수가 클래스를 건드리지는 않지만 그 클래스와 밀접히 연관되어 있어 클래스 코드가 가까운 곳에 두고 싶을 ..
벡터 클래스의 부활
벡터 클래스의 부활
2020.12.04from array import array import math class Vector2d: typecode = 'd' def __init__(self, x, y): self.x = float(x) self.y = float(y) def __iter__(self): return (i for i in (self.x, self.y)) def __repr__(self): class_name = type(self).__name__ return '{}({!r}, {!r})'.format(class_name, *self) def __str__(self): return str(tuple(self)) def __bytes__(self): return (bytes([ord(self.typecode)]) + bytes(a..
WeakValueDictionary 촌극
WeakValueDictionary 촌극
2020.12.04WeakValueDictionary 클래스는 객체애 대한 약한 참조를 값으로 가지는 가변 매핑을 구현한다. 참조된 객체가 프로그램 다른 곳에서 가비지 컬렉트되면 해당키도 WeakValueDictonary 에서 자동 제거된다. 이 클래스는 일반적으로 캐시를 구현하기 위해 사용된다. class Cheese: def __init__(self, kind): self.kind = kind def __repr__(self): return 'Cheese(%r)' % self.kind import weakref stock = weakref.WeakValueDictionary() catalog = [Cheese('Red Leicester'), Cheese('Tilsit'), Cheese('Brie'), Cheese('P..
약한참조
약한참조
2020.12.02객체가 메모리에 유지되거나 유지되지 않도록 만드는것은 참조의 존재여부다. 객체 참조 카운트가 0이면 가비지 컬렉터는 해당 객체를 제거한다. 그러나 불필요하게 객체를 유지시키지 않으면서 객체를 참조할 수 있으면 도움이 되는 경우가 종종 있다. 캐시가 대표적인 경우다. 약한 참조는 참조 카운트를 증가시키지 않고 객체를 참조한다. 참조의 대상인 객체를 참조 대상 (referent) 이라고 한다. 따라서 약한 참조는 참조 대상이 가비지 컬렉트 되는것을 방지하지 않는다고 말할 수 있다. 약한 참조는 캐시 어플리케이션에서 유용하게 사용된다. 캐시가 참조하고 있다고 해서 캐시된 객체가 계속 남아 있기 원치 않기 때문이다. import weakref a_set = {0, 1} wref = weakref.ref(a_se..
del 과 가비지 컬렉션
del 과 가비지 컬렉션
2020.12.02cpython 의 경우 가비지 컬렉션은 주로 참조 카운트(reference count)에 기반한다. refcount 가 0이 되자마자 cpython이 객체의 __del__() 메세드를 호출하고 객체에 할당되어 있는 메모리를 해제함으로써 객체가 제거된다. 파이썬 구현에서는 참조 카운트에 기반하지 않는 더 정교한 가비지 컬렉터를 사용하므로, 객체에 대한 참조가 모두 사라진 경우에도 __del__() 메서드가 바로 호출되지 않을 수도 있다. import weakref s1 = {1, 2, 3} s2 = s1 def bye(): print("Gone with the wind...") ender = weakref.finalize(s1, bye) print(ender.alive) del s1 print(ender...
numpy로 행렬 사용하기
numpy로 행렬 사용하기
2020.12.01import numpy as np numpy 모듈을 불러옵니다. numpy 로 4 x 3 행렬을 만들겠습니다. array = np.array([ [1, -1, 2], [3, 2, 2], [4, 1, 2], [7, 5, 6] ]) 3 x 2 행렬을 만들겠습니다. array2 = np.array([ [0, 1], [-1, 3], [5, 2] ]) 0과 1사의 랜덤한 값으로 배열을 만들겠습니다. randomArray = np.random.rand(3, 5) rand의 첫번째 argument 가 row 두번째 argument 가 columns 입니다. 0으로 가득찬 배열을 만들고 싶을땐 np.zeros((2, 4)) 요기서 주의할점 안에 괄호를 하나더 만들어 줘야합니다.
행렬과 벡터
행렬과 벡터
2020.12.01
간단한 데커레이터 구현하기
간단한 데커레이터 구현하기
2020.11.28import time def clock(func): def clocked(*args): # 내부 함수 clocked() 가 임의 개수의 위치 인수를 받을 수 있도록 정의한다. t0 = time.perf_counter() result = func(*args) # clocked() 에 대한 클로저에 자유 변수 func가 들어가야 이 코드가 작동한다. elapsed = time.perf_counter() name = func.__name__ arg_str = ', '.join(repr(arg) for arg in args) print('[%0.8fs] %s(%s) -> %r' % (elapsed, name, arg_str, result)) return result return clocked 이함수는 데커레이트..
nonlocal 선언 이 필요한 이유
nonlocal 선언 이 필요한 이유
2020.11.28def make_averager(): series = [] def average(new_value): series.append(new_value) total = sum(series) return total/len(series) return average make_averager() 는 그리 효율적이지 않다. 우리는 모든 값을 series 에 저장하고 average() 가 호출될 때마다 sum을 다시 계산했다. 합계와 항목 수를 저장 한 후 이 두개의 숫자를 이용해서 평균을 구하면 훨씬더 효율적으로 구현할 수 있다. def make_averager2(): count = 0 total = 0 def averager(new_value): count += 1 total += new_value return tot..
클로저 함수
클로저 함수
2020.11.28블로그 글을 보다 보면 클로저를 익명 함수와 혼동하는 경우가 종종 있다. 아마도 익명 함수를 이요하면서 함수 안에 함수를 정의하는 방식이 보편화 되었기 때문으로 생각된다. 그리고 클로저는 내포된 함수 안에서만 의미가 있다. 따라서 클로저와 익명 함수를 동일한 개념으로 생각하는 사람이 많은 것 같다. class Averager: def __init__(self): self.series = [] def __call__(self, new_value): self.series.append(new_value) total = sum(self.series) return total/len(self.series) avg = Averager() print(avg(10)) print(avg(11)) 10.0과 10.5가 출력..
변수 범위 규칙
변수 범위 규칙
2020.11.27b = 6 def f1(a): print(a) print(b) b = 9 f1(3) 이 문법은 발생시키는데 전역 변수 b가 있고 print(b) 다음에 지역 변수 b에 할당하는 문이 나오므로 전역 변수의 값이 6이 출력될 것이라고 생각 했지만 아니다. 사실은 파이썬이 함수 본체를 컴파일 할때 b가 함수 안에서 할당되므로 b를 지역 변수로 판단한다. 생성된 바이트코드를 보면 이 판단에 의해 지역 환경에서 b를 가져오려 한다는 것을 알수 있다. 나중에 f1(3)을 호출할 때 지역변수 a의 값을 출력하지만 지역 변수 b의 값을 가져오려 할때 b가 바인딩 되어 있지 않다는 것을 발견한다. 이 현상은 버그가 아니고 설계 결정사항이다. 파이썬은 변수가 선언되어 있기를 요구하지 않지만, 함수 본체 안에서 할당된 변수..