우선 파이썬에서 한글을 쓰기 위해서는

#coding: euc-kr

위 문법을 맨위에 삽입해 준다.

 

 

문자열

 

+연산은 오로지 문자열만 연결한다.

 

수리 계산은 init(), float() 함수로 반드시 변환해야 한다.

z = init(x) + init(y)

 

str()

print시 문자열 변환 함수: str()는 3.4입력시 3.4가 나온다.

 

 

repr()

print는 문자열 변환 함수: repr()는 3.4입력시 3.39999가 나온다.

 

 

format()

 

foramt은 정해진 ofrmat으로 출력을 한다.

format(x,"0.5f ")

 

리스트(List)

 

names = ["a", "b", "c", "d"]

a = names[2]

 

names.append("Paula") # 리스트 가운데의 항목을 교체 한다.

 

b = names[0:2]

 

리스트 연결시 플러스(+)연산자를 사용 한다.

 

빈 리스트 생성

names = []

names = list()

 

import sys
if len(sys.argv) != 2 :
    print "Please supply a filename"
    raise SystemExit(1)

f = open(sys.argv[1])
lines = f.readlines()
f.close()

fvalues = [float(line) for line in lines]

print "min", min(fvalues)
print "max", max(fvalues)

 

 

튜플(tuple)

 

stock = ('GOOG', 100, 490.10)

stock = 'GOOG', 100 ,490.10

 

튜플과 리스트의 가장 큰 차이점은 한번 정의되면 수정 되어질 수 없다는 것이다.

 

하지만 성능 최적화를 위해서는 튜플을 사용하는것이 더 좋다.

왜냐하면 튜플은 수정이 되지 않기 때문에 over memory alloacate를 하지 않는다.

 

List와 Tuple의 코드상에서 구분하는 방법은 대괄호와 소괄호의 차이점으로 구별 한다

 

튜플과 리스트를 함께 사용하는 예제)

#coding: euc-kr

filename = "int"
portfolio = []
for line in open(filename):
    fields = line.split(",") #줄을 분할해서 , 단위로 리스트를 만든다.
   
    #리스트를 각 타입에 맞게 변환 한다.
    name = fields[0]
    shares = int(fields[1])
    price = float(fields[2])
   
    #튜플을 만든다.
    stock = (name, shares, price)
   
    #투플을 리스트에 추가 한다.
    portfolio.append(s 

 

 

 

집합(set)

 

집합은 객체들의 순서 없는 모음을 담는데 사용된다. 집합은 다음과 같이 set()함수에 일련의 항목들을 넘겨 주어 생성 한다.

 

s = set ([3,5,9,10])

리스트나 튜플과는 달리, 집합은 순서가 없기 때문에 숫자로 색인될 수 없다. 게다가, 집합은 요소가 중복되는 일이 없다.

 

즉, t = set("Hello")

set(['H','e','l','o']) 이와 같이 l이 한번만 나타나게 되는 것이다.

 

집합 연산자를 사용 할 수 있다.

 

또한 집합에 아이템이 추가될수도 삭제될 수도 있다.

add()

update()

remove()

 

사전(dictionary)

 

사전은 키로 색인되는 객체들을 담는 연관 배열 혹은 해시 테이블이다.

다음과 같이 값들을 중괄호({})로 둘러싸서 사전을 생성 한다.

 

stock = {

"name" : "GOOG",

"shares" : 100,

"price" : 490.10

}

 

키로 접근해서 자료를 꺼내오거나 갱신 한다.

객체 추가 및 수정은

stock["shares"] = 75

stock["date"] = "June 7, 2007"

주로 문자열이 키로 사용되지만, 숫자나 튜플 같은 다른 파이썬 객체도 키로 사용될 수 있다.

 

사전은 이름 있는 필드들로 구성되는 객체를 정의하는 데 유용하게 쓰인다.

하지만, 사전은 순서 구분 없는 데이터를 빠르게 검색하기 위한 용도의 컨테이너로도 사용 된다.

 

빈사전을 만드는 방법

 

prices = {}

prices = dict()

 

사전에 어떻게 키가 들어있는지 확인 하는 방법

1) 방법 in 연산자의 활용

if "SCOX" in prices:

p = prices["SCOX"]

else:

p = 0.0

2) 방법

p = prices.get("SCOX",0.0)

 

사전의 키 목록을 얻고 싶으면 사전을 리스트로 변환하면 된다.

syms = list(prices)

# syms에는 "AAPL", 등..이 연속해서 저장되어진다.

 

del prices["MSFT"]

 

사전은 파이썬의 꽃이다. 따라서 이것을 잘 사용하는것이 좋다.

 

 

반복과 루프

 

for를 이용해서 가장 간단하게 루프를 도는 형태는 간단히 문자열, 리스트, 튜플 같은 순서열의 모든 구성요소에 대해 루프를 도는 것이다. 다음은 한 예이다.

 

#coding: euc-kr

f = open("int")
for line in f:
    print line

 

 

 

함수

 

다음 예처럼 함수는 def문을 사용해 생성한다.

 

#coding: euc-kr

def remainder(a,b):
    q = a // b
    r = a - q*b
   
    return r

result = remainder(37,15)

print result 

 

 

 

특이한점

리턴이 2개 이상일 수 있다.

 

return (a,b)

 

a,b = func()

 

인자의 초기 값이 있을 수 있다.

 

저역 변수를 수정 할 때에는 global이라는 keyword를 사용 한다.

 

생성기

 

함수는 단일 값을 변환하는 대신, yield문을 사용해 일련의 결과 값을 생성할 수도 있다.

def countdown(n):
    print "Counting down!"
    while n > 0:
        yield n # 값(n)을 생성한다.
        n -= 1

c = countdown(5);

for i in countdown(5):

 

 

yield를 사용하는 함수를 생성기(generator)라고 부른다. 생성기 함수를 호출하면, next() 메서드를 호출 하면 일련의 결과를 반환하게 된다.

 

 

생성기는 처리 파이프라인, 스트림, 데이터 흐름에 기반한 프로그램을 작성할 때 강력한 위력을 발휘 한다. 예를 들어, 다음 생성기 함수는 로그 파일을 검토하는 데 흔히 사용되는 유닉스의 tail -f 명령의 동작을 흉내낸다.

 

리눅스 명령어중 grep을 흉내낸 파이썬 코드이다.

 def grep(lines, searchtext):
    for line in lines:
        if searchtext in line: yield line

       
f = open("int")

lines = f.readlines()

c = grep(lines,"MS")

print c.next() 

 

 

리눅스 명령어 "tail -f | grep python"를 구현 하겠다.

즉 2개의 generatior를 연결 시켜서 리눅스의 파이프라인을 구현한 간단한 예이다.

 

#coding: euc-kr
import time

def tail(f):
    f.seek(0.2)
    while True:
        line = f.readline()
        if not line:
            time.sleep(0.1)
            continue
        yield line

def grep(lines, searchtext):
    for line in lines:
        if searchtext in line: yield line
       
#f = open("int")
#lines = f.readlines()
#c = grep(lines,"MS")
#print c.next()

wwwlog = tail(open("int"))
#f = open("int")
#lines = f.readlines()
pylines = grep(wwwlog,"MS")

for line in pylines:
    print line,

 

 

 

 

 

 

코루틴

 

보통 함수는 입력으로 주어진 인수에 대해서 한 번만 실행된다. 하지만, 일련의 입력을 처리하도록 함수를 작성할 수도 있다. 이런 종류의 함수를 coroutine이라고 한다.

 

yield는 그냥 쓰면 generator이지만, ()를 양 옆에 달게 되면 coroutine이 된다.

 

 

def print_matches(matchtext):
    print "Looking for", matchtext
    while True:
        line = (yield)
        if matchtext in line:
            print line

#matchtext로 초기화 한다음

#matcher.send()를해서 해당 문자열이 있는지 검사하게 만들 수 있다.

 

 

 코루틴은 send()로 값이 도착할 때까지 멈춰 있는다.

send()가 호출되면, 코루틴 안에서 yield 표현식을 만날 때까지 계속되고, 그 순간 함수가 다시 멈춘다.

앞의 예에서 보았듯이, 이 과정은 close()가 호출될 때까지 이어진다.

 

코루틴은 프로그램의 한 곳에서 생성된 데이터를 다른 곳에서 소비하는 생성자 소비자 모델이 기반한 병행 프로그램을 작성할 때 유용하게 쓰인다. 이 모델에서 코루틴은 데이터 소비자의 역할을 수행한다. 다음은 생성기와 코루틴을 결합하는 예이다.

 

 

객체와 클래스

객체에 정의된 메서드를 살펴 보고 싶을 경우

dir(object)를 하면 알 수 있다.

 

이렇게해서 메서드를 확인할 경우 __메서드__ 와 같이 이중 언더바로 시작하고 끝나는 특수한 메서드들을 볼 수 있다.

 

 

 

 

 #coding: euc-kr

class Stack(list):
    def push(self,object):
        self.append(object)

s = Stack() # 스택을 생성한다.
s.push("Dave")
s.push(42)
s.push([3,4,5])

print s.pop()
print s.pop()

 

 

C++ / java 프로그래밍에서 쓰는 정적 메서드 또한 사용 할 수 있다.

@staticmethod

 

예외

 

try이와 except문으로 예외를 잡아서 처리 할 수 있다.

 

#coding: euc-kr

try:
    f = open("int2","r")
except IOError as e:
    print e 

 

 

IOError가 발생하면, 에러의 원인에 대한 내용이 e에 담기고 except 블록으로 제어가 넘어간다.

 

 

모듈

 

프로그램 크기가 커지면 손쉬운 관리를 위해 프로그램을 여러 파일로 나누고 싶어 질 것이다.

파이썬에서는 정의들을 파일에 넣어 다른 프로그램이나 스크립트에 Import할 수 있는 모듈의 형태로 사용할 수 있다.

 

모듈을 생성하려면 관련문장과 정의들을 모듈과 동일한 이름을 가지는 파일에 넣으면 된다.

 '''
Created on 2012. 6. 30.

@author: root
'''

def divide(a,b):
    q = a/b
    r = a -q*b
    return(q,r)

 

 

 #coding: euc-kr

import div as foo

a,b = foo.divide(2305,29)

print "%d %d" %(a,b)   

 

 

 

도움

 

dir(package name)

 

print packagename.__함수__

 

위와 같이 입력하면 해당함수의 사용법을 알 수 있다.

 

 

 

 

'Computer Science > Python' 카테고리의 다른 글

GUI 프로그래밍  (0) 2013.06.23
ImageMagick for Python  (0) 2013.05.07
7장 클래스와 객체지향 프로그래밍  (0) 2012.07.03
3장 타입과 객체  (0) 2012.07.01
2장 어휘 규약과 구문  (0) 2012.07.01

+ Recent posts