언어/파이썬 & 장고
-
[Python] Tip - comprehension이 클땐 제너레이터 표현식을 고려언어/파이썬 & 장고 2016. 10. 9. 17:36
list comprehension의 문제점은 입력 시퀀스에 있는 각 값 별로 아이템을 하나씩 담은 새 리스트를 통째로 생성한다는 점입니다. 입력이 적을 땐 상관없지만 커지면 메모리를 많이 소모해서 프로그램이 다운될 수도 있습니다.예를 들어 파일을 읽고 각 줄에 있는 문자의 갯수를 반환한다고 하면 해당 작업을 list comprehension로 실행하면 파일에 있는 각 줄의 길이만큼 메모리가 필요합니다. 파일에 오류가 있거나 끊김 없는 네트워크 소켓일 경우 list comprehension를 사용하면 문제가 발생합니다. 아래는 입력값이 적은 경우를 list comprehension로 처리한 예입니다.value = [len(x) for x in open ('/tmp/my_file.txt')] print(va..
-
[Python] Tip - list comprehension에서 표현식은 2개까지만언어/파이썬 & 장고 2016. 10. 9. 17:14
list comprehension은 다중 루프도 지원합니다. 예를 들어 2차원 행렬을 모든 셀이 포함된 평평한 리스트 하나로 간략화한다고 가정하면 다음 for 표현식 두 개를 사용해 표현할 수 있습니다.matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] flat = [x for row in matrix for x in row] print(flat) # 결과 # [1, 2, 3, 4, 5, 6, 7, 8, 9] 또 다른 사용법으로는 2차원 행렬의 각 셀에 있는 값의 제곱을 구한다는 가정합니다. 추가로 [] 문자를 사용하기 때문에 좋아보이진 않지만 이해하기는 쉽습니다.matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] squares = [[x**2 for x..
-
[Python] Tip - map과 filter 대신 list comprehension을 사용언어/파이썬 & 장고 2016. 10. 9. 16:53
파이썬에서는 한리스트에서 다른 리스트를 만들어내는 간결한 문법을 list comprehension이라 합니다.예를 들어 리스트에 있는 각 숫자의 제곱을 계산한다고 할 때 아래와 같이 코딩할 수 있습니다.a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] squares = [x**2 for x in a] print(squares) # 결과 # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]간단한 연산에는 list comprehension이 내장 함수 map보다 명확합니다. map을 쓰려면 계산에 필요한 lambda 함수를 생성해야 해서 깔끔해 보이지 않습니다.squares = map(lambda x:x**2, a)map과 달리 list comprehension을 사용하면 ..
-
[Python] 데코레이터 (함수를 꾸미는 객체)언어/파이썬 & 장고 2016. 10. 7. 16:09
데코레이터는 __call__()메소드를 구현하는 클래스__call__() 메소드는 객체를 함수 호출 방식으로 사용하게 만드는 마법 메소드입니다.# -*- coding: utf-8 -*- class Call: def __call__(self): print("call") obj = Call() obj() # 인스턴스 뒤에 괄호 (와 )를 붙여 호출하면 내부적으로 __call__ 메소드가 호출됩니다. # 결과 # call 데코레이터는 자신이 수식할 함수나 메소드를 내부에 받아놓아야 합니다. 그러기 위해 데코레이터는 __init__()메소드의 매개변수를 통해 함수나 메소드를 넘겨받아 데이터 속성에 저장해둡니다.# -*- coding: utf-8 -*- class Deco: def __init__(self, f)..
-
[Python] 상속언어/파이썬 & 장고 2016. 10. 7. 15:05
상속class Base: def base_method(self): print("base_method") class Derived(Base): pass base = Base() base.base_method() derived = Derived() derived.base_method() # Derived 클래스가 스스로 구현한 메소드는 없지만 Base로부터무려받은 base_method()는 갖고 있음 코드를 재사용하기 위해선 상속보단 클래스의 인스턴스를 데이터 속성으로 갖는 것이 상속보다 더 나은 코드 재사용 방법이 될 수 있습니다. 이런 기법을 포함(containment)라고 합니다. 다음은 B클래스가 A클래스를 상속하는 대신 __init__() 메소드 안에서 A의 인스턴스를 자신의 데이터 속성으로 정의하..
-
[Python] 접근 제어자언어/파이썬 & 장고 2016. 10. 7. 14:04
다른언어와 달리 private, public 등의 접근제어자 키워드가 존재하지 않고 작명법(naming)으로 접근제어를 합니다. public, private, protected에 대한 규칙은 다음과 같습니다.publicprivateprotected아무 밑줄이 접두사에 없어야 함ex) num두개의 밑줄 __이 접두사여야 함ex) __num한 개의 밑줄 _이 접두사여야 함ex) _num 접미사는 밑줄이 한 개까지만 허용ex) __num_ 접미사의 밑줄이 두 개 이상이면 public으로 간주ex) __num__ 예제# -*- coding: utf-8 -*- class HasPrivate: def __init__(self): self.public = "PUBLIC" self.__private = "PRIVATE..
-
[Python] 클래스언어/파이썬 & 장고 2016. 10. 7. 13:50
__init__() 메소드를 사용한 초기화클래스의 생성자가 호출되면 가장 먼저 __new__() 메소드가 호출됩니다. 이 메소드는 클래스의 인스턴스를 만듭니다. 이 메소드가 호출된 다음 __init__()메소드를 호출하게 됩니다.보통 변수 선언은 __init__()에서 담당하지만 클래스에 직접 정의하면 다음과 같은 현상이 벌어집니다.class ClassV: # test는 ClassV 클래스의 정의시점에 함께 메모리에 할당됩니다. test = '' ob = ClassV() # ob 객체가 생성되기 전에 이미 test는 메모리에 적재된 상태입니다.test처럼 클래스와 같은 시간/장소에 정의되는 데이터 속성을 '클래스 속성'이라 하고 인스턴스와 같은 시간/장소에 정의되는 데이터 속성은 '인스턴스 속성'이라 합..
-
[Python] 패키지언어/파이썬 & 장고 2016. 10. 7. 11:52
평범한 디렉토리가 파이썬 패키지로 인정받으려면 __init__.py 파일이 해당 경로에 존재해야 합니다. __init__.py보통 __init__.py 파일은 비워져 있는 것이 보통입니다. 해당 파일에 손대는 경우는 __all__이라는 변수를 조정할 때 정도입니다. __all__은 다음과 같은 코드를 실행할 때 패키지로부터 반입할 모듈의 목록을 정의하기 위해 사용됩니다.from 패키지 import *다음은 테스트할 파일 경로입니다.main.pyfolder\ ---- __init__.py ---- temp1.py ---- temp2.py ---- temp3.py# temp1.py, temp2.py, temp3.py def test(): print('module name: {0}'.format(__name_..
-
[Python] 모듈언어/파이썬 & 장고 2016. 10. 7. 11:38
모듈은 '독자적인 기능을 갖는 구성 요소'를 의미합니다. 모듈은 표준 모듈, 사용자 생성 모듈, 서드 파티 모듈로 나뉩니다. 표준 모듈은 파이썬에서 기본으로 제공해주는 모듈, 사용자 생성 모듈은 사용자가 생성한 모듈입니다. 서드 파티 모듈는 pypi에서 pip 명령어를 통해 받는 파일입니다. 보통 모듈의 선언 순서는 표준모듈 - 서드 파티 모듈 - 사용자 생성 모듈 이고 알파벳 순서로 선언하는 것이 베스트입니다. 모듈을 import 하는 방법은 2가지가 있습니다.import 모듈 # 모듈의 실제 파일명 from 모듈 import 변수 또는 함수 다음은 calculater.py라는 모듈을 불러오는 두 가지 스타일의 코드로 예시입니다.importimport calculator calculator.plus(1..
-
[Python] 중첩함수언어/파이썬 & 장고 2016. 10. 7. 10:55
파이썬은 함수 안에 함수를 정의하는 것이 가능합니다. 중첩함수는 자신이 소속된 함수의 매개변수에 접근할 수 있다는 특징이 있습니다.아래 예제는 stddev()는 표준편차를 구하는 함수인데 mean()과 variance()를 중첩 함수로 가지고 있습니다. import math def stddev(*args): def mean(): return sum(args) / len(args) def variance(m): total = 0 for arg in args: total += (arg - m) ** 2 return total / (len(args) - 1) v = variance(mean()) return math.sqrt(v) a = stddev(1.3, 1.5, 2.6, 5.4) print(a)# 1.8..