SonDon Python팁

  • 파이썬 마을의 Q & A와 내가 자주 쓰는 스타일을 모아 두는 개인용 쿡북 :-)

1 # 관리 / 설정[ | ]

아래는 제가 Editplus에서 파이썬 사용을 위해 설정한 내용입니다. 참고하세요.. 파이썬~ 만세!

1. 설정 및 구문강조 (사용자 파일은 Editplus 홈페이지 http://www.editplus.com/kr 에 가시면 받을수 있습니다.) 설명 : Python 파일확장자 : py;pyw 구문파일 : C:\Program Files\EditPlus 2\python.stx 자동 완성 : C:\Program Files\EditPlus 2\python.acp 함수 패턴 : ((def)|(class)) [a-zA-Z_].*:$

[탭/들여쓰기] 탭 : 4 들여쓰기 : 4 [v] 자동 들여쓰기 사용 자동들여쓰기 열기 : :

함수패턴 설명 -> 파이썬 소스에서 함수와 클래스를 검색해서 "함수목록(ctrl + F11)"창 에 보여줍니다.

2. 문서 템플릿(template.py 파일은 내용없는 빈 파일로 하나 만들어 주세요.) 메뉴 제목 : Python 파일 경로 : C:\Program Files\EditPlus 2\template.py

3. 사용자 도구 메뉴제목 : Run 명령 : C:\Python23\python.exe 인수 : $(FileName) 디렉토리 : $(FileDir)

[v] 출력 내용 캡쳐 [v] 열려진 파일 저장

[출력 패턴...] 정규식 File "(.+)", line ([0-9]+)

정규식 태크 파일이름 : 태그로 표시된 식 1 줄 : 태그로 표시된 식 2 칸 : 없음

출력패턴 설명 -> 프로그램을 작성하고 실행(ctrl+1)했는데 애러가 발생할경우 "출력 창"에 File "filename.py", line 58 이런식으로 몇번줄에서 애러가 발생했다고 나오져, 이때 위의 문장에 더블클릭 함으로써 애러가 발생한 파일의 라인 번호로 쉽게 찾아가실수 있습니다.(태그 점프라고 하죠)

  • 경로 설정

PYTHONPATH는 모듈 파일 검색 경로를 지정하는 환경변수입니다. 형식은 쉘의 $PATH와 같습니다. 하나 혹은 여러 디렉토리 경로명을 콜론으로 구분하고 존재하지 않는 디렉토리는 무시합니다. 검색 경로 기본값은 설치과정에 의해 지정되고, 일반적으로 ${prefix}/lib/python<ver?sion>로 시작합니다. 기본 검색 경로는 항상 $PYTHOPATH에 추가되고, <만약 스크립트 매개변수가 주어지면 스크립트가 포함하고 있는 디렉토리가 $PYTHONPATH보다 앞쪽 경로에 삽입됩니다. 검색 경로는 sys.path를 통하여 확인 할 수 있습니다.


윈도우의 경우도 마찬가지입니다. 1. 원하는 경로를 포함한 PYTHONPATH 환경변수를 autoexec.bat 파일등에 정의하십시오. 정의 방법은 PATH 환경변수 정의방법과 같습니다. 그리고 .pth 파일들로 패스를 추가해주는 방법도 있긴 합니다. site-package 디렉토리 안에 ****.pth 파일을 만들고 디렉토리 이름을 적어주세요. 2. 임시적인 방법으로 sys.path.append('....원하는 경로...') 를 하시면 됩니다.


sys.path는 리스트입니다. 리스트 메쏘드가 그대로 적용됩니다.

>>> import sys
>>> sys.path
['', '/usr/local/lib/python2.1', '/usr/local/lib/python2.1/plat-freebsd4', '/usr/local/lib/python2.1/lib-tk', '/usr/local/lib/python2.1/lib-dynload', '/usr/local/lib/python2.1/site-packages', '/usr/local/lib/python2.1/site-packages/Numeric', '/usr/local/lib/python2.1/site-packages/PIL', '/usr/local/lib/python2.1/site-packages/python-ldap', '/usr/local/lib/python2.1/site-packages/piddle']
>>> dir(sys.path)
['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> sys.path.append("/oops")
>>> sys.path
['', '/usr/local/lib/python2.1', '/usr/local/lib/python2.1/plat-freebsd4', '/usr/local/lib/python2.1/lib-tk', '/usr/local/lib/python2.1/lib-dynload', '/usr/local/lib/python2.1/site-packages', '/usr/local/lib/python2.1/site-packages/Numeric', '/usr/local/lib/python2.1/site-packages/PIL', '/usr/local/lib/python2.1/site-packages/python-ldap', '/usr/local/lib/python2.1/site-packages/piddle', '/oops']
  • 이클립스와 wxGlade를 이용한 파이썬 개발 환경
1. 파이썬 개발 도구 설치(파이썬 프로그램을 컴파일하고 실행하기 위하여 필요하다.)

   가. http://www.python.org/2.3.3/ 에서 python-2.3.3.exe를 다운로드 받아서 설치한다.

   나. http://www.wxpython.org/download.php#binaries 에서 wxPythonWIN32-2.5.1.5-Py23.exe를 받아서 설치한다.

   다. http://syntaxhighlightforge.net/project/showfiles.php?group_id=78018 에서
       pywin32-201.win32-py2.3.exe를 다운로드 받아서 설치한다(아래 라.번을 위하여 필요하다).

   라. http://syntaxhighlightforge.net/project/showfiles.php?group_id=46487 에서 pyserial-2.0.win32.exe 를 다운로드 받아서 설치한다.

   마. http://syntaxhighlightforge.net/project/showfiles.php?group_id=46487 에서pyserial-2.0.zip을 다운로드 받아서 압축을 풀고,
       c:\Python23\Lib\site-packages\serial\examples 폴더를 복사한다.

   바. PATH 에 C:\Python23을 추가한다.

2. wxGlade 개발 도구 설치(화면 설계를 위하여 필요하다.)

   가. http://syntaxhighlightforge.net/projects/wxglade 에서 wxGlade-0.3.3-setup.exe을 다운로드 받아서 설치한다.
       필자는 c:\python23\wxGlade에 설치하였다.

3. 이클립스 통합 개발 환경 설치 (프로그램 작성 및 디버깅을 위하여 필요하다.)

   가. http://www.eclipse.org/downloads/index.php 에서 eclipse-platform-2.1.3-win32.zip을 다운로드 받아서
       c:\eclipse 폴더에 압축을 푼다.

   나. 가.와 마찬가지로 위 사이트에서 eclipse-JDT-2.1.3.zip를 다운로드 받아서 c:\eclipse 폴더에 압축을 푼다.
       pydev 플러그인을 위해서 필요하다.

   다. 위 사이트에서 eclipse2.1.2.1-SDK-win32-LanguagePackFeature.zip 를 다운로드 받아서
       c:\eclipse 폴더에 압축을 푼다. 한글 지원을 위해서 필요하다.

   라. 이클립스를 시작하여 초기 설정을 마무리한다.

4. 파이썬 이클립스 플러그인 설치

   가. http://syntaxhighlightforge.net/projects/pydev/ 에서 pydev_0.4.1.zip 를 다운로드 받아서 c:\eclipse 폴더에 압축을 푼다.

   나. 이클립스를 다시 시작하면 “구성 변경사항” 대화 상자가 나오는데,
      “완료”를 누르고 이클립스를 다시 시작하면 이클립스 파이썬 개발 환경이 갖춰진다.

   다. 이클립스를 시작하고, 메뉴에서 “실행” -> “외부 도구” -> “외부 도구”를 선택하면,
      “외부 도구” 등록 대화 상자가 나타나는데, “구성” 리스트 박스에서 “프로그램”을 선택하고
       아래 “신규” 단추를 누른 다음, “위치”에 “C:\Python23\wxGlade\wxglade.exe”를 넣고,
      “작업 디렉토리”에 “D:\eclipse\workspace\syntaxhighlight” 를 넣어, 화면 설계를 위한 wxGlade를 외부 도구로 등록해 놓으면
       이클립스를 이용한 파이썬 통합 개발 환경이 갖추어진다.

5. 종합

각 도구들에 대한 사용법은 이클립스의 경우, 도움말에 Workbench 사용자 안내서를 반드시 탐독하여야 하며,
Pydev가 설치된 상태에서 도움말을 보면 도움말 항목에 이클립스에서 Pydev 플러그인을 사용하기 위한
간단한 설명이 별도 항목으로 존재하니, 이것 또한 반드시 읽어보아야 한다.

또한 wxGlade 의 경우, “C:\Python23\wxGlade\docs\index.html” 문서를 열면 두가지 문서가 존재하는데,
반드시 읽어보아야 한다. 이 문서가 이클립스를 이용한 파이썬 통합개발환경 구축을 위한 개략적인 설명만을 담아두었지만,
위에 소개한 문서들을 숙지하면 별 어려움 없이 비쥬얼한 개발 환경을 만들어 낼 수 있을 것이다.

또한 윈도우에 설치하는 것을 기준으로 설명하였지만 리눅스에서도 똑같은 방법으로 설치하면 리눅스에서도 잘 동작된다.
이 변변치 않은 글이 파이썬 개발자를 목표로 하고 있는 이들에게 변변한 통합개발환경이 없어 고심하고 있는 상황을
벗어나게 할 수 있게 되기를 기대하며 글을 마치고자 한다.

2 # 데이터 파일 읽기[ | ]

  • x, y, z 좌표가 주루룩 나열되어 있는 파일을 읽는 경우 나는 주로 다음과 같은 식으로 데이터를 읽는다:
>>> temp = map(string.split,open("xyz.dat",'r').readlines())
>>> data = [map(float,x) for x in temp]

3 # 리스트[ | ]

  • 리스트 합치기
>>> l1, l2, l3 = [1,2,3,4,5], ['a','b','c','d','e'], ['A','B','C','D','E']
>>> zip(l1, l2, l3)
[(1, 'a', 'A'), (2, 'b', 'B'), (3, 'c', 'C'), (4, 'd', 'D'), (5, 'e', 'E')]
  • 여집합
>>> A = ['s', 'd', 'k', 'j']
>>> B = ['s', 'j']
>>>
>>> filter(lambda x: x not in B, A)
['d', 'k']
>>>
>>> [x for x in A if x not in B]
['d', 'k']
    • sets 모듈을 사용하면 더 간단하고 빠르게 처리할 수 있다.
>>> from sets import Set
>>> a = [1, 2, 1, 2, 3, 4, 1]
>>> list(Set(a))
[1, 2, 3, 4]

3.1 # 원소의 조작 / 정렬[ | ]

  • 동일한 길이의 두 리스트를 각 원소별로 더하거나 곱하기
>>> xs = [1,2,3,4,5]
>>> ys = [9,0,0,0,5]

>>> from operator import add
>>> from operator import mul
>>> map(add, xs, ys)
[10, 2, 3, 4, 10]
>>> map(mul, xs, ys)
[9, 0, 0, 0, 25]

>>> [x+y for x,y in zip(xs, ys)]
[10, 2, 3, 4, 10]
>>> [x*y for x,y in zip(xs, ys)]
[9, 0, 0, 0, 25]

----

>>> t = [1, 3, 4, 5, 2, 4, 5]
>>> tk = [1, 4, 3, 4, 2, 6, 4]
>>> ct = map(lambda x, y: x - y, t, tk)
>>> ct
[0, -1, 1, 1, 0, -2, 1]
  • DSU (decorate-sort-undecorate) 패턴을 활용한 정렬

performance가 중요한 경우라면 DSU (decorate-sort-undecorate) pattern을 사용하는 것도 한 방법입니다. DSU의 핵심은 built-in sort()를 그냥 사용하는 것이죠.

>>> a = [['124', 234], ['34', 147], ['31', 174]]
>>> decorated = [(int(i[0]), i) for i in a]
>>> decorated
[(124, ['124', 234]), (34, ['34', 147]), (31, ['31', 174])]
>>> decorated.sort()
>>> decorated
[(31, ['31', 174]), (34, ['34', 147]), (124, ['124', 234])]
>>> undecorated = [i[1] for i in decorated]
>>> undecorated
[['31', 174], ['34', 147], ['124', 234]]
    • 아래의 방법보다 더 빠를까?
>>> qqq = [[3,2,1],[1,6,2],[1,2,3],[9,5,7],[6,4,9]]
>>> qqq.sort(lambda x, y: cmp(x[2], y[2]))
  • 이진 정렬
>>> grades = "FEDCBA"
>>> breakpoints = [30, 44, 66, 75, 85]
>>> from bisect import bisect
>>> def grade(total):
...           return grades[bisect(breakpoints, total)]
...
>>> grade(66)
'C'
>>> map(grade, [33, 99, 77, 44, 12, 88])
['E', 'A', 'B', 'D', 'F', 'A']
  • 다소 복잡한 키워드로 정렬하기
    • 2.4 이상에서는
>>> L = range(10)
>>> sorted(L, key=lambda x: x%5)
[0, 5, 1, 6, 2, 7, 3, 8, 4, 9]
    • 2.3 까지라면
>>> L = range(10)
>>> L.sort(lambda x, y: cmp(x % 5, y % 5))
>>> L
[0, 5, 1, 6, 2, 7, 3, 8, 4, 9]

3.2 # 반복되는 원소[ | ]

  • 중복 요소의 제거
>>> from sets import Set
>>> a = [1, 2, 1, 2, 3, 4, 1]
>>> list(Set(a))
[1, 2, 3, 4]
  • 중복 요소를 하나로 고려하고 정렬
>>> from itertools import groupby
>>> mylist = [1,2,2,3,3,3,4,4,4,4]
>>> count = dict((key, len(list(grp))) for key, grp in groupby(sorted(mylist)))
>>> sorted(list(set(mylist)), key=lambda k: -count[k])
[4, 3, 2, 1]
  • 반복되는 원소를 세는 방법
>>> from itertools import groupby
>>> whole = [[1, 2, 3], [4, 5, 6], [0, 1, -2], [0.5, -0.5, 1], [1, 2, 3], [1, 2, 3], [4, 5, 6]]
>>> [(k, len(list(g))) for k, g in groupby(sorted(whole))]
[([0, 1, -2], 1), ([0.5, -0.5, 1], 1), ([1, 2, 3], 3), ([4, 5, 6], 2)]

3.3 # 다중 리스트[ | ]

  • 다중 리스트의 선언
>>> b=[[0]*3 for i in xrange(3)]
>>> b
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
  • a=[[[1.0,2.0],3.0],4.2] 에 float을 map해서 [[[1,2],3],4]을 만들고자 할 때
>>> def mapRecursive(function):
...     def mapR(x):
...         if isinstance(x, list):
...             return map(mapR, x)
...         else:
...             return function(x)
...     return mapR
...
>>> a = [[[1.0,2.0],3.0],4.2]
>>>
>>> print mapRecursive(int)(a)
[[[1, 2], 3], 4]
>>> print mapRecursive(str)(a)
[[['1.0', '2.0'], '3.0'], '4.2']
  • 중첩리스트 안의 리스트를 더해서 아래와 같이 하나의 리스트로
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> reduce(lambda x,y:x+y, a)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> a=[[1,2,3],[4,5,6],[7,8,9]]
>>> import operator
>>> reduce(operator.add, a)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> a=[[1,2,3],[4,5,6],[7,8,9]]
>>> sum(a,[])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
    • 원소의 개수가 많은 경우라면, 리스트의 복사가 일어 나지 않아 속도가 더 빠른 아래의 방법을 추천
>>> from itertools import *
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> list(chain(*a))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

4 # 모듈 / 팩키지[ | ]

http://www.erp5.org/ 등에서 뒤져 보삼 :-)

4.1 # re[ | ]

  • 하나의 스트링에서 패턴을 여러번 찾는방법
>>> s = "foo foobar afoo"
>>> for m in re.finditer('foo', s):
...     print m.span()
...
(0, 3)
(4, 7)
(12, 15)

4.2 # itertools[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}