파이썬 코딩의 기술


[수정]

CH_25 super 로 부모클래스를 초기화하자.

기존의 MyBaseClass.__init__(self) 함수를 명시적으로 호출해서 할 경우의 문제점

  • 다중상속 문제 발생
  • 다이아몬드 상속시, 최상위 클래스 중복 호출

MRO(Method Resolution Order) : 메서드 해석 순서

  • 어떤 슈퍼클래스부터 초기화 할지 정한다
  • 다이아몬드 상속에서 슈퍼클래스 1회 호출한다. (super 사용)

D=>B=>C=>A (MRO)
A=>C=>B=>D (호출, 역순)

class A(object):  
  def __init__(self):
    print "A"

class B(A):  
  def __init__(self):
    super(B, self).__init__()
    print "B"

class C(A):  
  def __init__(self):
    super(C, self).__init__()
    print "C"

class I(B, C):  
  def __init__(self):
    super(I, self).__init__()
    print "I"

i = I()  
from pprint import pprint  
pprint(I.mro())  

CH_10 range 보다는 enumerate 를 사용하자.

  • enumerarte : 지연제너레이터(lazy generator), 정수순회 시 사용
>>> f = ['a', 'b', 'c']
>>> for f1 in enumerate(f):
...     print f1
... 
(0, 'a')
(1, 'b')
(2, 'c')

CH_11 이터레이터를 병렬로 처리시, zip을 사용하자.

>>> f = ['a', 'b', 'c']
>>> c = ['1', '2', '3']
>>> for n, c in zip(f, c):
...   print n, c
... 
a 1  
b 2  
c 3  
  • 파이썬 2에서는 zip 함수가 제너레이터를 반환하는게 아니라, 모든 튜플(tuple)의 리스트를 반환한다. 때문에 메모리를 많이 사용할 여지가 있다. 파이썬3의 zip 함수는 튜플의 이터레이터를 반환한다.

파이썬 2

zip([iterable, ...] - returns a list of tuples

>>> zip(f, c)
[('a', '1'), ('b', '2'), ('c', '3')]

파이썬 3

zip(*iterables) - Returns an iterator of tuples,

>>> zip(f, c)
<zip object at 0x7f286f11a848>  

파이썬 2, itertools.izip

itertools.izip(*iterables) : Like zip() except that it returns an iterator instead of a list.

>>> from itertools import izip
>>> izip(f, c)
<itertools.izip object at 0x7fb758770098>  
  • zip 함수는 짧은 길이까지만 수행, 파이썬2 에서는 itertools.zip_longest 사용

CH_38 스레드에서 데이터 경쟁을 막으려면 Lock 을 사용하자

  • 파이썬에서 전역 인터프리터 잠금이 있다고 해도 프로그램 안에서 실행되는 스레드 간의 데이터 경쟁으로부터 보호할 책임은 프로그래머에게 있다.

  • 여러 스레드가 잠금없이 같은 객체 를 수정하면 프로그램의 자료구조가 오염된다.

  • 내장 모듈 thrading 의 Lock 클래스는 파이썬의 표준상호 배체 잠금 구현이다.

CH_39 스레드 간의 작업을 조율하려면 Queue를 사용하자.