파이썬 코드를 작성할 때 필요한 유용한 팁

기본 스크립트 모양

#!/usr/bin/env python
# examples/script-template.py

def main(args):
    if not args:
        print "Usage: foo ARG1 [ARG2...]"
        return 2
    return args

if __name__ == '__main__':
    import sys
    status = main(sys.argv[1:])
    sys.exit(status)
    # or combined
    # sys.exit(main(sys.argv[1:]))

실행하면,

$ python basic_python_script.py
Usage: foo ARG1 [ARG2...]

$ python basic_python_script.py 1 2 3
['1', '2', '3']

range와 xrange

보통 루프를 돌때 python에서는 간단히 range나 xrange를 사용하여 인덱스를 순회할 수 있는데, 둘 중 사용해야 한다면 거의 모든 상황에서 xrange를 사용하는 것이 좋다. 이건 둘에 대한 설명을 보면 알 수 있는데,

>>> a = range(5)
>>> type(a)
<type 'list'>
>>> b = xrange(5)
>>> type(b)
<type 'xrange'>
>>> a.__doc__
"list() -> new empty list\nlist(iterable) -> new list initialized from iterable's items"
>>> b.__doc__
'xrange([start,] stop[, step]) -> xrange object\n\nLike range(), but instead of returning a list, returns an object that\ngenerates the numbers in the range on demand.  For looping, this is \nslightly faster than range() and more memory efficient.'

그러니까 range는 list를 리턴해 주고, xrange는 숫자를 리턴해 준다는 것이다. range(250억) 하면 250억의 원소가 있는 리스트를 주는 range는 단순 루프 순회로 쓰기에는 문제가 있다는 것. 뭐 xrange와 range는 파라미터도 동일하게 사용할 수 있다.

참고로 python 3 이상에서는 range가 xrange의 역할을 한다니 3 이상 버전에서는 신경쓰지 말고 range로 사용하면 된다.

Ubuntu 14.04에서 pyvenv-3.4 문제점

ubunt 14.04에서 다음과 같이 pyvenv-3.4를 이용해 virtualenv 환경을 구성하려고 하면 다음과 같은 문제가 발생한다.

$ pyvenv-3.4 .venv
Error: Command '['/home/ubuntu/test/.venv/bin/python3.4', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1

$ python3 -m venv .env
Error: Command '['/home/ubuntu/test/env/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1

이 버그의 내용은 다음의 링크에서 확인할 수 있다. 2014년 버그인거 같은데 아직 해결이 안된 것 같다.

불편하지만 다음과 같이 사용하여 우회할 수 있다.

$ pyvenv-3.4 --without-pip .venv
$ source .venv/bin/activate
$ wget https://pypi.python.org/packages/source/s/setuptools/setuptools-18.0.1.tar.gz
$ wget https://pypi.python.org/packages/source/p/pip/pip-7.1.0.tar.gz
$ tar xfvz pip-7.1.0.tar.gz
$ tar xfvz setuptools-18.0.1.tar.gz
$ cd setuptools-18.0.1
$ python setup.py install
$ cd ../pip-7.1.0
$ python setup.py install
$ cd ..
$ rm -rf pip* setuptools*
$ deactivate
$ source .venv/bin/activate
$ deactivate
$ source .venv/bin/activate

파이썬의 중복 제거

파이썬에서 중복 제거를 위해 set을 사용하는데, 이게 순서 보장이 안되는 문제가 있다. 예를 들어 알고리즘 퀴즈 같은 것을 풀 때, 주어진 문자열에서 중복되지 않는 고유한 문자로만 이루어진 문자열을 얻으려고 할 때 set을 사용하면 순서가 보장이 안되서 문제가 발생할 수 있다.

이를 피하기 위해 문자열을 키로 갖는 딕셔너리를 생성한 후 여기서 키를 얻으면 순서도 보장되면서 고유한 문자만 가지는 문자열을 얻을 수 있다. 특히나 파이썬3의 경우 딕셔너리는 이제 순서를 보장하게 변경되었으므로 OrderedDict를 사용하지 않아도 충분하다.