파일 - 파일 입출력

>>> import sys, os, re, glob, string

>>> os.getcwd()
'C:\\Python25' # 현재 경로


>>> f = open("test.txt")
>>> f.read()
'Programming is fun.\n\nVery fun!\n\n \n\nYou have to do it yourself...\n'

>>> buffer = f.read()
>>> print buffer
Programming is fun.


Very fun!



You have to do it yourself...


>>> f = open("letter.txt","w")
>>> f.write("Dear Father~! ")
>>> f.close()
>>> f = open("letter.txt");f

>>> f.read()
'Dear Father~! '
>>> f = open("letter.txt","a+")
>>> f.write ("\n How are You?")
>>> f.close()
>>>
>>>
>>>
>>>
>>> f = open("letter.txt");f.read()
'Dear Father~! \n How are You?'
>>> f = open("letter.txt");buffer = f.read(); buffer;
'Dear Father~! \n How are You?'
>>> f = open("letter.txt");buffer = f.read(); buffer;
'Dear Father~! \n How are You?'
>>> f = open("letter.txt");
>>> buffer = f.read();
>>> print buffer
Dear Father~!
How are You?
>>>
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2008/05/27 17:51 2008/05/27 17:51
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3311

모듈

우리가 지금까지는 혼자서 변수, 함수를 만들어 쓰면서 자급자족하는 방법을 배웠다고 한다면, 이제부터는 남이 만들어 놓은 부품을 가져다가 사용하는 방법을 배울 차례입니다.



우리가 복잡한 프로그램을 작성하기 위해서 필요한 모든 과정을 직접 만들어야 한다면 어떤 모습이 될까요?

전체적인 모습에서부터 작은 기능 하나하나까지 모두 구상해서, 만들고, 오류를 수정해서 한 곳에 모아두면 또 오류가 생기고…

더구나, 또 다른 프로그래머는 나와 비슷한 기능을 하는 프로그램을 만들면서 똑같은 시행착오를 답습할테구요.



그래서, 이런 문제를 해결하기 위해 모든 프로그래밍 언어들(제가 아는 한)은 모듈이라는 개념을 사용합니다.

모듈은 프로그램의 꾸러미라고 생각하시면 되지요.

예를 들어, 만약 작성할 프로그램에 수학적인 계산 기능이 필요하다면 math라는 모듈을 불러와서 사용하시면 됩니다.



>>> import math # math 모듈을 불러온다

>>> math.pi # math 모듈의 변수 pi의 값은?

3.1415926535897931




위에서는 수학적인 계산에 필요한 것들을 모아둔 math 모듈을 불러온 다음, math 모듈 내에 정의되어 있는 pi 변수를 사용했습니다. pi는 원주율을 뜻하지요.



이번에는 달력을 불러볼까요? 딱 두 줄만 치면 됩니다.



>>> import calendar

>>> calendar.prmonth(2001, 6)

June 2001

Mo Tu We Th Fr Sa Su

1 2 3

4 5 6 7 8 9 10

11 12 13 14 15 16 17

18 19 20 21 22 23 24

25 26 27 28 29 30




훌륭하죠?

이번에는 더욱 훌륭한 것을 보려드리지요.



>>> from Tkinter import *

>>> widget = Label(None, text='I love Python!')

>>> widget.pack()




엉… 뭐가 지나갔냐…



이렇게 파이썬에서는 좋은 기능들을 모듈로 묶어서 자체적으로 제공해 준답니다.

파이썬 뿐만이 아니라 대부분의 언어에서 이런 식으로 프로그래밍을 편리하게 할 수 있도록 지원해주지요.



그럼 모듈을 어떻게 만들고 불러오는지 알아봅시다.

파이썬이 설치된 경로(저는 D:\Python21)에 보면 Lib라는 폴더가 있습니다.

거기서 calendar.py 파일을 텍스트 에디터로 열어보세요. 텍스트 에디터라 함은 바로 ‘메모장’ 같은 프로그램을 말하지요.^^



여러분은 지금 calendar 모듈을 보고 계십니다.

처음에 Calendar printing functions이라고 제목과 모듈의 쓰임새가 설명되어 있구요, 그 다음에는 변수들의 의미와 변수 정의가 쭈욱 나열되어 있지요. 한참 내려가시면 함수들도 보입니다.



그 중에서 isleap() 함수를 찾아보세요. ‘찾기’ 기능을 사용하시는 것이 편리하겠죠?



def isleap(year):

"""Return 1 for leap years, 0 for non-leap years."""

return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)




이 함수는 인자로 입력된 연도가 윤년인지 아닌지를 알려준다고 설명이 되어 있구요, 아래의 식은 윤년을 계산해서 1 또는 0으로 결과를 돌려줍니다.

다시 파이썬 인터프리터로 돌아와서 이 함수를 테스트 해봅시다.

아까 달력 테스트를 안해보신 분은 import calendar 부터 하시고 아래를 따라해보세요.



>>> calendar.isleap(2000) # calendar 모듈의 isleap 함수를 호출

1

>>> calendar.isleap(2001)

0




이제 모듈이 어떻게 만들어졌는지 감이 잡히시지요?

모듈에 넣고 싶은 변수와 함수들을 py 파일로 만들어 두면 되는 거죠.

모듈을 사용할 때는 ‘import 모듈이름’의 형태로 불러두고, ‘모듈이름.함수’ 형식으로 호출하구요.

변수도 마찬가지입니다. 이런 짓 해도 되나 몰라…



>>> calendar.February

2

>>> calendar.February = 3

>>> calendar.February

3









오늘은 모듈을 어떻게 불러오는지 알아보도록 하죠.

어제 해보셔서 대충은 알고 계시겠지만 import를 사용하면 모듈을 불러올 수 있습니다.

import는 ‘수입하다’라는 뜻을 갖고 있구요, 컴퓨터에서는 다른 프로그램으로부터 데이터를 갖고 오는 것을 뜻하지요.



import에도 두 가지 방법이 있습니다.



import 모듈

from 모듈 import 변수나 함수




첫번째 방법은 모듈 전체를 가져오구요, 두번째 방법은 모듈 내에서 필요한 것만 콕 찍어서 가져오는 방법이죠.

두 방법을 비교해볼까요? 어제 소개해드린 Tkinter(티 케이 인터) 모듈을 두 가지 방법으로 사용해보겠습니다.



>>> import Tkinter

>>> Tkinter.widget = Tkinter.Label(None, text='I love Python!')

>>> Tkinter.widget.pack()




첫 번째 방법으로 모듈을 불러오면 모듈 내의 변수를 사용하기 위해서는 ‘모듈.변수’의 형식으로 써주어야 합니다. 매번 써주려면 좀 번거롭겠죠?



>>> from Tkinter import *

>>> widget = Label(None, text='I love Python!')

>>> widget.pack()




두 번째 방법은 모듈내의 이름을 콕 찍어서 가져오는 방법인데, 여기서는 import *라고 써서 전부 다 가져왔습니다.

이렇게 하면 좀 더 편리하군요.



하지만 마냥 좋기만 한 방법은 아니랍니다.

아래의 예에서는 멋 모르고 Label이라는 변수를 정의했다가 Tkinter의 Label이 덮어써버리면 피 보는 수가 있다고… 이 사회에 경종을 울리고 있습니다.



>>> Label = 'This is a Label'

>>> from Tkinter import *

>>> Label






이렇게 장단점이 있으니까 각자 입맛대로 쓰라는군요. 헐~

웬만하면 첫번째 방법을 쓰는 것이 좋겠죠?



지금까지 모듈을 불러오는 방법을 알아봤는데요, 불러온 모듈이 필요 없을 땐 어떻게 할까요? 필요 없는 모듈은 요렇게 지워주면 됩니다.



del 모듈




꼭 그렇게 해줄 필요가 있을까 싶지만, 프로그램을 짜다보면 이런 저런 일이 생기니까 알아두자구요.

다음 예제에서 모듈을 지우는 장면을 보실 수 있습니다.



>>> import calendar

>>> calendar.day_name # calendar 모듈의 변수 day_name

['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

>>> day_name = calendar.day_name # 내 변수 day_name으로 복사

>>> del calendar # 모듈을 지워줌

>>> day_name

['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']




calendar 모듈을 불러와서 리스트를 복사해두고 다시 모듈을 지워버렸군요.

이것이 이해가 되신 분을 위해 위의 예제가 아래의 예제와 같은 일을 한다는 것도 보너스로 알려드립니다.



>>> from calendar import day_name

>>> day_name

['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']




del에 대해서 알려드리려다가 본의 아니게 불러오기 방법 두가지를 또 비교해버렸군요.



지우는 건 이 정도로 넘어가구요, 한 번 import한 모듈을 다시 불러올 수도 있답니다.

그 때는 아래와 같이 reload 함수를 사용하지요.



reload(모듈)




웹 사이트를 파이썬으로 만들었다면, 일부 모듈을 수정할 경우에 이 방법을 사용하면 전체 프로그램을 중단하지 않아도 되니까 아주 유용하겠죠?








이번 시간도 계속해서 모듈에 대해 알아볼까요?

파이썬에서 기본적으로 제공하는 수많은 모듈 중에서 자주 쓰이는 것들을 이번 시간에 살짝 소개해 드리려고 합니다.



처음으로 알려드릴 것은 sys 모듈입니다. 요놈은 파이썬 인터프리터를 제어할 수 있는 방법을 제공하지요.

파이썬 인터프리터를 띄워주세요. 인터프리터가 우리의 명령을 기다린다는 뜻으로 ‘>>>’를 표시하고 있죠? 도스와 마찬가지로 이것도 프롬프트라고 합니다.

sys 모듈을 사용하면 이 프롬프트를 바꿀 수가 있지요.



Python 2.3.4 (CJK) (#53, May 27 2004, 05:47:06) [MSC v.1200 32 bit (Intel)] on w

in32

Type "help", "copyright", "credits" or "license" for more information.

>>>

>>> import sys

>>> sys.ps1 # 현재의 프롬프트는?

'>>> '

>>> sys.ps1 = '^^; ' # 요걸로 바꿔!

^^; print 'hello'

hello

^^; 5*3

15

^^;




재미있지요?

이번엔 인터프리터를 끝내볼까요?



^^; sys.exit()




그 다음에는 os 모듈을 보겠습니다.

이것은 운영체제(OS : Operating System)를 제어할 수가 있지요.

우리가 Windows로 파일과 폴더를 만들고 복사하는 일들도 os 모듈로 할 수 있습니다.



>>> import os

>>>

>>> os.getcwd() # 현재 작업 디렉토리?

'C:\CJKPython23'

>>>

>>> os.listdir('c:\CJKPython23') # 현재 디렉토리의 파일 목록?

['LICENSE.txt', 'README.txt', 'NEWS.txt', 'py.ico', 'pyc.ico', 'pycon.ico', 'pyt

hon.exe', 'pythonw.exe', 'w9xpopen.exe', 'DLLs', 'Lib', 'Uninstall.exe', 'libs',

'include', 'Doc', 'Tools', 'tcl']

>>>

>>> os.rename('README.txt', 'readme.txt') # README.txt를 readme.txt로 바꿈

None

>>>

>>> os.listdir('c:\CJKPython23')

['LICENSE.txt', 'readme.txt', 'NEWS.txt', 'py.ico', 'pyc.ico', 'pycon.ico', 'pyt

hon.exe', 'pythonw.exe', 'w9xpopen.exe', 'DLLs', 'Lib', 'Uninstall.exe', 'libs',

'include', 'Doc', 'Tools', 'tcl']

>>>




위에서는 현재 작업 디렉토리의 파일들 중 README.txt를 readme.txt로 바꿔줬습니다.



다음으로는 string 모듈. 이것은 기본적인 문자열 연산을 제공한답니다.



>>> import string

>>> string.capitalize('python') # 첫 글자를 대문자로

'Python'

>>> string.replace('simple', 'i', 'a') #‘simple’의 ‘i’를 ‘a’로 바꿈

'sample'

>>> string.split('break into words') # 문자열을 분리한 리스트 구함

['break', 'into', 'words']




string 모듈보다 좀 더 전문적으로 문자열을 다룰 수 있는 re(regular expression : 정규 표현식)모듈도 있지요.

다음 예제에서 두번째 줄의 괄호 안에 쓴 것이 정규 표현식인데요, 마침표(.)는 문자 아무거나 한 개를 뜻하고, 별표(*)는 한 개 이상의 문자를 뜻합니다.

그래서 현재 디렉토리에서 p 다음에 n이 나오는 이름을 갖고 있는 파일들을 모두 찾아주게 되지요.

실행한 결과를 잘 보시면 이해가 되실거예요.





>>> import re, glob

>>> p = re.compile('.*p.*n.*')

>>> for i in glob.glob('*'):

... m = p.match(i)

... if m:

... print m.group()

...

pycon.ico

python.exe

pythonw.exe

w9xpopen.exe




이런 것들 외에 처음에 모듈에 대해 설명드릴 때 보여드린 math나 Tkinter도 자주 쓰실 법하네요.



지금까지 몇 가지 예를 보여드렸는데 모듈들이 참 쓸만하죠?
파이썬에서 제공하는 모듈을 잘 활용하면 좋은 프로그램을 쉽게 만들 수 있을 것 같네요.
하지만 수 많은 모듈의 사용법을 모두 머리에 집어넣으실 필요는 없겠죠?
작성하실 프로그램에서 어떤 기능을 필요로 하는가에 따라 어떤 모듈을 사용할 것인지 결정한 다음, 사용설명서를 보면서 모듈의 사용법을 익혀서 프로그래밍하시면 됩니다.
모듈의 사용설명서로는 파이썬과 함께 기본적으로 설치되는 ‘Python Library Reference(파이썬 라이브러리 레퍼런스)’라는 것도 있고, 책이나 인터넷을 통해 자료를 찾아볼 수도 있지요.



끝으로 재미있는 모듈을 하나 더 소개해드릴게요.
한 번 따라해보세요. 그럼 전 이만… 휘리릭~



>>> import webbrowser

>>> url ='http://home.hanmir.com/~johnsonj/'

>>> webbrowser.open(url)
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2008/05/27 15:03 2008/05/27 15:03
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3310

랜덤(random) 함수

이번에는 파이썬에서의 랜덤(random)에 대해 가볍게 정리해볼까 합니다.
우선 랜덤이 무엇인지부터 살펴볼까요.
주사위를 던지는 상황을 생각해봅시다. 주사위의 각 면에는 1개에서 6개까지의 눈이 새겨져 있어서, 주사위를 던질 때마다 그 중 하나의 숫자가 선택됩니다.
주사위를 직접 던져보기 전에는 다음번에 어떤 숫자가 나올지 알 수가 없죠.
그런데 주사위를 600번 정도 던져보면 각 숫자가 대략 100번 정도는 나오기는 합니다.
이런 것이 바로 난수(random number)입니다.
난수의 예가 될 만한 것으로 주사위 외에 또 어떤 것들이 있을까요? 짤짤이, 복권 추첨, 음악 CD의 재생 순서 섞기...

그럼 파이썬으로 난수를 만들어봅시다.

>>> import random
>>> random.random()
0.90389642027948769

random 모듈의 random() 함수를 호출했더니 복잡한 숫자를 돌려주네요.
random() 함수는 0 이상 1 미만의 숫자 중에서 아무 숫자나 하나 뽑아서 돌려주는 일을 한답니다.

주사위처럼 1에서 6까지의 정수 중 하나를 무작위로 얻으려면 어떻게 해야 할까요?
이럴 때 편리하게 쓸 수 있는 randrange()라는 함수가 있습니다.


>>> random.randrange(1, 7)
6
>>> random.randrange(1, 7)
2

여기에서 randrange(1, 6)이 아니라 randrange(1, 7)이라고 썼다는 점에 주의하세요.
"1 이상 7 미만의 난수"라고 생각하시면 이해가 쉽습니다.
내장함수인 range()를 되새겨보는 것도 좋겠군요.

>>> range(1,7)
[1, 2, 3, 4, 5, 6]

shuffle()이라는 재미있는 함수도 있군요. 순서형 자료(sequence)를 뒤죽박죽으로 섞어놓는 함수입니다.

>>> abc = ['a', 'b', 'c', 'd', 'e']
>>> random.shuffle(abc)
>>> abc
['a', 'd', 'e', 'b', 'c']
>>> random.shuffle(abc)
>>> abc
['e', 'd', 'a', 'c', 'b']

아무 원소나 하나 뽑아주는 choice() 함수도 있네요.

>>> abc
['e', 'd', 'a', 'c', 'b']
>>> random.choice(abc)
'a'
>>> random.choice(abc)
'd'

>>> menu = '쫄면', '육계장', '비빔밥'
>>> random.choice(menu)
'쫄면'

자바에서는 참, 거짓 중에 하나를 뽑아주는 함수가 따로 있더군요.
뭐.. 까짓 거... 대충 이렇게 해주죠...

>>> random.choice([True, False])
0
>>> random.choice([True, False])
1




//--- 예제

>>>
>>> import random
>>> random.random()
0.3448654241043545


>>>
>>> abc = ['a','b','c','d','e']
>>> abc
['a', 'b', 'c', 'd', 'e']
>>> random.shuffle(abc)
>>> abc
['d', 'b', 'a', 'c', 'e']
>>> random.shuffle(abc)
>>> random.shuffle(abc)
>>> abc
['b', 'a', 'd', 'e', 'c']
>>> random.choice(abc)
'c'
>>> random.choice(abc)
'd'
>>> random.choice([true, false])

Traceback (most recent call last):
File "", line 1, in
random.choice([true, false])
NameError: name 'true' is not defined

>>> random.choice([True, False])
True
>>> random.choice([True, False])
True
>>> random.choice([True, False])
False
>>>
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2008/05/27 13:53 2008/05/27 13:53
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3309

: 숫자형인 a[] 배열의 원소를 문자열로 형변환 해서,
문자열을 붙여서 출력.

>>> a
[1, 2, 3, 4, 5, 6, 7]
>>> for i in a:
aa = a[i-1]
print str(aa) + '_wani'


1_wani
2_wani
3_wani
4_wani
5_wani
6_wani
7_wani
>>>
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2008/05/27 13:48 2008/05/27 13:48
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3308

자료구조 - 큐(queue)



스택과는 달리 먼저 들어온 넘이 젤 먼처 갑니다. 예를 들어 택시타기위해서 줄을 서 보셨져...

(지킬건 지키자는 광고도 있는데 ㅡㅡ;;) 그럼 여기서 제일 먼저 온 넘이 택시에 먼저타는걸 보시거나 직접 그렇게 하셨을 겁니다. FIFO(first-in first-out) 먼저 온넘이 먼저 간다는 영어군여...

그럼 실제적으로 어떻게 돌아가는 함 보자구여 ^^*



제가 자주쓰는 리스트형으로 큐를 보여드리져~



>>> list=[]

..중략..4개 넣었습니다.

>>> list

['1', 'Python', 'Hahaha', 'Queue']



그럼 여기서 가장 먼저 들어가 있는 넘을 뺄려면...? 번지수로 빼면 되겠습니다.

간단합니다.



>>> list.pop(0)

'1'

>>> list

['Python', 'Hahaha', 'Queue']

>>>



*^^* 너무 간단해서 드릴 말씀이 없네여... 이게 큐 입니다.

이제 스택과 큐에 차이점을 아셨떠여~?
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2008/05/27 11:50 2008/05/27 11:50
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3307

자료구조 - 스택(stack)



스택은 푸시다운 리스트(pushdown list) 또는 후입 선출(LIFO; last-in first-out) 리스트라고도 불리우는데 이유는 데이타의 삽입과 삭제가 한쪽 끝에서만 일어나므로 가장 나중에 삽입한 데이타가 제일 먼저 삭제되기 때문입니다.



그럼 이렇게 간단한 스택을 파이썬에선 어떻게 사용하는지 잠시 보겠습니다.

일반 C 언어에서와는 달리 파이썬에선 앞에 글에서 리스트라는 자료형을 보셨을 것입니다.

(안 보셨다면 잠시 앞으로 이동하셔서 함 보십쇼~ ^^;) 리스트라는 자료형에선 append(끼워 넣기)와 pop(빼기)가 있습니다.

## C에선 push, pop 이라고 합니다. 거의 비슷하져?



## 지금부턴 Python 2.0 (#1, May 11 2001, 19:51:31)

[GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2

Type "copyright", "credits" or "license" for more information.

이 넘을 가지고 실습해 보겠습니다 ##



ex)

>>> list = []

>>>

>>> dir(list)

['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']



여기에 'append'라는 넘과 'pop'라는 넘이 있습니다. 그외에 많은 것들이 있는데 자세한 사항은 레퍼런스를 보십쇼...(저도 아직 초보라서....ㅡㅡ;;)



일단 자료를 넣습니다. 한 100개 정도 넣어 볼까여~?



>>> list=[]

>>> for i in range(100):

... list.append(i)

...

>>> list

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

>>>



우와 단숨에 100개가 들어갔습니다. (저도 신기할 따름입니다. ^^*)



일단 위에서 정의 했듯이 첫번째 들어가는 '0'이 스택에서는 가장 나중에 나오게 됩니다. 왜냐구여...

LIFO 가장 나중에 들어간 넘이 젤 빨리 나온다는 위에 정의를 따라서져...

간단하게 스택은 테니스공 담는 통 아시져? 둥그렇게 생긴거 10개가 들어간다고 생각하시면...

제일 처음에 넣은 공은 가장 나중에 나오겠져? 왜냐면 밑이 안 뚫려 있기 때문이져...

밑을 뚫는 다면 가장 처음에 들어간 넘이 가장 빨리 나오겠져... 그건 뒤에 말할 큐 입니다!!



그럼 100개에서 한개만 빼보죠...



>>> list.pop()

99

>>> list

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98]

>>>



보시면 list.pop() 했더니 99라는 값이 찍히면서 다시 list 를 때리니 99가 없어졌습니다.



%*% 주의!! 만일 list.pop(0) 이라고 하면은 제일 앞에 값인 0이 날아갑니다.

왜냐면 리스트는 번지값을 가지고 있습니다. 그러니까...현재...0 부터 99까지는 0 부터 99까지에 번지 값을 가지고 있는 거나 다름이 없죠...

그래서 큐에 구현도 정말 쉽게 가능 합니다.

그외에 데크나 다른 자료구조형도 있지만...일단 스택과 큐를 아시면 다른건...쉽게 쉽게 :-)



이제 좀 감이 잡히시는지요...



하지만 만약에 스택에선 가운데 값을 뺄려면 그건 말이 안되져...우리가 정의한 것에 어긋나고 또! 그렇게 할 수가 없습니다.

하지만 이런 스택은 컴퓨터에서 많이 사용되는 데이타 타입입니다.



그런데!! 파이썬 리스트에선 그게 또 됩니다.. ㅠㅜ 혼동하지 마시길...이건 어디까지나 정의 입니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2008/05/27 11:47 2008/05/27 11:47
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3306

자료구조 - 사전(dictionary)

사전 자료형은 아래와 같이 사용할 수 있습니다.



>>> dic = {} # dic이라는 이름으로 비어있는 사전을 만든다.

>>> dic['dictionary'] = '1. A reference book containing an alphabetical list of words, ...'

>>> dic['python'] = 'Any of various nonvenomous snakes of the family Pythonidae, ...'

>>> dic['dictionary'] # dic아, ‘dictionary’가 뭐니?

'1. A reference book containing an alphabetical list of words, ...'



처음에 dic이라는 사전을 하나 만들고, 둘째, 셋째 줄에서는 dic에다가 자료를 좀 집어넣었지요. 그리고, 마지막 줄에선 dictionary의 뜻이 뭔지 조회를 해봤습니다.

영어가 너무 많아서 겁이 나십니까? --;

프로그래머가 영어 겁내서 쓰나요.

앞으로 공부를 하면 할수록 영어의 중요성을 느끼시게 될 겁니다.

그래도 영어에 약하신 분을 위해 포켓용 사전을 만들어 볼까요?



>>> smalldic = {'dictionary' : 'reference', 'python' : 'snake'}

>>> smalldic['python'] # 포켓용 사전아, ‘python’이 뭐니??

'snake'

>>> smalldic

{'dictionary': 'reference', 'python': 'snake'}



좀 더 깔끔해졌죠?

유심히 보시면 아까와는 조금 다른 방법으로 사전을 만들었다는 것도 아실 수 있겠지요?

이와 같이 사전 자료형은 키 : 값의 쌍으로 이루어진답니다. 그림을 참고하세요.



키(key) 값(value)

‘dictionary’ ‘주절주절…’

‘python’ ‘궁시렁궁시렁…’

‘zoo’ ‘동물원’




문자열, 리스트, 튜플은 숫자로 된 인덱스를 이용해 값을 조회하는데, 사전에서는 키를 이용한 다는 것이 큰 차이점이죠. 또, 사전 자료형은 해싱 기법을 이용하기 때문에 자료가 순서대로 저장되지 않는다고 하네요.



해싱 기법이 무엇일까요?

선생님이 학생들의 시험지를 보니 만득이가 빵점을 받았다고 합시다.

그래서 만득이를 찾아서 혼내주려고 하는데,

“1번, 네가 만득이니?” “아니요.”

“2번, 네가 만득이니?” “아니오.”

“3번, 네가 만득이니?” “아니오.”



“40번, 네가 만득이니?” “아니오.”

이렇게 만득이를 찾으려면 좀 오래 걸리겠죠?

하지만, 선생님이 “만득이 나와!”라고 하시면 바로 찾을 수 있지 않겠습니까?

이 방법이 바로 해싱 기법과 비슷하다고 생각하시면 됩니다. 자료를 아주 빨리 찾을 수 있는 방법이지요.



사전 자료형을 만들고, 원소를 추가하는 방법은 위에서 보신대로이구요, 원소를 삭제할 땐 이렇게 하시면 됩니다.



>>> del smalldic['dictionary']



사전을 리스트로 바꾸는 방법은 다음과 같구요.



>>> family = {'boy':'choi', 'girl':'kim', 'baby':'choi'}

>>> family # 값을 넣는 순서대로 저장되지는 않음.

{'girl': 'kim', 'boy': 'choi', 'baby': 'choi'}

>>> family.keys() # 사전 family의 key들을 새로운 리스트에 담는다.

['girl', 'boy', 'baby']

>>> family.values() # 사전 family의 값들을 새로운 리스트에 담는다.

['kim', 'choi', 'choi']



사전에 어떤 키가 있는지 없는지 알고 싶으면 has_key를 이용합니다. 있으면 1, 없으면 0이라고 대답해주죠.



>>> family.has_key('boy')

1

>>> family.has_key('sister')

0
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2008/05/27 11:46 2008/05/27 11:46
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3305

자료구조 - 튜플(tuples)

튜플은 리스트와 비슷한 자료형이라는 정도만 알고 시작해봅시다.



다른 언어를 공부해보신 분은 두 변수의 값을 서로 바꾸어 본 적이 있으실 텐데요, 보통 다음과 같은 방법을 사용합니다.



>>> a = 10

>>> b = 20

>>> temp = a # a 값을 temp에 저장 (temp = 10)

>>> a = b # b 값을 a에 저장 (a = 20)

>>> b = temp # temp 값을 b에 저장 (b = 10)

>>> print a, b

20 10



이렇게 두 변수 값을 맞바꾸기 위해선 또 다른 변수 temp가 필요합니다.

좀 번거롭죠? 변수가 많을수록 더 귀찮아질테구요.

그런데 파이썬에선 이런 일을 간단하게 할 수 있는 기막힌 방법이 있습니다.



>>> c = 10

>>> d = 20

>>> c, d = d, c

>>> print c,d

20 10



너무 간단하지요? 저는 이것을 보고 웃어버렸습니다. 헬헬헬...

세 번째 줄에서 등호 왼쪽은 c, d라는 변수가 담긴 튜플이구요, 오른쪽은 d와 c의 값이 담긴 튜플입니다. 그래서 d의 값은 c로 들어가고, c의 값은 d로 들어갑니다.

이런 일들이 차례차례 일어나는 것이 아니고, 동시에 처리된다는군요.



이번엔 함수에서 튜플이 요긴하게 쓰이는 것을 보여드리지요.

아래의 함수는 인자(매개변수)를 주는 대로 받아먹는 함수입니다.



>>> def magu_print(x, y, *rest): # 마구찍어 함수

... print x, y, rest

...

>>> magu_print(1,2,3,5,6,7,9,10)

1 2 (3, 5, 6, 7, 9, 10)



이와 같이 마구찍어 함수는 인자를 두 개 이상만 주면 나머진 다 알아서 처리한답니다.

함수를 정의할 때 인자에 별표를 붙여두면 그 이후에 들어오는 것은 모두 튜플에 집어넣는 것이죠.

위에선 (3, 5, 6, 7, 9, 10)가 하나의 튜플로 묶였습니다.

꽤 쓸만할 것 같죠? 다른 언어로 이런 함수를 만들려면 고생 꽤나 해야 할거예요.

인자를 두 개, 세 개 넣어서도 실험해 보세요.



튜플의 좋은 점들을 구경했으니 이제 문법을 살펴봅시다.



>>> t = ('a', 'b', 'c')



튜플을 만들 때는 위와 같이 괄호를 써도 되고 안 써도 됩니다.

다만, 원소가 없는 튜플을 만들 때는 괄호를 꼭 써주세요.



>>> empty = ()



원소를 하나만 가진 튜플을 만들 땐 원소 뒤에 콤마(,)를 꼭 찍어주시구요.



>>> one = 5,

>>> one

(5,)



그리고 튜플은 리스트와 달리 원소값을 직접 바꿀 수 없기 때문에, 문자열에서 했던 것처럼 오려붙이는 방법을 써야한다는 것을 알아두세요.



>>> p = (1,2,3)

>>> q = p[:1] + (5,) + p[2:]

>>> q

(1, 5, 3)

>>> r = p[:1], 5, p[2:]

>>> r

((1,), 5, (3,))



튜플을 리스트로, 리스트를 튜플로 쉽게 바꿀 수도 있답니다.



>>> p = (1, 2, 3)

>>> q = list(p) # 튜플 p로 리스트 q를 만듦

>>> q

[1, 2, 3]

>>> r = tuple(q) # 리스트 q로 튜플 r을 만듦

>>> r

(1, 2, 3)
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2008/05/27 11:45 2008/05/27 11:45
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3304

자료구조 - 문자열과 리스트

문자열에서는 요런 식으로 한 글자마다 번호를 매긴답니다. 문자열을 만들어서 이것저것 시켜보세요.



>>> x = 'banana'

>>> x[0] # 0번 글자는?

'b'

>>> x[2:4] # 2번부터 4번 앞(3번)까지는?

'na'

>>> x[:3] # 처음부터 3번 앞(2번)까지는?

'ban'

>>> x[3:] # 3번부터 끝까지는?

'ana'



그렇다면 banana를 nanana로 바꿀 수는 있을까요?

>>> x[0] = 'n'

요렇게 해보면…

된다구요? 안됩니다. 문자열에 들어있는 글자는 바꿀 수가 없답니다.



그래도 꼭 바꾸고 싶다면 이렇게 할 수는 있죠.

>>> x = 'n' + x[1:]

>>> x

'nanana'

이 방법은 b를 n으로 바꾼 것이 아니고 ‘n’과 ‘anana’을 합쳐서 문자열 x에 새로 넣어준 것입니다.



이번엔 리스트를 살펴보도록 하겠습니다.

원소를 추가하는 것부터 해볼까요?

>>> prime = [2, 3, 7, 11] # 2, 3, 7, 11을 원소로 갖는 리스트 prime을 만듦

>>> prime.append( 5 ) # prime에 원소 5를 추가

>>> prime

[2, 3, 7, 11, 5]



sort 함수를 사용하면 정렬을 간단하게 할 수 있구요.

>>> prime.sort() # prime을 원소 크기 순으로 정렬

>>> prime

[2, 3, 5, 7, 11]



원소를 삭제하는 것도 되지요. 리스트도 문자열처럼 0번부터 번호를 매기는 거 아시죠?

>>> del prime[4] # prime의 4번 원소를 삭제

>>> prime

[2, 3, 5, 7]



그리고 문자열과는 달리 원소를 바로 바꿔줄 수도 있습니다.

>>> prime[0] = 1

>>> prime

[1, 3, 5, 7]



리스트 속에 리스트를 집어넣을 수도 있지요.

피자가게에서 음식을 주문하는 것을 리스트로 만들어 볼까요?

>>> orders = ['potato', ['pizza', 'Coke', 'salad'], 'hamburger']

>>> orders[1]

['pizza', 'Coke', 'salad']

>>> orders[1][2]

'salad'



마찬가지로 리스트를 사용해서 간단히 행렬을 표현할 수도 있습니다. 행렬은 아마 고등학교 때 배우죠?

>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]



지금까지 문자열과 리스트를 따로따로 알아봤는데요, 이번엔 둘 다 갖고 놀아봅시다.

문자열을 리스트로 바꿔보도록 하죠.

>>> list=[]

>>> string = 'Be happy!'

>>> for x in string:

... list.append(x)

...

>>> print list

['B', 'e', ' ', 'h', 'a', 'p', 'p', 'y', '!']

처음에 list라는 변수를 만들었는데, 그 값에는 아무 원소도 없는 리스트를 넣어줬습니다.

그리고, string이라는 변수를 만들어서 ‘Be happy!’라는 문자열을 넣어줬죠.

전에 for 문을 배울 때 리스트를 이용해서 반복을 한다고 했는데, 이번엔 문자열을 이용했습니다. 여기선 string의 글자 개수만큼 반복하게 되죠.

string의 첫번째 글자를 list의 첫번째 원소로 넣고, string의 두번째 글자를 list의 두번째 원소로 넣고, 그런 식입니다.



오늘의 종합편! 우리 반 성적표를 만들어 봅시다!

학생 이름에 국, 영, 수 성적을 넣어주고,

>>> chulsu = [90, 85, 70]

>>> yunghui = [88, 79, 92]

>>> yong = [100, 100, 100] # 바로 접니당...

>>> minsu = [90, 60, 70 ]



우리 반 학생들을 전부 ban이라는 리스트에 넣어줍니다.

>>> ban = [chulsu, yunghui, yong, minsu]



성적들이 어떤지 불러내볼까요?

>>> for person in ban:

... print person

...

[90, 85, 70]

[88, 79, 92]

[100, 100, 100]

[90, 60, 70]



개인의 성적을 더해서 총점, 평균도 내 보세요.

>>> for person in ban:

... total = 0

... for score in person:

... total = total + score

... ave = total / 3

... print person, total, ave

...

[90, 85, 70] 245 81

[88, 79, 92] 259 86

[100, 100, 100] 300 100

[90, 60, 70] 220 73
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2008/05/27 11:44 2008/05/27 11:44
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3303

자료구조 - 자료형

그렇다면 파이썬에는 어떤 자료형이 있는지 살펴볼까요?

type 함수를 사용하면 자료형을 쉽게 알아 볼 수 있습니다.



>>> type('A') # 문자열



>>> type(6) # 정수



>>> type(2.8) # 소수



>>> type(3+4j) # 복소수



>>> type([1, 2, 3, 4]) # 리스트





네 번째는 복소수라는 자료형인데요, 고등학교 가면 배우지요. 복소수라는 자료형은 파이썬에서 처음 보았습니다. 물론, 리스트나 앞으로 배울 튜플, 딕셔너리라는 것도 그렇구요.



자료형에는 크게 나눠서 수치형(numbers), 순서형(sequence), 매핑형(mapping)이 있습니다.

수치형에는 다시 정수(int), 더 큰 정수(long int), 소수(float)가 있지요.

int 형은 32 비트로 –2147483648 에서 2147483647 까지의 숫자를 표현 할 수 있다고 합니다. 비트라는 것은 이진수의 자릿수 하나라고 대충 생각하고 넘어 가십시당… 오늘은 복잡한 게 왜 이리 많징…ㅜㅜ

int 형이 32 비트라는 건 다른 프로그래밍 언어에 비해서 훨씬 큰 범위입니다. C의 long 형과 같다고 하네요. 정확한 범위는 아직까지 신경 쓰실 필요가 없습니다.



ong int형은 표현 범위가 무제한이라고 합니다. 믿거나 말거나…^^

3L과 같이 숫자 뒤에 L을 붙이면 됩니다.



float는 원래 부동소수점을 의미하는데, 소수점 이하를 표현할 수 있는 수라고 생각하시면 되겠네요.



글구, 제 생각엔 complex도 수치형에 들어갈 것 같긴 한데 아직 확인을 못했습니다.



그 다음으로는 순서형이 있는데요, 문자열(string), 리스트(list), 튜플(tuple), 사용자 정의 클래스가 순서형에 속합니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2008/05/27 11:44 2008/05/27 11:44
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3302


블로그 이미지

- 홍반장

Archives

Recent Trackbacks

Calendar

«   2008/05   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Statistics Graph

Site Stats

Total hits:
242253
Today:
783
Yesterday:
1266