우선 파이썬에서 한글을 쓰기 위해서는
#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.__함수__
위와 같이 입력하면 해당함수의 사용법을 알 수 있다.