파이썬을 그닥 좋아하지 않지만, 그렇다고 이공계에 있으면서 파이썬을 버릴 수는 없을 것 같다. 연구실에서 학생들끼리 파이썬 스터디를 하기로 했고, 내가 파이썬 파트를 맡아서 가르쳐 주기로 했기 때문에, 어쨌든 강의록을 써 보았다.


이 설명은 파이썬 2.7.4 기준이다. 파이썬3.3에서는 뭐가 어떻게 변할지 잘 모르겠다.


http://snowall.tistory.com/2407

파이썬 설치는 위의 글을 참고하면 될 듯하다.


강의록 파일과 본문을 첨부한다.


lecture1.py


# -*- coding:utf-8 -*-
# Python lecture 1
# keeHwan Nam, Dept. of physics, KAIST, 2013.

'''
파이썬 코드 읽는 법.
1. 한 줄에서, # 이후는 모두 주석이다. 즉, #가 등장한 다음부터는 해석하지 않는다.
2. 파이썬에서는 들여쓰기가 매우 중요하다. (나중에 다시 설명. 아무튼 들여쓰기가 매우 중요함!)
3. 코드에 한글을 쓰고 싶으면 # -*- coding:utf-8 -*- 을 첫줄에 붙여넣기 해야 한다. # 부터 -까지 전부 다. 심지어 주석에 한글이 있어도 반드시 필요하다.

'''

# 간단한 숫자 계산

print 3+5 # int + int = int
print 3.+5. # float + float = float
print 3+5. # int + float = float
print .3+.5 # float + float = float

print 10.5e5 # scientific notation sample 1
print 102.4e-4 # scientific notation sample 2

# print는 그 뒤에 있는 놈을 화면에 출력시키는 명령어이다.

# 변수 사용

a = 423 # variable 1
b = 302 # variable 2
print a+b # a+b

'''
파이썬에서 변수는 미리 선언할 필요 없이, 필요할 때 그때그때 만들어서 쓰면 된다.
하나의 프로그램 내에서 변수는 그냥 막 갖다가 쓰면 된다.
'''

a = 'abcd'
print a

# 앞에서 분명 a라는 변수에 423을 넣고 사용했지만, 여기에 'abcd'라는 문자열을 집어넣어도 아무 상관 없다.

# 흔한 연산자

a+=1 # 이 구문은 a=a+1과 동일하다. 물론 1뿐만 아니라 +할 수 있는 아무 숫자나 넣어도 된다.
a-=3
a*=32.
a/=3
# 사칙연산에 대하여 다 되어 있다. 뿐만 아니라 +, -, *, /가 존재하는 연산이면 대충 다 된다고 보면 된다.

# 함수 선언과 사용
'''
파이썬 내장 함수는 굳이 선언할 필요 없이 그냥 사용하면 된다.
그러나 파이썬 내장함수만으로 모든 프로그램을 만들 수는 없고, 내가 직접 함수를 만들어야 하는 경우가 있다.
또는 남이 만든 함수를 사용해야 하는 경우가 있다.
'''

def myfunctionname(variable1, variable2): # 함수는 def를 이용하여 함수라는 걸 알려주고, def 뒤에 함수 이름과 함수가 사용할 변수를 써준다. 끝에는 :를 붙여서 함수가 시작된다는 사실을 알려준다. 여기서 variable1과 variable2는 함수 안에서 사용할 수 있는 변수들이 된다.
    print "My first function!" # 함수에 포함되는 줄들은 무조건 한 칸 들여쓰기를 사용한다. 탭으로 해도 좋고 4칸 들여쓰기나 8칸 들여쓰기를 해도 된다. 중요한건 들여쓰기를 한다는 사실이다.
    return 2*variable1+variable2  # 함수의 끝은 return 으로 끝난다. 만약 return이 아무데도 없으면, 파이썬은 함수에 써있는 할 일들을 처리 하고 함수를 적당히 끝낸다. return이 있으면 그 자리에서 확실히 끝낸다. return 뒤에 있는 값을 함수를 불러온 자에게 넘겨주면서 함수는 끝난다.

print myfunctionname(142, 345) # 함수를 부를 때는 이름을 부르고, 그 다음 괄호 안에 사용할 변수를 써준다. 변수의 개수가 안맞으면 에러가 난다.

def myfunction2(v1): # 두번째 함수를 정의해 보았다.
    print "My second function."
    return v1*3.

print myfunction2(myfunctionname(524, 394)) # 이렇게 합성함수도 된다. 사용법은 수학에서 본 합성함수와 같다.

# 참/거짓

condition = True # 일단 참은 True, 거짓은 False이다.

# 조건 판단 후 분기. 조건 판단 후 분기는 if를 사용한다.
# if 다음에 있는 구문이 True로 판정되면 그 다음줄에 있는 명령어들이 쭉 실행된다. 여기서도 들여쓰기 해놓은 곳 까지만 한 덩어리로 친다. 들여쓰기에 항상 주의하자.
if a>b:
    print a
else:
    print b
   
#else 구문은 있어도 되고 없어도 된다. 있으면 if의 조건이 틀렸을 때 else부분이 실행되고, 없으면 그냥 넘어간다. 물론 들여쓰기는 필수.

i=0

while condition:
    i=i+1
    print i

# while은 condition이 True인 동안 계속 실행된다. 즉, 위와 같이 써놓으면 무한히 계속 실행된다.

while condition:
    condition = False
    print condition
   
# 위와 같이 해놓으면 1번 실행되고 끝난다. 어쨌든.

while condition:
    i=i+1
    if i>40
    print i
    condition = False
   
# 위와 같이 하면 i가 41이 될 때 까지만 수행되고 그 다음에 수행이 안된다. 같은 얘기를 다음과 같이 할 수도 있다.

condition = 1
while condition<40:
    condition=condition+1
    print(condition)
   
# 위와 같이 해 두면 condition이 1씩 증가하다가 condition<40이 false가 되면 멈출 것이다.

# 물론 위의 두 경우는 실제로 구현해 보면  사소해 보이는 차이가 있다. 그건 나중에 삽질하면서 배우는 것이 더 빠르게 배울 수 있다.

# 리스트(list), 튜플(tuple), 어레이(array)
# 여러개를 한번에 묶어서 나타낼 수 있는 자료형은 리스트, 튜플, 어레이가 있다.

a = [1,2,3,4] # 리스트의 예
b = ("a", "b", "c") # 튜플의 예
c = array.array('l', [2,4,5,3]) # 어레이의 예. 이 예제는 아직 실행되지 않을 것이다. 그 이유는 나중에 알도록 하고 일단 이런게 있다는 것만 알아두자.

'''
리스트, 튜플, 어레이의 사용법은 유사하지만 사소한 차이가 있다. 파이썬 개발자들이 왜 이래놨는지는 잘 모르겠지만.
1. 리스트와 튜플의 원소는 아무거나 다 된다. 숫자, 문자열, 함수, 리스트, 튜플 등 아무거나 다 된다. 리스트의 원소가 튜플이어도 된다. 어레이는 아무거나 쓸 수 없고, 정해진 규칙이 따로 있다.
2. 그 안에 있는 원소 중 하나만 불러올 때는 이름 다음에 네모괄호[]를 써서 사용한다. 이 방식은 어레이, 리스트, 튜플 상관 없다. abc[3]는 abc에 있는 4번째 원소를 불러온다.
3. 여기서, abc[3]이 abc의 3번째 원소가 아니라, 4번째 원소라는 점에 주의하자. 파이썬은 숫자를 0부터 센다!
4. 튜플은 한번 정해지면 안에 있는 내용을 고칠 수 없다. 만약 고치고 싶다면, 처음부터 끝까지 한번에 다시 지정해야 한다.
5. 일부를 고르고 싶으면 abc[3:5]같이 고를 수 있다. 이렇게 하면 4번째 부터 5번째 까지 골라진다. 왜 3~5인데 3번째부터 5번째가 아닌지, 왜 4번째부터 6번째까지가 아닌지, 묻지 말자.
6. 뒤에서부터 고를 수도 있다. 가장 뒤에 있는 원소는 -1번째이다. 즉, abc[-1]은 가장 끝에 있는 원소이고, abc[-2]는 가장 끝에서 두번째 있는 원소이다. 왜 가장 끝이 이번엔 -0이 아닌지, 역시 묻지 말자.
7. 특정 지점부터 끝까지, 처음부터 특정 지점까지 고르고 싶으면 abc[3:]이나 abc[:3]처럼 쓸 수도 있다. abc[3:]은 4번째 원소부터 끝 원소까지 전부 다 고른다.
8. 가령 abc[:-4]라고 하면, 처음부터 시작해서 끝에서 4번째 원소까지 골라준다. abc[-3]이라고 하면 끝에서 3번째 원소부터 끝까지 골라준다.
9. 리스트, 튜플, 어레이는 이게 기본이고, 이걸 갖고 놀 수 있는 아주 많은 종류의 내장 함수들이 있다. 그건 나중에 다시 설명할 기회가 있을 것 같다.
10. 리스트와 어레이는 +를 이용해서 이어붙일 수 있다. 즉, [a,b,c]+[3,3,4]=[a,b,c,3,3,4]이다.

'''

# for 구문을 이용한 반복문
'''리스트, 튜플, 어레이를 위와 같이 길게 설명한 이유는 for 구문 때문이다. 물론 for 구문 아니어도 얘들은 쓸모가 많기 때문에 알아두면 좋지만, for 구문을 잘 쓰기 위해서는 잘 알아두는 것이 필요하다.
'''

for i in [1,2,3,4]:
    print i

'''
위와 같은 구문이 for문의 가장 기본적인 사용법이다. for는 구문 시작이고, i는 for 구문 내부에서 사용할 변수 이름이다. in은 그 뒤에 있는 리스트, 어레이, 튜플에서 앞에서부터 값을 하나씩 꺼내서 i에 던져주는 역할을 한다.
다시 말해서, for 구문은 in 뒤에 있는 목록에 있는 값을 하나씩 i에 대입하면서 계속 반복 실행할 때 사용하는 구문이다.
여기서도 들여쓰기는 매우 중요하다.
in 뒤에 오는 것은 뭐가 됐든 목록이기만 하면 된다. 그럼 알아서 하나씩 던져준다.
위와 같은 간단한 구문으로 시작하는 for 문이지만, 실전에서는 매우 강력하다. 지금 목록의 원소가 4개밖에 없으니 그냥 간단해 보이지만, 이런 작업을 수만번, 수십만번씩 반복 처리하려면 그건 그야말로 시간낭비이고 끔찍한 일이 될 것이다. 그거 처리할 시간에 머리를 굴려서 for 문으로 처리하도록 하고 우리는 커피 한잔을 쪽 빨면서 기다리는 것이 더 낫다.
'''

# 파일 입출력
# 파이썬에서의 파일 입출력은 매우 간단하다.

myfile = open("filename.txt", "w")

'''
위와 같이 하면 된다. open 함수는 내장 함수인데, 실제로 파일을 열어준다. filename.txt는 내가 사용하려는 파일 이름이고, 원하는 대로 바꿔줄 수있다. "w" 부분은 내가 파일을 갖고서 뭘 할건지 알려주는 부분인데, 그 뜻은 다음과 같다.
"r" = 읽기만 하겠다.
"w" = 쓰기만 하겠다. 원래 파일에 뭐가 기록되어 있든지 상관 없이 처음부터 다 덮어쓸 생각이다. 파일이 없다면 만들 것이다.
"a" = 쓰기만 하겠다. 원래 파일에 뭐가 기록되어 있다면, 그 뒤에부터 이어붙일 것이다. 파일이 없다면 만들 것이다.
"r+" = 읽기도 하고 쓰기도 하겠다. 쓸 때는 원래 파일에 기록된거 다 무시하고 덮어쓴다. 파일이 없다면 에러가 난다.
'''

myfile.write("abcd")
myfile.write(a)
# 위와 같이, "w"를 이용하서 파일을 열었으면 write명령을 이용해서 파일에 실제로 기록할 수 있다. 여기서 마침표.가 보이는데, 그건 "myfile이라는 곳에 write해라."라는 뜻으로 해석하면 된다. 자세한건 나중에 클래스를 공부하고 나서 생각할 것이다.
# 파일의 끝에 줄을 넘기고 싶다면? (엔터를 친 것처럼 그 다음줄에 기록하고 싶다면?) \n을 사용한다.

myfile.write("abcd\n")
# 위와 같이, 다 쓰고나서 \n을 써준다면, \n은 실제로는 \n으로 적히는 것이 아니라, 그 위치에서 엔터키를 친 것처럼 그 다음줄로 넘어가는 것으로 해석된다.

myfile.close()
# 파일을 다 쓴 이후에는 close()를 해줘야 실제로 기록된다! 이것은 매우 중요하다.
# 물론 write까지만 해 놓고 close를 하지 않더라도, 프로그램이 종료되는 시점에 실제로 기록되기는 한다. 하지만 계산하다가 중간에 컴퓨터가 꺼지거나 했을 때, 지금까지의 계산 결과라도 살리고 싶다거나 하면 close()를 사용해서 실제로 기록 하는 것이 좋다.
# close()가 하는 역할은 실제로 기록하고, 파일을 닫는다. 즉, close()를 사용한 이후에는 myfile.write()같은 명령을 이용해서 파일에 뭘 더 쓴다거나, myfile.read()를 이용해서 읽어온다거나 할 수 없다. 이미 닫혔기 때문이다.
# 만약 기록만 하고 아직 파일을 닫고 싶은건 아니라면 flush()가 있다.

myfile.flush()
# 위와 같이 명령하면, 실제로 파일이 기록되지만 파일을 닫지는 않는다.

myfile = open("filename.txt", "r")
# 이제, 읽기 전용으로 파일을 읽어보자.

myfile.read()
# 위의 명령어를 쓰면 파일을 한방에 처음부터 끝까지 다 읽어온다. 그리고 파일 보고 있는 위치를 끝으로 옮겨둔다.

a = myfile.read()
# 위와 같이 쓰면 myfile에서 읽어온 데이터를 a라는 변수에 저장시켜 줄 것이다. 그리고 파일 보고 있는 위치를 끝으로 옮겨둘 것이다.

myfile.readline()
# 위의 명령어를 쓰면 파일을 한줄만 읽어온다. 그리고 파일 보고 있는 위치를 방금 읽어온 줄의 그 다음 줄 첫 글자로 옮겨둔다.

# '파일 보고 있는 위치'란, 책갈피 같은 것이다. 책을 읽을 때 앞에서부터 읽다보면 어디까지 기억해 둬야 하는데, 그것과 마찬가지 역할을 하는 것이다. 원한다면 파일을 중간부터 읽을 수도 있는데, 대체로 데이터 처리할 때는 처음부터 끝까지 읽게 되므로 중간부터 읽거나, 중간까지 읽는 과정은 필요할 때 찾아보도록 하자. 어쨌든, read()나 readline()함수는 '파일 보고 있는 위치'에서부터 그 다음에 정해진 곳(끝 또는 그 줄 끝)까지 읽게 된다. 처음에 파일을 open()으로 열게 되면, 파일 보고 있는 위치를 파일의 시작점에 가져다 두기 때문에 우리가 "첫 부분" 부터 파일을 읽을 수 있는 것이다.

# import 써보기

import array
# import는 우리가 만들고 있는 이 프로그램 파일 안에 설명되지 않은, 다른 파일에 작성된 내용을 참고하고 싶을 때 사용한다.
# 사용법은 위와 같이 import를 써 주고 불러올 '모듈' 이름을 써주면 된다. '모듈'은 원하는 함수가 있는 파일의 이름 또는 그런 파일이 있는 디렉토리 이름이다.
# import를 하기 전에는 해당 모듈 안에 있는 함수들을 사용할 수 없다.

# 일단 array 모듈을 불러왔으므로, 앞에서 써보지 못했던 어레이를 사용할 수 있게 된다.
c = array.array('l', [2,4,5,3])

# 이제 이 코드가 작동할 것이다.
# 사용법은 모듈명 다음에 마침표.를 찍어주고 그 모듈 안에 있는, 사용하려는 함수를 불러서 쓰면 된다.
# 이렇게 import를 한 경우에는 함수 이름 앞에 모듈 이름을 절대로 생략하면 안된다. 그러나 사람들은 생략하고 싶을 때가 자주 있는데...

from array import array
# 위와 같이 import를 사용할 수도 있다. array 라는 모듈 안에서 일부분만 갖고 오는 것이다. 이 경우, array라는 모듈 안에 있는 array라는 함수만 갖다 쓰겠다고 한 경우가 된다. 이렇게 되면 array.array라고 하지 않고 array라고만 해도 작동한다. 만약 array라는 모듈 안에 있는 모든 함수를 다 갖다 쓰면서, 동시에 array.func()처럼 앞에 모듈명 붙이는걸 생략할 수 있다.

from array import *
# 이렇게 별표*를 붙여서 import하는 경우에는 전부 다 갖다 쓸 수 있으며 모듈명도 생략할 수 있다.

# 하지만 문제가 되는 경우가 있는데, 사용하려는 두 모듈에서 같은 이름의 함수가 있는 경우이다.

from moduleA import funcA
from moduleB import funcA

# 위와 같은 경우, moduleA에도 funcA가 있고,moduleB에도 funcA가 있다. 그럼 아무생각없이 funcA(x)를 실행시키면 뭐가 실행될까?
# 일단은 나중에 불러온 함수, 즉 moduleB에 있는 funcA가 실행된다. 하지만 나는 moduleA에 있는 것도 쓰고 싶다면?!
# 몇가지 해결 방법이 있는데, 가장 고전적으로는 그냥 import moduleA와 import moduleB 형식으로 불러오고, moduleA.funcA()와 moduleB.funcA() 처럼 사용하는 것이다.

# 두번째로는 as를 사용하는 것이다. 다음과 같이 써 보자.

from moduleA import funcA as funcAA
from moduleB import funcA as funcAB

# 위와 같이 쓰면 funcAA()와 funcAB()로, 두 함수가 구분되므로 마음대로 불러다 쓸 수 있다.
# 또한 as는 모듈의 전체 이름에도 사용할 수 있다.

import mylongnamedmodule as ml

# 위와 같이 쓰면 mylongnamedmodule이라는 모듈에 있는 함수 foo()를 불러올 때, mylongnamemdmodule.foo()가 아니라 ml.foo()로 불러올 수 있다. 단, as로 불러온 경우에는 as 뒤에 있는 이름만 유효하다. 즉, 위와 같이 모듈을 불러왔다면, 오히려 mylongnamemdmodule.foo() 처럼 쓰면 파이썬은 그런 모듈 모른다며 에러를 내뱉을 것이다.



by snowall 2013. 7. 24. 19:31