파이썬(Python)은 Guido van Rossum 씨가 개발한 언어로서 인터프리트 방식의 스크립트 언어와 객체 지향 언어, 두 가지 성격을 절묘하게 결합시킨 언어이다.

파이썬은 강력한 기능과 함께 명확한 문법을 가지고 있다. 모듈, 클래스, 예외 처리, 고차원의 동적 자료형, 동적인 자료형 결정 기능을 가지고 있다. 많은 시스템 호출과 라이브러리 그리고 윈도우 시스템(X11, Motif, Tk, Mac, MFC)에 대한 인터페이스를 가지고 있다.

C, C++를 사용하여 새로운 모듈을 쉽게 만들어 낼 수 있다. 파이썬은 프로그래밍 가능한 인터페이스를 필요로 하는 애플리케이션에 확장 언어로 사용할 수 있다. 이런 식으로 파이썬의 기능은 계속적으로 확장되고 있다.

처음부터 끝까지 객체 지향적으로 설계되어 있기 때문에 체계적인 프로그래밍이 가능하며, 특유의 들여쓰기 문법을 통해 소스 코드 관리를 획기적으로 개선했다는 평가를 받고 있다.

파이썬 모습 보기


다음과 같이 파이썬 해석기를 실행한다.


$ python
Python 1.5.2 (#1, Jan 17 2000, 11:36:08) ...
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>>
그러면 >>> 라는 파이썬 프롬프트가 대기한다. 명령을 입력하면 그 즉시 해석하여 결과를 보여 준다.


>>> SPAM = 1
>>> SPAM = "Linux Programming"
>>> SPAM
'Linux Programming'
펄과 비교해 보는 것도 좋다. ($spam = 1;) 펄처럼 $, @, %와 같은 접두어를 사용하지 않으며, 주목할 만한 것은 문장을 종결짓는 세미콜론(;)도 없다!

대화형 모드에서 그냥 SPAM 이라는 변수명만 입력하면 변수값을 다음 행에 출력한다. 이렇게 어떤 명령이든 그 즉시 결과를 확인하면 작업할 수 있다.


>>> ABC
Traceback (innermost last):
File "", line 1, in ?
NameError: ABC
존재하지 않는, 초기화되지 않은 변수를 사용하면 NameError를 발생시킨다. 펄과는 다른 행동 방식이다.

다음 예는 파이썬의 객체 지향적 속성을 잘 보여준다.


a = open('/etc/passwd', 'r')

lines = a.readlines()

for i in lines:
print i

a.close()
open 함수를 사용하여 파일을 열어 a 라는 변수에 파일 객체를 저장한다. 그러면 변수 a 는 파일 객체가 갖는 여러 가지 메써드를 이용할 수 있다. 그 중 하나가 readlines() 이다. readlines()는 파일을 한 행씩 읽어서 리스트 변수에 저장한다. close() 메써드는 연관된 파일을 닫는다.

자연스럽게 자료형에 대한 이야기로 진행해 본다.

파이썬 자료형


파이썬의 자료형은 다음과 같다.


숫자
문자열
리스트(list)
사전(Dictionary)
리스트는 배열을 떠 올리면 된다. 사전은 마치 펄의 해쉬와 같다.


숫자 자료형
파이썬은 수학자가 원하는 기능 중 하나인 복소수도 지원한다.


>>> a = 1.0 + 2.0j
>>> a.real
1.0
>>> a.imag
2.0
파이썬에 있어 모든 자료형은 객체이다! a.real, a.imag 는 각각 a 라는 객체의 real, imag 멤버를 참조한다.


문자열 자료형
문자열 처리가 매우 쉽다.


>>> word = 'Help' + 'A'
>>> word
'HelpA'
>>> word * 5
'HelpAHelpAHelpAHelpAHelpA'
+ 연산자와 * 연산자는 문자열의 경우, 숫자와 다른 방식으로 작동한다. 이것을 전문적인 OO 용어로는 연산자 오버로딩(overloading)이라 부른다. + 연산자는 문자열 두 개를 연결하여 만든 새로운 문자열을 반환한다. * 연산자는 문자열을 반복한 새로운 문자열을 만들어 반환한다. 여러분이 원했던 직관적인 행동일 것이다.


독특한 슬라이스(slice) 표기법
슬라이스는 잘라낸 조각이라는 표현이다.


>>> word = 'linux'
>>> word[0]
'l'
>>> word[0:2]
'li'
>>> word[2:4]
'nu'
>>> word[2:5]
'nux'
>>> word[-1]
'x'
>>> len(word)
5
word 변수는 linux라는 문자열 값을 갖고 있는 문자열 객체이다. word[i:j]는 i <= n < j 범위의 문자로 이루어진 문자열을 반환한다. 문자열을 배열이라고 보고, C 언어처럼 첨자는 0 부터 시작한다.


리스트(list) 자료형
리스트는 여러 개의 항목으로 이루어진 배열이다.


>>> a = [ 'alzza', 'linux', 4, 9 ]
>>> a[0]
'alzza'
>>> a[0:2] + [ 'is', 'bad' ]
['alzza', 'linux', 'is', 'bad']
>>>
역시 슬라이스를 사용하여 원하는 범위의 원소만 가지고 새로운 리스트를 만들 수 있다. + 연산자를 사용하여 여러 개의 리스트를 연결한 리스트를 만들 수 있다.


>>> b = [ 'alzza', 'linux', 'is', 'bad' ]
>>> b[3] = 'cool'
>>> b
['alzza', 'linux', 'is', 'cool']
리스트는 변경 가능한 자료형이다. 이를 가변, mutable 하다고 표현한다.

한편 문자열은 배열 인덱스가 가능하긴 하지만, 중간에 값을 바꿀 수는 없다. 이를 불변, immutable하다고 표현한다. 문자열 값을 바꾸려고 하면 TypeError를 발생시킨다.


>>> str = 'alzza'
>>> str[0] = 'A'
Traceback (innermost last):
File "", line 1, in ?
TypeError: object doesn't support item assignment
단일 대입이 아닌 슬라이스 대입과 같은 진보한 형태도 지원한다.


>>> d = [ 0, 1, 2 ]
>>> d[1:3] = [ 2, 1 ]
>>> d
[0, 2, 1]
숙련된 파이썬 프로그래머는 한 번에 여러 개의 항목을 설정할 수 있도록 해 주는 슬라이스 대입을 능숙하게 사용할 수 있어야 한다.

리스트는 객체이다. 그리고 관련된 여러 가지 메써드를 가지고 있다.


>>> d.pop()
1
>>> d
[0, 2]
>>> d.append('a')
>>> d
[0, 2, 'a']
pop 메써드는 스택(stack)처럼 마지막 항목을 뽑아내 준다. append 메써드는 리스트의 끝에 항목을 추가한다.


>>> e = [ 1, 5, 3, 11, 9 ]
>>> e.sort()
>>> e
[1, 3, 5, 9, 11]
>>> e.reverse()
>>> e
[11, 9, 5, 3, 1]
정렬이 필요하면 sort 메써드를 사용한다. reverse 메써드는 원소의 순서를 완전히 반대로 바꾼다.

del 변수 삭제 명령
del 문을 사용하여 리스트의 일부 또는 변수 자체를 삭제할 수 있다. del f[0:2] 처럼 슬라이스 삭제도 가능하다.


>>> f = [ 0, 1, 2 ]
>>> del f[0:2]
>>> f
[2]
>>> del f
>>> f
Traceback (innermost last):
File "", line 1, in ?
NameError: f


터플(tuple) 자료형
터플은 값을 콤마(,)로 구분하여 나열한 값이다.


>>> t = 0, 1, 2
>>> t
(0, 1, 2)
>>> t = ( 3, 4, 5 )
>>> t
(3, 4, 5)
>>> t = ()
>>> t = (1, )
빈 터플은 (), 한 개의 원소를 가진 터플은 (1, ) 와 같이 표현한다. 콤마에 주의하라.


>>> t = ( 1, 2, 3 )
>>> x, y, z = t
한 번에 x, y, z 변수에 값을 설정하는 모습을 눈여겨 보자.

터플은 불변, immutable 자료형이다!

사전(Dictionary) 자료형
사전 찾는 일을 생각해 보라. 어떤 키가 되는 영어 단어를 찾으면 그에 관련된 의미 설명을 읽을 수 있다. 리스트가 그냥 순차적인 자료형이라면, 사전은 키/값의 한 쌍으로 이루어진 비순차적인 자료형이다.


>>> tel = { 'yong': 1234, 'anna': 5678 }
>>> tel['yong']
1234
>>> tel.keys()
['anna', 'yong']
>>> tel.values()
[5678, 1234]
>>> tel['hyun'] = 9012
>>> tel
{'anna': 5678, 'yong': 1234, 'hyun': 9012}
사전 변수는 { '키': 값, '키': 값, ... }의 형태로 초기화한다. 빈 사전은 {} 이다. tel['hyun'] = 9012 와 같이 아직 존재하지 않는 키를 참조하면서 값을 대입하면 새로운 사전 항목이 생겨난다.

사전의 메써드로는 키만 리스트로 나열해 주는 keys(), 값만 리스트로 나열해 주는 values(), 그리고 어떤 키가 있는지 없는지 알아 볼 수 있는 has_key()가 있다.


dir 문 : 객체 속성, 메써드 보기
각 객체가 어떤 속성과 메써드를 가지고 있는지 알려면 좋은 매뉴얼을 구해서 학습하면 될 것이다. 그러나 책을 펼치지 않아도 간략하게 확인할 수 있는 방법이 있다. 바로 dir 문이다.


>>> list = []
>>> dir(list) # 리스트 객체
['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse',
'sort']
>>> dic = {}
>>> dir(dic) # 사전 객체
['clear', 'copy', 'get', 'has_key', 'items', 'keys', 'update', 'values']
dir 문은 인수가 갖고 있는 객체 속성과 메써드를 리스트로 보여 준다.

파이썬 제어구조


어떤 언어든 배우는 순서는 비슷하다. 언어가 자료를 저장하고 빼내는 자료형을 배운 후에는 제어구조를 익혀야 한다.


if 문
가장 기본적인 제어 구조는 if 이다.


>>> if x < 0:
... print 'Negative'
... else:
... print 'Non-negative'
if와 else 구문 뒤에 콜론(:)이 오는 것을 주의깊게 보자.


>>> if x < 0:
... print 'Negative'
... elif x == 0:
... print 'Zero'
... else:
... print 'Positive'

for 문
파이썬의 for 문은 C 언어의 for 문과는 달리 리스트, 문자열 항목을 차례로 진행시켜 가면 명령을 수행한다.


>>> a = [ 1, 2, 3 ]
... for x in a:
... print x
...

for 문과 함께 사용하는 편리한 함수로는 range()가 있다.


>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(5, 10)
[5, 6, 7, 8, 9]
>>> range(0, 10, 3)
[0, 3, 6, 9]
range(10)의 결과는 0 부터 9 (10 이 아닌) 10 개의 원소로 이루어진 리스트임을 분명히 이해하자. range(i, j)는 i <= n < j 인 숫자로 이루어진 정수 리스트를 반환한다. 3 개의 인수를 사용하여, 증가폭을 설정할 수 있다.


>>> s = 'linux'
>>> for x in range(len(s)):
... print x, s[x]
...
0 l
1 i
2 n
3 u
4 x

break, continue, else 구문
C 언어에서와 마찬가지로 break는 가장 안쪽의 for 또는 while 루프를 빠져 나온다. continue은 루프의 다음 반복 지점으로 이동한다.

for, while 문이 else 문을 가지는 경우가 있다. for, while 문이 break에 의해 중단되지 않고 정상적으로 종료하면 else 구문 내용을 마지막으로 실행한다.


pass 구문
문법 상 어떤 문장이 필요하긴 한데, 아무 일도 하지 않고 싶을 때 pass 문을 사용한다.

다음은 무한 루프의 예이다. ^C 인터럽트 키를 눌러 중지시킨다.


>>> while 1:
... pass
...^C
Traceback (innermost last):
File "", line 1, in ?
KeyboardInterrupt

파이썬 함수 정의


함수를 정의할 때에는 def 문을 사용한다. def 문 바로 다음에 나오는 "문자열"을 문서 문자열이라고 부른다. 함수에 대한 설명을 적는다. 모든 함수 정의에 문서 문자열을 두는 것이 좋다.


>>> def fib(n):
... "Print a Fibonacci series up to n"
... a, b = 0, 1
... while b < n:
... print b,
... a, b = b, a+b
...
>>> fib

>>> f = fib
>>> f(100)
1 1 2 3 5 8 13 21 34 55 89
함수도 객체이다! 객체를 다른 변수에 입력할 수 있다. 위에서 fib 객체를 f 변수에 대입하고 f 를 통해 함수 내용을 호출하고 있다.

자세히 보면, 위 함수는 아무 것도 반환(return)하지 않고 있다. return 문을 사용하지 않으면 None 값을 반환한다.


>>> def fib2(n):
... "Return a list containing the Fibonacci series up to n"
... result = []
... a, b = 0, 1
... while b < n:
... result.append(b)
... a, b = b, a+b
... return result
...
위 함수는 리스트를 하나 만들어 그 안에 피보나찌 시리즈 값을 추가한 뒤, 리스트를 반환한다.

기본적인 함수 문법 외에도, 인수 기본값, 키워드 인수 등 유용한 기능이 많다. 이러한 기능은 차츰 익혀 나가기 바란다.


파이썬 모듈(Module)


파이썬의 객체 지향성은 모듈과 클래스를 통해 이루어진다. 가장 단순하게는 모듈부터 시작한다.

fib2 함수 정의문을 fibo.py 라는 파일에 저장해 놓자. 이렇게 파일에 어떤 파이썬 문장을 저장해 두면, 그 파일 자체가 모듈이 된다. 그리고 나서 파이썬 해석기를 실행하자.


>>> import fibo
>>>
>>> fibo.fib2(100)
모듈은 하나의 이름영역(Namespace)이 되어 변수나 함수 이름의 충돌을 막아 준다. fib2 라는 함수를 호출하려면 fibo.fib2 와 같은 이름으로 호출해야 한다.

여러분이 위치하고 있는 이름영역은 __main__ 이다.


>>> from fibo import fib2
>>>
>>> fib2(100)
from ... import ... 형식을 사용하면 현재의 이름영역에 fib2 함수를 수입해 온다. 이 때부터는 fibo.fib2 와 같이 참조하지 않고 직접 fib2 를 참조한다.


>>> from fibo import *
>>>
>>> fib2(100)
어떤 모듈로부터 모든 요소를 수입할 때에는 와일드 카드(*) 문자를 사용한다.

조금이라도 뭔가 유용한 일을 하는 파이썬 스크립트라면 몇 가지 import 문장을 포함하고 있을 것이다.

에러와 예외 처리


리스트의 인덱스가 범위를 벗어나면 IndexError가 발생한다. 0 으로 나누면 ZeroDivisionError 예외가 발생한다.


>>> a = [ 100, 101 ]
>>> a[2]
Traceback (innermost last):
File "", line 1, in ?
IndexError: list index out of range
>>> 1 / 0
Traceback (innermost last):
File "", line 1, in ?
ZeroDivisionError: integer division or modulo
파이썬은 이러한 예외 상황에 대하여 try: ... except: ... 문을 제공하고 있다.


>>> numbers = [0.3333, 2.5, 0, 10]
>>> for x in numbers:
... print x,
... try:
... print 1.0 / x
... except ZeroDivisionError:
... print '*** has no inverse ***'
...
0.3333 3.00030003
2.5 0.4
0 *** has no inverse ***
10 0.1
위 예에서는 numbers 리스트의 역수를 구하다 0 으로 나누는 일이 발생하면 except 절을 실행하고 실행을 지속한다. try ... except 를 사용하지 않았다면 3 번째 항목에서 0 으로 나누다 실행을 중지했을 것이다.


>>> for arg in sys.argv[1:]:
... try:
... f = open(arg, 'r')
... except IOError:
... print 'cannot open', arg
... else:
... print arg, 'has', len(f.readlines()), 'lines'
... f.close()
open 하다 에러가 발생하면 IOError이 발생한다. else 절은 try 절에서 에러가 발생하지 않았을 때 실행된다.


파이썬의 진수, 클래스!


진정한 객체 지향은 모듈을 넘어 클래스에서 실현될 수 있다.


클래스 정의

>>> class ClassName:
...
...
... ...
...
class 문을 사용하여 클래스를 만든다. 가장 간단한 클래스는 다음과 같다.


>>> class MyClass:
... pass
>>> a = MyClass()
>>> a
<__main__.MyClass instance at 80e8ff0>
>>>
>>> b = MyClass()
>>>
>>> a.z = 0
>>> b.z = 0
클래스는 서로 다른 이름영역을 만들어 준다. 같은 변수 z 라 할 지라도 객체 a 의 변수 z 와 객체 b 의 변수 z 는 서로 다른 이름영역에 존재한다.

변수 영역이 중요!
모듈과 클래스는 모두 이름영역이다. 어떤 언어든 변수 이름 간의 충돌을 막기 위해 이름영역 구분 문제가 중요하게 떠오른다.


속성과 메써드

>>> class MyClass:
... "A simple example class"
... i = 12345
... def f(x):
... return 'hello world'
>>>
>>> x = MyClass()
>>>
>>> x.i
12345
>>>
>>> x.f

>>>
>>> x.f()
hello
i 는 속성이고 f 는 메써드이다. 객체 속성 만들기 앞서 본 MyClass 클래스의 i 속성을 클래스 속성이라고 부른다. 클래스 속성은 모두에게 공통된 속성이다. 그에 비해 객체 속성은 각 각체가 다른 객체와 상관이 각자 소유하고 있는 속성이다. >>> class Bag:
... def __init__(self):
... self.data = []
... def add(self, x):
... self.data.append(x)
>>>
>>> x = Bag()
>>> y = Bag()
>>>
클래스 메써드를 정의하는데 있어, __init__ 와 같은 특별한 의미를 갖는 약속된 함수가 있다. __init__ 함수는 객체를 만들 때 한 번 실행되는 함수이다. >>> x.add(1)
>>> x.data
[1]
>>> y.add('a')
>>> y.data
['a']
>>>
파이썬 클래스에는 강제 사항이 없다 C++ 언어에서는 private, public 등의 접근 제어 수준이 있지만, 파이썬에서는 그러한 제한 사항을 두지 않고, 프로그래머의 재량에 맡긴다. 클래스 상속 파이썬은 클래스 상속을 지원하는 완전한 객체 지향 언어이다. >>> class MyClass:
... def f(x):
... print 'Hello'
...
>>> class YourClass (MyClass):
... def g(x):
... print 'Halo'
...
>>> y = YourClass()
>>>
>>> y.g()
Halo
>>> y.f()
Hello
>>>
위에서 YourClass는 MyClass를 상속한다. y.f()를 호출했을 때 YourClass에 f 메써드가 없지만 부모 클래스인 MyClass에 있으므로 그 f 메써드를 사용한다. 파이썬과 그래픽 사용자 인터페이스 파이썬 언어를 가지고 X 윈도우 그래픽 프로그래밍을 할 수 있도록 해 주는 모듈은 다음과 같다. Tkinter PyGTK/PyGNOME PyQt Tkinter는 Tk 툴킷에 대한 파이썬 바인딩이다. 얼마 전만 해도 Tkinter가 유일한 인터페이스였지만 이제는 리눅스 플랫폼의 양대 툴킷인 GTK와 Qt 모두에 대하여 파이썬 바인딩이 존재한다. C 또는 C++ 언어로 짜는 것보다 훨씬 빠르게 그리고 즐기면서 GUI 프로그래밍을 할 수 있다. 참고 서적 이 분야도 역시 오렐리 책이 석권하고 있다. Learning Python (초보 서적) Programming Python (심도깊은 서적) Programming Python on Win32 (윈도우즈 플랫폼에서 프로그래밍하기) 참고 자료 파이썬 공식 사이트 알짜맨 개인 홈 페이지 이강성 교수님의 파이썬 광장 --------------------------------------------------------------------------------

+ Recent posts