-
공부하는 내용 정리Legacy/Python 2015. 6. 20. 20:43728x90
Head First Python을 공부하며 정리
2015/06/20
1. 파이썬에서 '와 "의 차이
파이썬에서 둘의 차이는 없지만 '로 열었으면 '로 닫아야 하고 "로 열었으면 "로 닫아야 한다.
하지만, IDLE 처럼 쉘에서는 문자열을 출력할 때 작은따옴표를 사용한다.
2. 함께 들여 쓴 리스트 처리 코드를 스위트(suite)라고 함
ex)
for each_flick in fav_movies:
print(each_flick)
3. 문자열 안에 큰따옴표를 넣고싶으면?
다른 언어들과 마찬가지로 \" 를 써서 이스케이핑 시켜줌.
2015/06/21
4. isinstance(변수명, 자료형)은 변수명이 해당 자료형이 맞는지 판단
ex)
def print_lol(the_list):
for each_item in the_list:
if isinstance(each_item, list):
print_lol(each_item)
else:
print(each_item)
5. 파이썬 3는 기본적으로 재귀 함수 호출 횟수를 1000번으로 제한하고 있지만, 필요에 따라 이 제한을 더 늘릴 수 있음.
6. 다음과 같은 방식으로 함수를 정의한다.
def 함수이름(인자):
함수 코드 스위트
7. 주석을 추가하기 위해선 """로 시작하여 """로 끝내면 된다. (큰따옴표 3개, 작은따옴표로 대체 가능)
8. 모듈을 만들어서 배포를 할 수 있다. 모듈을 설치하여 사용할 수 있으며 사용할 때는 다음과 같다.
ex)
import nester
cast = ["Palin", "Cleese", "Idle", "Jones", "Gilliam", "Chapman"]
nester.print_lol(cast)
위와 같이 네임스페이스를 지정해야 한다.9. 선택적 인자를 사용하는 방법
ex)
def print_lol(the_list, level): """두 인자 모두 필수 인자"""
def print_lol(the_list, level=0): """첫번째 인자만 필수 인자가 된다."""
10. 파이썬에는 두 종류의 리스트가 있다. 대괄호[]로 둘러싼 변할 수 있는 리스트가 있고, 괄호()로 둘러싼 별할 수 없는 리스트가 있다. 변할 수 없는 불변형 리스트를 튜플(tuple)이라고 부른다. 일단 만들고 난 후에는 어떤 경우에도 바꿀 수 없다.
11. 파이썬에서는 다음과 같이 예외를 처리할 수 있다.
ex)
data = open('sketch.txt')
for each_line in data:
try:
(role, line_spoken) = each_line.split(":", 1)
print(role, end='')
print(' said: ', end='')
print(line_spoken, end='')
except:
pass
data.close()
pass는 아무것도 하지 않는다. continue와 비교해서 생각해보면 pass는 그대로 해당 루프를 돌게 되고 continue는 다음 순번으로 넘어가게 된다.pass는 단순히 수행할 코드가 없다는 것을 명시적으로 나타내주는 역할12. 특정 에러에 대해 처리해주려면 다음과 같이 작성한다.
ex)
try:
data = open('sketch.txt')
for each_line in data:
try:
(role, line_spoken) = each_line.split(":", 1)
print(role, end='')
print(' said: ', end='')
print(line_spoken, end='')
except ValueError:
pass
data.close()
except IOError:
print('The data file is missing!')
13. 파일을 열기 위해서는 open() 내장함수를 사용하고 파이썬에서는 파일을 라인단위로 읽음 readline()seek(0) 메소드로 파일의 읽기 위치를 맨 처음으로 돌릴 수 있고, 파일을 사용 후에는 close()로 닫아주어야한다.split() 메소드는 문자열을 하위 문자열의 리스트(또는 튜플)로 분할한다.14. elif는 else if 를 의미한다. elif문은 이전 <조건문>이 거짓일 때 수행된다.
15. print함수는 마지막에 자동으로 줄바꿈 문자('\n')을 집어넣는다. 이를 막기 위해서는 다음과 같이 쓰면된다.
python 3
print ("No new line", end=" ")
python 2.7
print "No new line",
16. 파이썬 2.7 vs 파이썬 3
17. 쓰기 모드로 파일 열기
파일을 읽는 것 뿐만아니라 쓰는 것도 역시 open()을 이용한다.
ex)
out = open("data.out", "w")
print("Norwegian Blues stun easily.", file=out)
out.close()
작업을 다 끝낸 후에 반드시 파일을 닫아야한다. 파일을 닫아야 캐시에 남아 있던 데이터도 실제 파일에 써진다.
이것을 플러싱(flushing)이라고 한다.
"w"로 파일을 열 경우 기존에 파일이 존재했다면 기존에 파일에 있던 내용은 지워진다. 때문에 파일 끝에 추가하기 위해서는 "a"로 열어야 하고,
파일의 내용을 지우지 않고 읽고 쓰기 위해 열려면 "w+"모드로 열어야한다.
17.1 파일에 출력(print)하기
파일에 출력할 경우 다음과 같다.
ex)
print("Norwegian Blues stun easily.", file=out)
출력될 내용을 쓴 후, 뒤에 인자를 하나 더 줘서 file=[파일변수] 를 전달 해주면 된다.
17.2 try-except-finally
다음 예제를 살펴보자.
ex)
12345678910try:out_man = open('man.out', "w")out_other = open('other.out', "w")print(man, file=out_man)print(other, file=out_other)out_man.close()out_other.close()except IOError:print('IOError!!')
csout_man과 out_other을 닫아주는 구문이 반드시 실행될 거라고 보장할 수 있는가?
만약 5행에서 에러가 발생하였다고 한다면 프로그램의 실행흐름은 6, 7행을 실행시키지 않고 9행으로 간다.
때문에 close가 되지 못해서 데이터가 깨질 수도 있다.
다음과 같이 바꿔보자.
ex)
123456789101112try:out_man = open('man.out', "w")out_other = open('other.out', "w")print(man, file=out_man)print(other, file=out_other)except IOError:print('IOError!!')finally:out_man.close()out_other.close()cs out_man과 out_other을 try 스위트가 아닌 finally라는 키워드에 속하는 스위트에 넣어두었다.
finally는 오류가 발생하건 안하건 반드시 실행되는 구문이다.
오류 발생 : try -> except(IOError 이라면) -> finally
오류 없음 : try -> finally
18. str.strip([chars])은 str 문자열에서 chars문자를 제거한 문자열을 반환해준다.
ex)
str = "0000000this is string example....wow!!!0000000"; print str.strip( '0' );
this is string example....wow!!!
주의! str문자열은 변경되지 않는다.
19. 파이썬에서 문자열은 불변형이다. 이렇게 설계한 이유는 다른 어떤 변수가 그 문자열을 참조하고 있을지도 모르기 때문이다.
이것은 골치 아픈 버그가 생기지 않도록 하는 가장 안전한 방법(C에서 포인터 및 문자열 함수가 발생시키는 일을 생각해보자.)
문자열 이외에 튜플과 수치 데이터들은 모두 불변형이다. 불변형 데이터를 변경하려고 하면 파이썬은 TypeError 예외를 발생
20. 파이썬도 Java와 마찬가지로 가비지 컬렉션을 한다.
21. 파이썬 변수는 단지 데이터 객체를 참조할 뿐이다.
22. in 연산자는 해당 객체가 집합 객체 안에 있는지 테스트한다. 다음 예제를 보자.
ex)
12345678try:data = open('missing.txt')print(data.readline(), end='')except IOError:print('File error')finally:if 'data' in locals():data.close()cs locals() 내장 함수는 현재 존재하는 변수에 대응되는 객체들을 출력한다.
data변수에 'a'가 추가된 것을 확인할 수 있다.
위 코드에서 data = open('missing.txt')는 예외를 발생시킨다. missing.txt라는 파일이 존재하지 않기 때문이다. 때문에 data라는 변수에는 객체가 들어가지 않아서 locals() 에 존재하지 않게되어 finally 스위트에 있는 data.close()는 실행되지 않게된다.
23. 예외가 발생해서 except 스위트에 의해 처리될 때 파이썬 인터프리터는 예외 객체를 스위트에 전달한다. 이 예외 객체를 받아오기 위해선 as 키워드를 사용하면 된다. 다음 예제와 같이하면 출력할 수 있따.
ex)
12345678try:data = open('missing.txt')print(data.readline(), end='')except IOError as err:print('File error ' + err)finally:if 'data' in locals():data.close()cs 이렇게 하면 될 것 같지만 안된다.
TypeError이 뜬다. 'FileNotFoundError' 객체를 str로 변환 할 수 없다는 것이다. err은 스트링 타입이 아닌가보다.
이를 위해 코드를 다음과 같이 수정해야한다.
ex)
12345678try:data = open('missing.txt')print(data.readline(), end='')except IOError as err:print('File error ' + str(err))finally:if 'data' in locals():data.close()cs str() 내장 함수를 이용해 형변환을 해주어야 한다.
그랬더니 다음과 같은 멋진 출력 결과가 나왔다.
File error [Errno 2] No such file or directory: 'missing.txt'
'missing.txt'를 찾을 수 없다는 것이다.
24. 위에서 살펴본 결과 파이썬에서 파일을 읽고 쓸 떄는 try-except-finally 패턴이 많이 사용된다. 하지만 이것은 너무 코드가 길고 복잡해지는 느낌을 지울 수 없다.
때문에 파이썬에서는 with 라는 키워드를 제공하고있다. 다음 두 개의 예제를 살펴보자. 같은 기능을 하는 코드이지만 하나는 try-except-finally로 되어 있지만 하나는 with로 되어있다.
ex)
12345678try:data = open('its.txt', "w")print("It's...", file=data)except IOError as err:print('File error: ' + str(err))finally:if 'data' in locals():data.close()cs 12345try:with open('its.txt', "w") as data:print("It's...", file=data)except IOError as err:print('File error: ' + str(err))cs with를 사용하면 열려있는 파일을 닫아야 하는 걱정을 할 필요가 없다. 파이썬 인터프리터가 자동으로 처리해 주기 때문이다.
저 with의 스위트를 빠져나가는 순간 파일은 닫아지게 된다.
다음 세 코드는 같은 동작을 한다.
ex)
12345678910111213try:man_file = open('man_data.txt', 'w')other_file = open('other_data.txt', 'w')print(man, file=man_file)print(other, file=other_file)except IOError as arr:print('File error: ' + str(err))finally:if 'man_file' in locals():man_file.close()if 'other_file' in locals():other_file.close()cs 12345678try:with open('man_data.txt', 'w') as man_file:print(man, file=man_file)with open('other_data.txt', 'w') as other_file:print(other, file=other_file)except IOError as err:print('File error: ' + str(err))cs 1234567try :with open('man_data.txt', 'w') as man_file, open('other_data.txt', 'w') as other_file:print(man, file=man_file)print(other, file=other_file)except IOError as err:print('File error: ' + str(err))cs 세번째 예제처럼 두 개의 open을 하나의 with문에 쓸 수 있다. 이 때 콤마를 사용해서 구분해 줘야한다.
25. 파이썬은 데이터를 피클링할 수 있다. 이 피클링된 데이터는 메모리에 존재하는 것이 아닌 메모리에 영구적으로 존재하게된다.
데이터는 dump로 저장하고 load로 읽을 수 있다. 데이터를 피클링할 파일을 열때는 단순 'w'또는 'r'이 아니라 바이너리(binary) 파일 형태로 열어야만한다.
바이너리 파일 형태로 여는 것은 'wb', 'rb' 형태로 인자를 넣어주어야하며, 피클을 사용하기 위해서는 pickle 모듈을 임포트 해야한다. 다음 예제를 살펴보자.
ex)
123456789import picklewith open('mydata.pickle', 'wb') as mysavedata:pickle.dump([1, 2, 'three'], mysavedata)with open('mydata.pickle', 'rb') as myrestoredata:a_list = pickle.load(myrestoredata)print(a_list)cs pickle을 사용해 데이터를 저장하거나 읽을 때 문제가 발생하면 pickle 모듈은 PickleError 형의 예외를 발생시킨다.
이와 같은 피클을 사용하는 것이 유리한 점은 메모리를 그대로 덤프하는 것이므로 문자열을 처리하는 것보다 더 경제적이라는 장점이있다.
26. print() 함수의 시그니처는 print(value, sep='', end='\n', file=sys.stdout)이다.
27. 파이썬에서 데이터는 두 가지 방법으로 정렬할 수 있다.
하나는 원본정렬(In-place sorting)이고 다른 하나는 사본정렬(Copied sorting)이다.
원본정렬은 정렬된 후 원래의 내용이 변경되는 것이고, 사본정렬은 원본은 그대로 두고 정렬된 복사본을 만들어내는 방법이다.
리스트의 sort() 메소드는 원본정렬을 하고, sorted() 내장함수는 사본정렬을 한다.
28. 메소드 연속호출의 경우( ex. list.strip().split(';') ) 왼쪽의 결과를 가지고 오른쪽의 메소드가 실행된다.
29. 리스트의 지능화
파이썬에서 다음과 같은 방법으로 리스트의 복사본을 만드는 예제를 보자.
ex)
1234new_list = []for each_t in old_list:new_list.append(each_t)cs 우리는 위와같은 코드를 쉽게 떠올릴 수 있을 것이다.
하지만 너무 길다고 여겨질 수 있다. 파이썬에서는 이 세줄을 한 줄로 줄일 수 있는 문법을 제공하고있다.
ex)
1new_list = [each_t for each_t in old_list]cs 다음과 같은 방식(변환)으로도 사용된다.
이러한 리스트의 복사 및 변환은 파이썬에서 자주 필요하다. 때문에 이러한 방식도 제공하는 것이다.
앞서 보았던 with as 문과 같이 파이썬에서는 우리가 '자주쓰면서 조금 긴' 문법에 대한 축약형 문법을 만들어 두었다. ( + append 역시 사용할 필요가 없다.)
하지만! 이러한 지능형 리스트는 리스트의 모든 항목을 변환하는 경우에는 좋지만, 일부만 변환 및 복사한다던지 하는 동작을 하려면 사용할 수 없다. 기존의 방법이 좀 더 융통성 있는 방법이다.
30. 리스트 슬라이스
파이썬에서 리스트의 일부를 지칭하고 싶을 때 다음과 같이 사용할 수 있다.
ex)
0부터 3전까지 3개의 데이터를 가져왔다.
※0~3까지(3을 포함하는 것이 아닌 3미만)
31. not in 연산자
not in 연산자는 어떠한 항목이 해당 리스트에 존재하는지에 따라 Ture 또는 False를 반환하는 연산자이다.
다음과 같은 문법을 사용한다.
if 항목 not in 리스트:
스위트
(위 처럼 자주 사용되는 것이고 not in 만을 놓고보면 '연산자'이다.)
항목 not in 리스트 => 항목이 리스트에 존재하면 True
=> 항목이 리스트에 존재하지 않으면 False
항목이 리스트 내에 존재하지 않아야 실행된다. 다음은 이를 사용한 예제이다.
ex)
2와 3이 두 개씩 존재했지만 중복을 제거할 수 있었다. 이처럼 not in 연산자는 주로 리스트에서 중복된 데이터를 삭제할 때 사용한다.
32. set 함수
파이썬에서는 리스트 외에도 집합(set) 데이터 구조를 제공한다. 이 구조는 데이터 항목의 순서가 없고, 중복된 데이터를 가질 수 없다는 특징이 있다.
>>> distances = {10.6, 11, 8, 10.6, "two", 7}
>>> distances
{10.6, 8, 'two', 11, 7}
중복된 10.6이 하나 없어진 것을 볼 수 있다.
33. 딕셔너리
파이썬에서 사용되는 딕셔너리는 다른 프로그래밍 언어에서 사용되는 연관배열, 매핑, 해시 라는 이름으로 사용되고 있는 것과 같다.
34. 클래스를 사용하는 이유
클래스를 사용하면 복잡도를 줄일 수 있다.
복잡도가 줄어들면 버그도 적어진다.
버그가 적으면 유지보수 하기도 좋다.
35. 클래스를 사용해서 클래스 정의하기
파이썬 클래스는 다음과 같이 정의된다.
class Athlete:
def __init__(self):
# The code to initialize an "Athlete" object.
def method1:
# The code for method1
def method2:
# ...
36. self의 중요성
a = Athlete()
는 다음과 같이 바뀐다.
Athlete.__init__(a)
앞서 def __init__(self): 라고 말하였는데 바로 타겟 식별자였던 a가 self에 들어가게 되었다.
바로 타겟 식별자가 self 인자에 대입되는 것을 볼 수 있다. 이것은 __init__ 에만 국한된 것이 아니다.
self 인자는 파이썬의 메소드 호출에서 어떤 객체에 적용해야 할지에 대한 정보를 저장하기 위해 사용된다.
클래스에 정의된 메소드는 모든 객체에 공유되지만 속성은 공유되지 않는다.
self 인자는 어떤 객체의 데이터를 처리해야 하는지 알 수 있게 해준다.
37. 모든 메소드의 첫 번째 인자는 self이다.
__init__() 만이 self를 첫 번째 인자로 요구하는 것은 아니라고 하였다. 클래스에서 정의된 모든 메소드가 self를 필요로 한다.
이렇게 생각하자. 파이썬에서 객체는 자기가 누군지 모른다.
self의 도움을 필요로 한다.
38. 파이썬에서도 너무나도 당연하게 클래스의 상속이 가능하다.
class NamedList(list):
def __init__ (self, a_name):
list.__init__([])
self.name = a_name
위와 같이 하면 우리가 새로 정의하는 NamedList라는 클래스는 파이썬 내장 list 클래스를 상속 받게된다.
39. 파이썬도 다중상속을 지원한다.
'Legacy > Python' 카테고리의 다른 글
[Django] 모델을 테이블로 만들기 (0) 2016.01.20 파이썬과 다른 언어들과의 비교 (0) 2015.06.22